Uart 接收

weixin_53288871發表於2020-12-18
  1. module uart_rx(clk,rst,s_data,data);  //分頻接收資料.波特率9600bps

  2. input clk,rst;

  3. input s_data;

  4. output [9:0] data;  

  5.  

  6. reg en;

  7. reg [1:0] t_data0,t_data1,t_data2,t_data3,t_data4,

  8.                t_data5,t_data6,t_data7,t_data8,t_data9;

  9. reg [9:0] data;

  10. reg [8:0] cnt;

  11. reg [7:0] cnt1;

  12. wire nedge;

  13. reg Q;

  14. reg Q1;

  15. // ==================================================

  16. //FSM

  17. //===================================================

  18.  

  19. parameter idle = 1'b0,

  20.                   trans = 1'b1;

  21.  

  22. reg [1:0]  present_state, next_state;

  23.  

  24. always@(posedge clk or negedge rst)

  25. begin

  26.     if(!rst)   present_state <= idle;

  27.     else      present_state <= next_state;

  28. end

  29.  

  30. always@(*)

  31. begin

  32.     case(present_state)

  33.     idle : if(nedge)

  34.                 next_state = trans;

  35.              else

  36.                 next_state = idle;

  37.     trans: if(cnt == 9'd324 && cnt1 == 8'd159)

  38.                   next_state = idle;

  39.                else

  40.                   next_state = trans;

  41.     endcase

  42. end

  43.  

  44. always@(posedge clk or negedge rst)

  45. begin

  46.      if(!rst)

  47.        en <= 1'b0;

  48.      else

  49.      begin

  50.           case(present_state)

  51.           idle : en <= 1'b0;

  52.           trans: en <= 1'b1;

  53.           endcase

  54.     end

  55. end

  56.  

  57. //================================================

  58.  

  59. always@(posedge clk or negedge rst)

  60. begin

  61.      if(!rst)

  62.         Q <= 1'b0;

  63.       else

  64.          Q <= s_data;

  65. end

  66.  

  67. always@(posedge clk or negedge rst)

  68. begin

  69.     if(!rst)

  70.        Q1 <= 1'b0;

  71.      else

  72.         Q1 <= Q;

  73. end

  74. //================================================

  75. // 邊緣檢測

  76. //================================================

  77.  

  78. assign nedge = Q1 & (~Q);   

  79.  

  80. //================================================

  81. // 分頻計數器

  82. //================================================

  83.  

  84. always@(posedge clk or negedge rst)

  85. begin

  86.     if(!rst)                         cnt <= 9'd0;

  87.     else if(en)

  88.     begin

  89.         if(cnt == 9'd324)    cnt <= 9'd0;

  90.         else                        cnt <= cnt + 9'd1;

  91.     end

  92.     else                            cnt <= cnt;

  93. end

  94.  

  95. always@(posedge clk or negedge rst)

  96. begin

  97.     if(!rst)                            cnt1 <= 8'd0;

  98.     else if(cnt == 9'd324)

  99.     begin

  100.         if(cnt1 == 8'd159)     cnt1 <= 8'd0;

  101.         else                           cnt1 <= cnt1 + 8'd1;

  102.     end

  103.     else                               cnt1 <= cnt1;

  104. end

  105.  

  106. //============================================

  107.  

  108. always@(posedge clk)

  109. begin

  110.     case(cnt1)

  111.     8'd8 : data[0] <= Q1;

  112.     8'd24 : data[1] <= Q1;

  113.     8'd40 : data[2] <= Q1;

  114.     8'd56 : data[3] <= Q1;

  115.     8'd72 : data[4] <= Q1;

  116.     8'd88 : data[5] <= Q1;

  117.     8'd104: data[6] <= Q1;

  118.     8'd120: data[7] <= Q1;

  119.     8'd136: data[8] <= Q1;

  120.     8'd152: data[9] <= Q1;

  121.     default:;

  122.     endcase

  123. end

  124. //===========================================

  125.  

  126. endmodule



待傳送資料din=1010101010,傳送資料dout依次為0101010101

相關文章