【提问】fpga试做与as608通信时的接收错误-Gowin-高云社区-FPGA CPLD-ChipDebug

提问fpga试做与as608通信时的接收错误

当我在设计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

 

请登录后发表评论

    没有回复内容