I2C 串口通訊協議

            

  1. //傳輸頻率為400k Hz
  2.  
  3. module I2C(
  4.   clk,
  5.   rst,
  6.   w_ctrl,       //control byte
  7.   w_h_addr, //address high byte
  8.   w_l_addr,  //address low byte
  9.   w_data,     //write data
  10.   r_ctrl,        //control byte
  11.   r_h_addr,  //address high byte
  12.   r_l_addr,   //address low byte
  13.   r_data,      //read data
  14.   scl,
  15.   sda
  16. );
  17.  
  18. input  clk,rst;
  19. input  [6:0] w_ctrl;
  20. input  [7:0] w_h_addr;
  21. input  [7:0] w_l_addr;
  22. input  [7:0] w_data;
  23. input  [6:0] r_ctrl;
  24. input  [7:0] r_h_addr;
  25. input  [7:0] r_l_addr;
  26. output [7:0] r_data;
  27. output scl;
  28. inout  sda;
  29.  
  30. reg [6:0] div_cnt;
  31. reg [3:0] bps_cnt;
  32. reg [7:0] reg_d;
  33. reg [7:0] in_d;
  34. reg [7:0] r_data;
  35. reg reg_sda;
  36. reg div_en;                 
  37. reg bps_en;                 
  38. reg sda_en;
  39. reg buf_sda;
  40. reg scl;
  41.  
  42. //=====================================================
  43. // 狀態機
  44. //=====================================================
  45.  
  46. parameter  [4:0]  W_START          = 5'd0,
  47.                              W_CTRL_B       = 5'd1,
  48.                              W_ACK0            = 5'd2,
  49.                              W_ADDR_H_B  = 5'd3,
  50.                              W_ACK1            = 5'd4,
  51.                              W_ADDR_L_B   = 5'd5,
  52.                              W_ACK2            = 5'd6,
  53.                              W_DATA            = 5'd7,
  54.                              W_ACK3            = 5'd8,
  55.                              W_STOP            = 5'd9,
  56.                              W_IDLE             = 5'd10,
  57.                              R_START0        = 5'd11,
  58.                              R_CTRL_B0     = 5'd12,
  59.                              R_ACK0           = 5'd13,
  60.                              R_ADDR_H_B  = 5'd14,
  61.                              R_ACK1           = 5'd15,
  62.                              R_ADDR_L_B  = 5'd16,
  63.                              R_ACK2            = 5'd17,
  64.                              R_START1        = 5'd18,
  65.                              R_CTRL_B1      = 5'd19,
  66.                              R_ACK3            = 5'd20,
  67.                              R_DATA             = 5'd21,
  68.                              R_NO_ACK       = 5'd22,
  69.                              R_STOP            = 5'd23,
  70.                              R_IDLE             = 5'd24;
  71.  
  72. reg [4:0] present_state, next_state;
  73.  
  74. always@(posedge clk or negedge rst)
  75. begin
  76.      if(!rst)  present_state <= W_START;
  77.      else      present_state <= next_state;
  78. end
  79.  
  80. always@(div_cnt or bps_cnt or present_state)
  81. begin
  82.     case(present_state)
  83.     W_START : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  84.                            next_state = W_CTRL_B;
  85.                         else   
  86.                             next_state = W_START;
  87.     W_CTRL_B : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  88.                               next_state = W_ACK0;
  89.                            else   
  90.                               next_state = W_CTRL_B;
  91.     W_ACK0 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  92.                           next_state = W_ADDR_H_B;
  93.                        else   
  94.                           next_state = W_ACK0;
  95.     W_ADDR_H_B : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  96.                                     next_state = W_ACK1;
  97.                                  else   
  98.                                     next_state = W_ADDR_H_B;
  99.     W_ACK1 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  100.                           next_state = W_ADDR_L_B;
  101.                        else   
  102.                           next_state = W_ACK1;
  103.     W_ADDR_L_B : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  104.                                     next_state = W_ACK2;
  105.                                  else   
  106.                                     next_state = W_ADDR_L_B;
  107.     W_ACK2 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  108.                           next_state = W_DATA;
  109.                        else   
  110.                           next_state = W_ACK2;
  111.     W_DATA : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  112.                           next_state = W_ACK3;
  113.                        else   
  114.                           next_state = W_DATA;
  115.     W_ACK3 : if(div_cnt == 7'd124 && bps_cnt == 4'd0) 
  116.                           next_state = W_STOP;
  117.                        else   
  118.                           next_state = W_ACK3;
  119.     W_STOP : if(div_cnt == 7'd124 && bps_cnt == 4'd1
  120.                           next_state = W_IDLE;
  121.                        else   
  122.                           next_state = W_STOP;
  123.     W_IDLE : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  124.                          next_state = R_START0;
  125.                      else   
  126.                          next_state = W_IDLE;
  127.     R_START0 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  128.                              next_state = R_CTRL_B0;
  129.                           else   
  130.                               next_state = R_START0;
  131.     R_CTRL_B0 : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  132.                                 next_state = R_ACK0;
  133.                              else   
  134.                                 next_state = R_CTRL_B0;
  135.     R_ACK0 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  136.                          next_state = R_ADDR_H_B;
  137.                       else   
  138.                          next_state = R_ACK0;
  139.     R_ADDR_H_B : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  140.                                    next_state = R_ACK1;
  141.                                 else   
  142.                                    next_state = R_ADDR_H_B;
  143.     R_ACK1 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  144.                          next_state = R_ADDR_L_B;
  145.                       else   
  146.                          next_state = R_ACK1;
  147.     R_ADDR_L_B : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  148.                                   next_state = R_ACK2;
  149.                                else   
  150.                                   next_state = R_ADDR_L_B;
  151.     R_ACK2 : if(div_cnt == 7'd124
  152.                          next_state = R_START1;
  153.                       else   
  154.                          next_state = R_ACK2;
  155.     R_START1 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  156.                              next_state = R_CTRL_B1;
  157.                           else   
  158.                              next_state = R_START1;
  159.     R_CTRL_B1 : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  160.                                next_state = R_ACK3;
  161.                             else   
  162.                                next_state = R_CTRL_B1;
  163.     R_ACK3 : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  164.                          next_state = R_DATA;
  165.                       else   
  166.                          next_state = R_ACK3;                
  167.     R_DATA : if(div_cnt == 7'd124 && bps_cnt == 4'd8
  168.                         next_state = R_NO_ACK;
  169.                      else   
  170.                         next_state = R_DATA;
  171.     R_NO_ACK : if(div_cnt == 7'd124 && bps_cnt == 4'd0
  172.                               next_state = R_STOP;
  173.                            else   
  174.                               next_state = R_NO_ACK;
  175.     R_STOP : if(div_cnt == 7'd124 && bps_cnt == 4'd1
  176.                          next_state = R_IDLE;
  177.                       else   
  178.                          next_state = R_STOP;
  179.     R_IDLE : next_state = R_IDLE;
  180.   default :;
  181.   endcase
  182. end
  183.  
  184. always@(posedge clk or negedge rst)
  185. begin
  186.     if(!rst) 
  187.     begin
  188.          div_en <= 1'b0;
  189.          bps_en <= 1'b0;
  190.          sda_en <= 1'b0;       
  191.          scl <=1'b0;
  192.     end
  193.     else
  194.     begin
  195.          case(present_state)
  196.          W_START : begin
  197.                                   div_en <= 1'b1;
  198.                                   bps_en <= 1'b1;
  199.                                   sda_en <= 1'b1;                 
  200.                                   scl <= 1'b1;
  201.                               end 
  202.          W_CTRL_B : begin
  203.                                     div_en <= 1'b1;
  204.                                     bps_en <= 1'b1;
  205.                                     sda_en <= 1'b1;                                  
  206.                                     scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  207.                                 end
  208.          W_ACK0 : begin
  209.                                 div_en <= 1'b1;
  210.                                 bps_en <= 1'b1;
  211.                                 sda_en <= 1'b0;
  212.                                 scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  213.                             end
  214.          W_ADDR_H_B: begin
  215.                                          div_en <= 1'b1;
  216.                                          bps_en <= 1'b1;
  217.                                          sda_en <= 1'b1;                                  
  218.                                          scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  219.                                      end
  220.          W_ACK1 : begin
  221.                                 div_en <= 1'b1;
  222.                                 bps_en <= 1'b1;
  223.                                 sda_en <= 1'b0;
  224.                                 scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  225.                             end
  226.          W_ADDR_L_B : begin
  227.                                          div_en <= 1'b1;
  228.                                          bps_en <= 1'b1;
  229.                                          sda_en <= 1'b1;                                  
  230.                                          scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  231.                                      end
  232.          W_ACK2 : begin
  233.                                 div_en <= 1'b1;
  234.                                 bps_en <= 1'b1;
  235.                                 sda_en <= 1'b0;
  236.                                 scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  237.                             end
  238.          W_DATA : begin
  239.                                 div_en <= 1'b1;
  240.                                 bps_en <= 1'b1;
  241.                                 sda_en <= 1'b1;                                  
  242.                                 scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  243.                             end
  244.          W_ACK3 : begin
  245.                                 div_en <= 1'b1;
  246.                                 bps_en <= 1'b1;
  247.                                 sda_en <= 1'b0;
  248.                                 scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  249.                             end
  250.          W_STOP : begin
  251.                                 div_en <= 1'b1;
  252.                                 bps_en <= 1'b1;
  253.                                 sda_en <= 1'b1;                 
  254.                                 scl <= 1'b1;
  255.                             end
  256.          W_IDLE : begin
  257.                               div_en <= 1'b1;
  258.                               bps_en <= 1'b1;
  259.                               da_en <= 1'b1;                 
  260.                               scl <= 1'b1;
  261.                           end
  262.          R_START0 : begin
  263.                                    div_en <= 1'b1;
  264.                                    bps_en <= 1'b1;
  265.                                    sda_en <= 1'b1;               
  266.                                    scl <= 1'b1;
  267.                                end 
  268.          R_CTRL_B0 : begin
  269.                                      div_en <= 1'b1;
  270.                                      bps_en <= 1'b1;
  271.                                      sda_en <= 1'b1;                                  
  272.                                      scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  273.                                  end
  274.          R_ACK0 : begin
  275.                                div_en <= 1'b1;
  276.                                bps_en <= 1'b1;
  277.                                sda_en <= 1'b0;
  278.                                scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  279.                            end
  280.          R_ADDR_H_B : begin
  281.                                          div_en <= 1'b1;
  282.                                          bps_en <= 1'b1;
  283.                                          sda_en <= 1'b1;                                  
  284.                                          scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  285.                                      end
  286.          R_ACK1 : begin
  287.                                div_en <= 1'b1;
  288.                                bps_en <= 1'b1;
  289.                                sda_en <= 1'b0;
  290.                                scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  291.                            end
  292.          R_ADDR_L_B : begin
  293.                                         div_en <= 1'b1;
  294.                                         bps_en <= 1'b1;
  295.                                         sda_en <= 1'b1;                                  
  296.                                         scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  297.                                     end
  298.          R_ACK2 : begin
  299.                                div_en <= 1'b1;
  300.                                bps_en <= 1'b0;
  301.                                sda_en <= 1'b0;
  302.                                scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  303.                            end
  304.          R_START1 : begin
  305.                                    div_en <= 1'b1;
  306.                                    bps_en <= 1'b1;
  307.                                    sda_en <= 1'b1;                
  308.                                    scl <= 1'b1;
  309.                                end
  310.          R_CTRL_B1 : begin
  311.                                      div_en <= 1'b1;
  312.                                      bps_en <= 1'b1;
  313.                                      sda_en <= 1'b1;                                  
  314.                                      scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  315.                                  end
  316.          R_ACK3 : begin
  317.                                div_en <= 1'b1;
  318.                                bps_en <= 1'b1;
  319.                                sda_en <= 1'b0;
  320.                                scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  321.                            end
  322.          R_DATA : begin
  323.                               div_en <= 1'b1;
  324.                               bps_en <= 1'b1;
  325.                               sda_en <= 1'b0;
  326.                               scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  327.                           end
  328.          R_NO_ACK : begin
  329.                                     div_en <= 1'b1;
  330.                                     bps_en <= 1'b1;
  331.                                     sda_en <= 1'b0;
  332.                                     scl <= (7'd31 < div_cnt && div_cnt < 7'd93) ? 1'b1 : 1'b0;
  333.                                 end
  334.          R_STOP : begin
  335.                                div_en <= 1'b1;
  336.                                bps_en <= 1'b1;
  337.                                sda_en <= 1'b1;                 
  338.                                scl <= 1'b1;
  339.                            end
  340.          R_IDLE : begin
  341.                              div_en <= 1'b0;
  342.                              bps_en <= 1'b0;
  343.                              sda_en <= 1'b1;                 
  344.                              scl <= 1'b1;
  345.                          end                
  346.          default :;
  347.          endcase
  348.          end
  349. end
  350.  
  351. //=====================================================
  352. //分頻計數器
  353. //=====================================================
  354.  
  355. always@(posedge clk or negedge rst)   
  356. begin
  357.     if(!rst)                                div_cnt <= 7'd0;
  358.     else if(div_en)
  359.     begin
  360.         if(div_cnt == 7'd124)    div_cnt <= 7'd0;
  361.         else                               div_cnt <= div_cnt + 7'd1;
  362.     end 
  363.     else                                   div_cnt <= 7'd0;
  364. end
  365.  
  366. always@(posedge clk or negedge rst)   
  367. begin
  368.     if(!rst)                                  bps_cnt <= 4'd0;
  369.     else if(bps_en)
  370.     begin
  371.         if(div_cnt == 7'd124)
  372.         begin
  373.             if(bps_cnt == 4'd8)     bps_cnt <= 4'd0;
  374.             else                              bps_cnt <= bps_cnt + 4'd1;
  375.         end
  376.         else                                  bps_cnt <= bps_cnt;
  377.     end
  378.     else                                     bps_cnt <= 4'd0;
  379. end 
  380.  
  381. //=====================================================
  382. // reg_sda
  383. //=====================================================
  384.  
  385. always@(posedge clk or negedge rst)
  386. begin
  387.     if(!rst)
  388.        reg_sda <= 0;
  389.     else if(present_state == W_START || present_state == R_START0 || present_state == R_START1)
  390.     begin
  391.         if(div_cnt < 7'd62)
  392.            reg_sda <= 1'b1;
  393.         else
  394.            reg_sda <= 1'b0;
  395.     end
  396.     else if(present_state == W_CTRL_B)
  397.     begin
  398.         case(bps_cnt)
  399.         4'd1 : reg_sda <= w_ctrl[6];
  400.         4'd2 : reg_sda <= w_ctrl[5];
  401.         4'd3 : reg_sda <= w_ctrl[4];
  402.         4'd4 : reg_sda <= w_ctrl[3];
  403.         4'd5 : reg_sda <= w_ctrl[2];
  404.         4'd6 : reg_sda <= w_ctrl[1];
  405.         4'd7 : reg_sda <= w_ctrl[0];
  406.         4'd8 : reg_sda <= 1'b0;
  407.         default :;
  408.         endcase
  409.     end
  410.     else if(present_state == W_ADDR_H_B) 
  411.     begin
  412.         case(bps_cnt)
  413.         4'd1 : reg_sda <= w_h_addr[7];
  414.         4'd2 : reg_sda <= w_h_addr[6];
  415.         4'd3 : reg_sda <= w_h_addr[5];
  416.         4'd4 : reg_sda <= w_h_addr[4];
  417.         4'd5 : reg_sda <= w_h_addr[3];
  418.         4'd6 : reg_sda <= w_h_addr[2];
  419.         4'd7 : reg_sda <= w_h_addr[1];
  420.         4'd8 : reg_sda <= w_h_addr[0];
  421.         default :;
  422.         endcase   
  423.     end
  424.     else if(present_state == W_ADDR_L_B) 
  425.     begin
  426.         case(bps_cnt)
  427.         4'd1 : reg_sda <= w_l_addr[7];
  428.         4'd2 : reg_sda <= w_l_addr[6];
  429.         4'd3 : reg_sda <= w_l_addr[5];
  430.         4'd4 : reg_sda <= w_l_addr[4];
  431.         4'd5 : reg_sda <= w_l_addr[3];
  432.         4'd6 : reg_sda <= w_l_addr[2];
  433.         4'd7 : reg_sda <= w_l_addr[1];
  434.         4'd8 : reg_sda <= w_l_addr[0];
  435.         default :;
  436.         endcase     
  437.     end
  438.     else if(present_state == W_DATA) 
  439.     begin
  440.         case(bps_cnt)
  441.         4'd1 : reg_sda <= w_data[7];
  442.         4'd2 : reg_sda <= w_data[6];
  443.         4'd3 : reg_sda <= w_data[5];
  444.         4'd4 : reg_sda <= w_data[4];
  445.         4'd5 : reg_sda <= w_data[3];
  446.         4'd6 : reg_sda <= w_data[2];
  447.         4'd7 : reg_sda <= w_data[1];
  448.         4'd8 : reg_sda <= w_data[0];
  449.         default :;
  450.         endcase     
  451.     end
  452.     else if(present_state == R_CTRL_B0) 
  453.     begin
  454.         case(bps_cnt)
  455.         4'd1 : reg_sda <= r_ctrl[6];
  456.         4'd2 : reg_sda <= r_ctrl[5];
  457.         4'd3 : reg_sda <= r_ctrl[4];
  458.         4'd4 : reg_sda <= r_ctrl[3];
  459.         4'd5 : reg_sda <= r_ctrl[2];
  460.         4'd6 : reg_sda <= r_ctrl[1];
  461.         4'd7 : reg_sda <= r_ctrl[0];
  462.         4'd8 : reg_sda <= 1'b0;
  463.         default :;
  464.         endcase    
  465.     end
  466.     else if(present_state == R_ADDR_H_B) 
  467.     begin
  468.         case(bps_cnt)
  469.         4'd1 : reg_sda <= r_h_addr[7];
  470.         4'd2 : reg_sda <= r_h_addr[6];
  471.         4'd3 : reg_sda <= r_h_addr[5];
  472.         4'd4 : reg_sda <= r_h_addr[4];
  473.         4'd5 : reg_sda <= r_h_addr[3];
  474.         4'd6 : reg_sda <= r_h_addr[2];
  475.         4'd7 : reg_sda <= r_h_addr[1];
  476.         4'd8 : reg_sda <= r_h_addr[0];
  477.         default :;
  478.         endcase    
  479.     end 
  480.     else if(present_state == R_ADDR_L_B) 
  481.     begin
  482.         case(bps_cnt)
  483.         4'd1 : reg_sda <= r_l_addr[7];
  484.         4'd2 : reg_sda <= r_l_addr[6];
  485.         4'd3 : reg_sda <= r_l_addr[5];
  486.         4'd4 : reg_sda <= r_l_addr[4];
  487.         4'd5 : reg_sda <= r_l_addr[3];
  488.         4'd6 : reg_sda <= r_l_addr[2];
  489.         4'd7 : reg_sda <= r_l_addr[1];
  490.         4'd8 : reg_sda <= r_l_addr[0];
  491.         default :;
  492.         endcase     
  493.     end
  494.     else if(present_state == R_CTRL_B1) 
  495.     begin
  496.         case(bps_cnt)
  497.         4'd1 : reg_sda <= r_ctrl[6];
  498.         4'd2 : reg_sda <= r_ctrl[5];
  499.         4'd3 : reg_sda <= r_ctrl[4];
  500.         4'd4 : reg_sda <= r_ctrl[3];
  501.         4'd5 : reg_sda <= r_ctrl[2];
  502.         4'd6 : reg_sda <= r_ctrl[1];
  503.         4'd7 : reg_sda <= r_ctrl[0];
  504.         4'd8 : reg_sda <= 1'b1;
  505.         default :;
  506.         endcase    
  507.     end
  508.     else if(present_state == W_STOP || present_state == R_STOP) 
  509.     begin
  510.     if(div_cnt < 7'd62)
  511.         reg_sda <= 1'b0;
  512.     else
  513.         reg_sda <= 1'b1;    
  514.     end
  515.     else if(present_state == W_IDLE || present_state == R_IDLE)   
  516.         reg_sda <= 1'b1;     
  517.     else
  518.         reg_sda <= reg_sda;  
  519. end
  520.  
  521. //=====================================================
  522. // r_data
  523. //=====================================================
  524.  
  525. always@(posedge clk or negedge rst)
  526. begin
  527.     if(!rst)      
  528.        r_data <= 0;
  529.     else if(present_state == R_DATA) 
  530.     begin
  531.         case(bps_cnt)
  532.         4'd1 : r_data[7] <= sda;
  533.         4'd2 : r_data[6] <= sda;
  534.         4'd3 : r_data[5] <= sda;
  535.         4'd4 : r_data[4] <= sda;
  536.         4'd5 : r_data[3] <= sda;
  537.         4'd6 : r_data[2] <= sda;
  538.         4'd7 : r_data[1] <= sda;
  539.         4'd8 : r_data[0] <= sda;
  540.         default :;
  541.         endcase    
  542.     end
  543.     else
  544.         r_data <= r_data;
  545. end
  546.  
  547. //=====================================================
  548. //三態閘
  549. //=====================================================
  550.  
  551. assign sda = sda_en ? reg_sda : 1'bz;
  552.  
  553. //=====================================================
  554.  
  555. endmodule


  1. `timescale 1ns/1ps
  2.  
  3. module I2C_test1;
  4. reg  clk;
  5. reg  rst;
  6. reg  [6:0] w_ctrl;
  7. reg  [7:0] w_h_addr;
  8. reg  [7:0] w_l_addr;
  9. reg  [7:0] w_data;
  10. reg  [6:0] r_ctrl;
  11. reg  [7:0] r_h_addr;
  12. reg  [7:0] r_l_addr;
  13. wire [7:0] r_data;
  14. wire scl;
  15. wire sda;
  16.  
  17. I2C I2C(
  18.     .clk(clk),
  19.     .rst(rst),
  20.     .w_ctrl(w_ctrl),
  21.     .w_h_addr(w_h_addr),
  22.     .w_l_addr(w_l_addr),  
  23.     .w_data(w_data),
  24.     .r_ctrl(r_ctrl),
  25.     .r_h_addr(r_h_addr),
  26.     .r_l_addr(r_l_addr),  
  27.     .r_data(r_data),
  28.     .scl(scl),
  29.     .sda(sda)
  30. );
  31.  
  32. // EEPROM仿真模型
  33. M24LC64 M24LC64(
  34.     .A0(1'b0),
  35.     .A1(1'b0),
  36.     .A2(1'b0),
  37.     .WP(1'b0),
  38.     .SDA(sda),
  39.     .SCL(scl),
  40.     .RESET(!rst)
  41. );
  42.  
  43. initial
  44. begin
  45.     clk = 1'b1;
  46.     forever #10 clk = ~clk;
  47. end
  48.  
  49. initial
  50. begin
  51.     #0  
  52.     rst = 1'b0
  53.     w_ctrl = 7'b101_0000;
  54.     w_h_addr = 8'b0000_0000;
  55.     w_l_addr = 8'b0000_0001;
  56.     w_data = 8'b11000101
  57.     #1  
  58.     rst = 1'b1;
  59.     r_ctrl = 7'b101_0000
  60.     r_h_addr = 8'b0000_0000;
  61.     r_l_addr = 8'b0000_0001;
  62.     #1000000
  63.     $stop;
  64.     #10 
  65.     $finish;
  66. end
  67.  
  68. endmodule


因EEPROM仿真模型與真實器件相同,當輸出為高電平時設置為高阻態,寫入數據為11000101,輸出數據為zz000z0z,故

輸出正確!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值