关于黑金的资料中串口接收程序的一个问题 希望得到解答

2019-07-15 21:26发布

  1. module uart_rx
  2. (
  3.         input clk,
  4.         input rst_n,
  5.         input rxd,
  6.         output reg[7:0] rx_data,
  7.         output reg rx_data_en
  8. );
  9. parameter S_IDLE   = 4'd0;
  10. parameter S_START  = 4'd1;
  11. parameter S_BIT0   = 4'd2;
  12. parameter S_BIT1   = 4'd3;
  13. parameter S_BIT2   = 4'd4;
  14. parameter S_BIT3   = 4'd5;
  15. parameter S_BIT4   = 4'd6;
  16. parameter S_BIT5   = 4'd7;
  17. parameter S_BIT6   = 4'd8;
  18. parameter S_BIT7   = 4'd9;
  19. parameter S_STOP   = 4'd10;

  20. reg rxd_d0;
  21. reg rxd_d1;

  22. reg[3:0] state;

  23. reg[15:0] bit_cnt;

  24. wire rxd_negedge;
  25. assign rxd_negedge = rxd_d1 & ~rxd_d0;

  26. always@(posedge clk or negedge rst_n)
  27. begin
  28.         if(~rst_n)
  29.         begin
  30.                 rxd_d0 <= 1'b0;
  31.                 rxd_d1 <= 1'b0;
  32.         end
  33.         else
  34.         begin
  35.                 rxd_d0 <= rxd;
  36.                 rxd_d1 <= rxd_d0;
  37.         end
  38. end

  39. always@(posedge clk or negedge rst_n)
  40. begin
  41.         if(~rst_n)
  42.         begin
  43.                 state <= S_IDLE;
  44.                 rx_data <= 8'd0;
  45.                 rx_data_en <= 1'b0;
  46.         end
  47.         else
  48.         begin
  49.                 case(state)
  50.                         S_IDLE:
  51.                         begin
  52.                                 if(rxd_negedge)
  53.                                         state <= S_START;
  54.                         end
  55.                         S_START:
  56.                         begin
  57.                                 if(<font color="#ff0000">bit_cnt </font>== 16'd5208)
  58.                                 begin
  59.                                         state <= S_BIT0;
  60. <font color="#ff0000">                                        bit_cnt </font><= 16'd0;
  61.                                 end
  62.                                 else
  63.                                 begin
  64. <font color="#ff0000">                                        bit_cnt </font><= <div class="blockcode"><blockquote>bit_cnt
复制代码
+ 16'd1;
                                end
                        end
                       
                        S_BIT0:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT1;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[0] <= rxd_d1;
                        end

                        S_BIT1:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT2;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[1] <= rxd_d1;
                        end

                        S_BIT2:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT3;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[2] <= rxd_d1;
                        end

                        S_BIT3:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT4;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[3] <= rxd_d1;
                        end

                        S_BIT4:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT5;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[4] <= rxd_d1;
                        end

                        S_BIT5:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT6;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[5] <= rxd_d1;
                        end

                        S_BIT6:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_BIT7;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[6] <= rxd_d1;
                        end

                        S_BIT7:
                        begin
                                if(bit_cnt == 16'd5208)
                                begin
                                        state <= S_STOP;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if(bit_cnt == 16'd2604)
                                        rx_data[7] <= rxd_d1;
                        end

                        S_STOP:
                        begin
                                if(bit_cnt == 16'd2604 )
                                begin
                                        state <= S_IDLE;
                                        bit_cnt <= 16'd0;
                                end
                                else
                                begin
                                        bit_cnt <= bit_cnt + 16'd1;
                                end
                               
                                if((bit_cnt == 16'd1302) & rxd_d1)
                                        rx_data_en <= 1'b1;
                                else
                                        rx_data_en <= 1'b0;
                        end
                       
                        default:
                                state <= S_IDLE;
                               
                endcase
        end
end
endmodule

这个程序中的计数器cnt_bit  并没有在什么条件下开始计数 ,  是我理解有问题还是程序存在问题 ,  cnt_bit 应该在什么条件下开始计数呢??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
chenwei6991627
1楼-- · 2019-07-15 21:55
 精彩回答 2  元偷偷看……
黑桃ACE
2楼-- · 2019-07-16 00:34
上面有个下降沿检测,当检测到下降沿是就开始数据采样了,
shel_don
3楼-- · 2019-07-16 00:35
你首先要弄懂16'd5208怎么来的,这个涉及到波特率的设置,这里其实每次累计到16'd5208就传送一位数据,然后清零继续累计传送下一位,直到传送结。

一周热门 更多>