当我在设计uart的接收模块时,发现接收完成后,数据会比原来的正确数据包每字节都少1,比如正确应该是8‘h7,但接收到数据时却是8‘h06,这是为什么呢,有大佬进行指导吗?谢谢啦
// 波特率生�? ==================================
localparam BAUD_TICKS = CLK_FREQ / BAUD_RATE; // 波特率分频系数,每个波特率周期对应多少个时钟周期
localparam BAUD_SANER = 3*(CLK_FREQ / BAUD_RATE)/5;
reg [15:0] rx_baud_counter;
reg [15:0] tx_baud_counter;
wire rx_baud_tick = (rx_baud_counter == BAUD_TICKS - 1); // 波特率时钟标�?
wire tx_baud_tick = (tx_baud_counter == BAUD_TICKS - 1); // 波特率时钟标�?
reg rx_baud_en;
reg tx_baud_en;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
rx_baud_counter <= 0;
else if(rx_baud_en)
rx_baud_counter <= rx_baud_tick ? 1'b0 : rx_baud_counter + 1'b1; // 计数器循环:达到�?大�?�时归零,否�?+1
else
rx_baud_counter <= 0;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
tx_baud_counter <= 0;
else if(tx_baud_en)
tx_baud_counter <= tx_baud_tick ? 1'b0 : tx_baud_counter + 1'b1; // 计数器循环:达到�?大�?�时归零,否�?+1
else
tx_baud_counter <= 0;
end
reg [3:0] tx_start_fs ; //????????
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
tx_start_fs <= 0;
else
tx_start_fs = {tx_start_fs[2:0],tx_start};
end
localparam RX_IDLE = 2'b00; // 接收空闲�?
localparam RX_START = 2'b01; // 接收�?测起始位
localparam RX_DATA = 2'b10; // 接收数据�?
localparam RX_STOP = 2'b11; // 接收停止�?
reg [1:0] rx_state; // 接收状�?�机�?4状�?�)
reg [15:0] rx_ticks; // 位内采样计数器(0-15,16倍过采样�?
reg [2:0] rx_bit_idx; // 已接收数据位索引�?0-7�?
reg [7:0] rx_reg; // 接收数据暂存寄存�?
reg rxd_sync1, rxd_sync2;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) {rxd_sync1, rxd_sync2} <= 2'b11;
else {rxd_sync1, rxd_sync2} <= {rxd, rxd_sync1};
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rx_state <= RX_IDLE;
rx_valid <= 1'b0; // 清除数据有效标志
rx_baud_en <= 1'b0; // 波特率计数使�?
rx_done <= 1'b0;
rx_ticks <= 16'b0;
rx_bit_idx <= 3'b0;
rx_reg <= 8'b0;
rx_data <= 8'd3;
end else begin
rx_valid <= 1'b0; // 默认无效,仅接收成功时置1
rx_done <= 1'b0;
case (rx_state)
RX_IDLE: begin // 空闲,等待起始位
if (!rxd) begin // �?测起始位下降�?
rx_state <= RX_START;
rx_baud_en <= 1'b1;
end else begin
rx_ticks <= 0; //重置采样计数�?
rx_baud_en <= 1'b0;
end
end
RX_START: begin // 验证起始位,防抖�?
if (!rx_baud_tick) begin
if (rx_ticks == BAUD_SANER) begin // 在起始位中点采样
if (!rxd_sync2) begin
rx_state <= RX_DATA;
rx_baud_en <= 1'b1;
rx_bit_idx <= 0; //数据位从0�?�?
rx_ticks <= 0;
end else
rx_state <= RX_IDLE;
end else
rx_ticks <= rx_ticks + 1'b1;
end else rx_ticks <= 0;
end
RX_DATA: begin // 接收8位数�?
if (!rx_baud_tick) begin
if (rx_ticks == BAUD_SANER) begin // 数据位中点采�?
rx_reg[rx_bit_idx] <= rxd_sync2; // 锁存当前数据
rx_ticks <= 0;
if (rx_bit_idx == DATA_BITS-1'b1) // 是否接收�?8位数据?
rx_state <= RX_STOP;
else
rx_bit_idx <= rx_bit_idx + 1'b1; // 继续接收下一�?
end else
rx_ticks <= rx_ticks + 1'b1;
end else
rx_ticks <= 0;
end
RX_STOP: begin // 处理停止�?
if(!rx_baud_tick) begin
if (rx_ticks == BAUD_SANER) begin // 数据位中点采�?
rx_valid <= 1'b1; // 接收数据有效
rx_done <= 1'b1;
rx_state <= RX_IDLE;
rx_baud_en <= 1'b0;
rx_ticks <= 0;
rx_data <= rx_reg; // 数据更新
end else
rx_ticks <= rx_ticks + 1'b1;
end else
rx_ticks <= 0;
end
endcase
end
end
没有回复内容