[CPLD] CPLD驱动PCF8591ADC采样老是零

[复制链接]
 楼主| 比神乐 发表于 2023-4-29 13:11 | 显示全部楼层 |阅读模式
我买了一个PCF8591模块,用单片机是正常的。
我写了一个CPLD读PCF8591的ADC值的程序,可是读出来老是零。
代码如下:
  1. module i2c(clk,rst,scl,sda,lcd_en ,
  2.                 lcd_rw ,  //��Ϊִֻ��д������������ԶΪ0.
  3.                 lcd_rs ,
  4.                 lcd_data,led1,led2,led3,led4,adc_data);

  5. input clk,rst;
  6. output scl;
  7. inout  sda;
  8. output led1,led2,led3,led4;
  9. output adc_data;


  10. output       lcd_en ;
  11. output       lcd_rw ;
  12. output       lcd_rs ;
  13. output [7:0] lcd_data;


  14. reg scl;
  15. reg adc_data;
  16. reg ledn1,ledn2,ledn3,ledn4;

  17. reg[23:0] cnt_scan;
  18. reg sda_buf;
  19. reg link;  
  20. reg phase0,phase1,phase2,phase3;

  21. reg[7:0] clk_div;
  22. reg[1:0] main_state;
  23. reg[3:0] i2c_state;
  24. reg[3:0] inner_state;
  25. reg[19:0] cnt_delay;
  26. reg start_delaycnt;
  27. reg[7:0] readData_reg;
  28. reg[7:0] addr;

  29. //--------------------------------------------
  30.                 //按键检测

  31. reg[19:0] cnt_20ms;        //20ms计数寄存器

  32. always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk or negedge rst)
  33.         if(!rst) cnt_20ms <= 20'd0;
  34.         else cnt_20ms <= cnt_20ms+1'b1;        //不断计数


  35. parameter div_parameter=100;

  36. parameter  start=4'b0000,
  37.                           first=4'b0001,
  38.                           second=4'b0010,
  39.                           third=4'b0011,
  40.                           fourth=4'b0100,
  41.                           fifth=4'b0101,
  42.                           sixth=4'b0110,
  43.                           seventh=4'b0111,
  44.                           eighth=4'b1000,
  45.                           ack=4'b1001,   
  46.                           stop=4'b1010;
  47.                
  48. parameter ini=4'b0000,
  49.                   sendaddr=4'b0001,
  50.                   //write_data=3'b010,
  51.                   read_data=4'b0010,
  52.                   read_ini=4'b0011,
  53.                   read_s1=4'b0100,
  54.                   read_s2=4'b0101,
  55.                   read_s3=4'b0110,
  56.                   read_s4=4'b0111,
  57.                   read_s5=4'b1000,
  58.                   read_s6=4'b1001,
  59.                   read_s7=4'b1010,
  60.                   read_s8=4'b1011,
  61.                   read_s9=4'b1100,
  62.                   read_s10=4'b1101,
  63.                   read_s11=4'b1110,
  64.                   read_s12=4'b1111;



  65.           
  66.                   
  67. wire         lcd_en ;
  68. wire         lcd_rw;
  69. reg  [7:0]   lcd_data;
  70. reg          lcd_rs  ;
  71. reg [5:0]    c_state ;
  72. reg [5:0]    n_state ;
  73. wire  [127:0]  row_1;
  74. wire  [127:0]  row_2;
  75. //reg[7:0] dis_data=0;

  76. assign row_1 [127:120]=8'h30+adc_data/100;
  77. assign row_1 [119:112]=8'h30+adc_data%100/10;
  78. assign row_1 [111:104]=8'h30+adc_data%10;
  79. assign row_1 [103:96]=8'h20;
  80. assign row_1 [95:88]=8'h20;
  81. assign row_1 [87:80]=8'h20;
  82. assign row_1 [79:72]=8'h20;
  83. assign row_1 [71:64]=8'h20;
  84. assign row_1 [63:56]=8'h20;
  85. assign row_1 [55:48]=8'h20;
  86. assign row_1 [47:40]=8'h41;
  87. assign row_1 [39:32]=8'h42;
  88. assign row_1 [31:24]=8'h43;
  89. assign row_1 [23:16]=8'h44;
  90. assign row_1 [15:8]=8'h45;
  91. assign row_1 [7:0]=8'h46;
  92. //assign row_1 ="                " ;  //��һ����ʾ������
  93. assign row_2 ="happy everyday !";  //�ڶ�����ʾ������
  94. //----------------------------------------------------------------------
  95. //initialize
  96. //first step is waitng more than 20 ms. �����ֲ�Ҫ���ģ�Ŀ���ǵȴ�ϵͳ�ϵ��ȶ���
  97. parameter TIME_20MS = 1000_000 ; //20000000/20=1000_000
  98. parameter TIME_200MS = 1000_0000_0 ; //20000000/20=1000_000
  99. //parameter TIME_15MS = 9'h100 ; //just for test
  100. parameter TIME_500HZ= 100_000  ; //
  101. //parameter TIME_500HZ= 4'hf;  //just for test
  102. //use gray code   
  103. parameter         IDLE=    8'h00  ;  //��Ϊ��״̬��һ����40��״̬�������������˸����룬һ��ֻ��1λ�����ı䡣00 01 03 02                     
  104. parameter SET_FUNCTION=    8'h01  ;      
  105. parameter     DISP_OFF=    8'h03  ;
  106. parameter   DISP_CLEAR=    8'h02  ;
  107. parameter   ENTRY_MODE=    8'h06  ;
  108. parameter   DISP_ON   =    8'h07  ;
  109. parameter    ROW1_ADDR=    8'h05  ;      
  110. parameter       ROW1_0=    8'h04  ;
  111. parameter       ROW1_1=    8'h0C  ;
  112. parameter       ROW1_2=    8'h0D  ;
  113. parameter       ROW1_3=    8'h0F  ;
  114. parameter       ROW1_4=    8'h0E  ;
  115. parameter       ROW1_5=    8'h0A  ;
  116. parameter       ROW1_6=    8'h0B  ;
  117. parameter       ROW1_7=    8'h09  ;
  118. parameter       ROW1_8=  8'h08  ;
  119. parameter       ROW1_9=    8'h18  ;
  120. parameter       ROW1_A=    8'h19  ;
  121. parameter       ROW1_B=    8'h1B  ;
  122. parameter       ROW1_C=    8'h1A  ;
  123. parameter       ROW1_D=    8'h1E  ;
  124. parameter       ROW1_E=    8'h1F  ;
  125. parameter       ROW1_F=    8'h1D  ;

  126. parameter    ROW2_ADDR=    8'h1C  ;
  127. parameter       ROW2_0=    8'h14  ;
  128. parameter       ROW2_1=    8'h15  ;
  129. parameter       ROW2_2=    8'h17  ;
  130. parameter       ROW2_3=    8'h16  ;
  131. parameter       ROW2_4=    8'h12  ;
  132. parameter       ROW2_5=    8'h13  ;
  133. parameter       ROW2_6=    8'h11  ;
  134. parameter       ROW2_7=    8'h10  ;
  135. parameter       ROW2_8=    8'h30  ;
  136. parameter       ROW2_9=    8'h31  ;
  137. parameter       ROW2_A=    8'h33  ;
  138. parameter       ROW2_B=    8'h32  ;
  139. parameter       ROW2_C=    8'h36  ;
  140. parameter       ROW2_D=    8'h37  ;
  141. parameter       ROW2_E=    8'h35  ;
  142. parameter       ROW2_F=    8'h34  ;


  143. //20ms�ļ��������ʼ����һ��
  144. reg [19:0] cnt_20ms1 ;
  145. always  @(posedge clk or negedge rst)begin
  146.     if(rst==1'b0)begin
  147.         cnt_20ms1<=0;
  148.     end
  149.     else if(cnt_20ms1 == TIME_20MS -1)begin
  150.         cnt_20ms1<=cnt_20ms1;
  151.     end
  152.     else
  153.         cnt_20ms1<=cnt_20ms1 + 1 ;
  154. end
  155. wire delay_done = (cnt_20ms1==TIME_20MS-1)? 1'b1 : 1'b0 ;
  156. //----------------------------------------------------------------------
  157. //500ns  �����Ƿ�Ƶ����ΪLCD1602�Ĺ���Ƶ����500HZ,��FPGA��50Mhz,����Ҫ��Ƶ
  158. reg [19:0] cnt_500hz;
  159. always  @(posedge clk or negedge rst)begin
  160.     if(rst==1'b0)begin
  161.         cnt_500hz <= 0;
  162.     end
  163.     else if(delay_done==1)begin
  164.         if(cnt_500hz== TIME_500HZ - 1)
  165.             cnt_500hz<=0;
  166.         else
  167.             cnt_500hz<=cnt_500hz + 1 ;
  168.     end
  169.     else
  170.         cnt_500hz<=0;
  171. end

  172. //20ms�ļ��������ʼ����һ��
  173. reg [28:0] cnt_200ms ;
  174. always  @(posedge clk or negedge rst)begin
  175.     if(rst==1'b0)begin
  176.         cnt_200ms<=0;
  177.     end
  178.     else if(cnt_200ms == TIME_200MS -1)begin
  179.         cnt_200ms<=0;

  180.     end
  181.     else
  182.         cnt_200ms<=cnt_200ms + 1 ;
  183. end

  184. assign lcd_en = (cnt_500hz>(TIME_500HZ-1)/2)? 1'b0 : 1'b1;  //�½���
  185. assign write_flag = (cnt_500hz==TIME_500HZ - 1) ? 1'b1 : 1'b0 ;

  186. //set_function ,display off ��display clear ,entry mode set
  187. //----------------------------------------------------------------------״̬��
  188. always  @(posedge clk or negedge rst)begin
  189.     if(rst==1'b0)begin
  190.         c_state <= IDLE    ;
  191.     end
  192.     else if(write_flag==1) begin
  193.         c_state<= n_state  ;
  194.     end
  195.     else
  196.         c_state<=c_state   ;
  197. end

  198. always  @(*)begin
  199.     case (c_state)
  200.         IDLE: n_state = SET_FUNCTION ;
  201. SET_FUNCTION: n_state = DISP_OFF     ;
  202.     DISP_OFF: n_state = DISP_CLEAR   ;
  203.   DISP_CLEAR: n_state = ENTRY_MODE   ;
  204.   ENTRY_MODE: n_state = DISP_ON      ;
  205.   DISP_ON   : n_state = ROW1_ADDR    ;
  206.    ROW1_ADDR: n_state = ROW1_0       ;
  207.       ROW1_0: n_state = ROW1_1       ;
  208.       ROW1_1: n_state = ROW1_2       ;
  209.       ROW1_2: n_state = ROW1_3       ;
  210.       ROW1_3: n_state = ROW1_4       ;
  211.       ROW1_4: n_state = ROW1_5       ;
  212.       ROW1_5: n_state = ROW1_6       ;
  213.       ROW1_6: n_state = ROW1_7       ;
  214.       ROW1_7: n_state = ROW1_8       ;
  215.       ROW1_8: n_state = ROW1_9       ;
  216.       ROW1_9: n_state = ROW1_A       ;
  217.       ROW1_A: n_state = ROW1_B       ;
  218.       ROW1_B: n_state = ROW1_C       ;
  219.       ROW1_C: n_state = ROW1_D       ;
  220.       ROW1_D: n_state = ROW1_E       ;
  221.       ROW1_E: n_state = ROW1_F       ;
  222.       ROW1_F: n_state = ROW2_ADDR    ;

  223.    ROW2_ADDR: n_state = ROW2_0       ;
  224.       ROW2_0: n_state = ROW2_1       ;
  225.       ROW2_1: n_state = ROW2_2       ;
  226.       ROW2_2: n_state = ROW2_3       ;
  227.       ROW2_3: n_state = ROW2_4       ;
  228.       ROW2_4: n_state = ROW2_5       ;
  229.       ROW2_5: n_state = ROW2_6       ;
  230.       ROW2_6: n_state = ROW2_7       ;
  231.       ROW2_7: n_state = ROW2_8       ;
  232.       ROW2_8: n_state = ROW2_9       ;
  233.       ROW2_9: n_state = ROW2_A       ;
  234.       ROW2_A: n_state = ROW2_B       ;
  235.       ROW2_B: n_state = ROW2_C       ;
  236.       ROW2_C: n_state = ROW2_D       ;
  237.       ROW2_D: n_state = ROW2_E       ;
  238.       ROW2_E: n_state = ROW2_F       ;
  239.       ROW2_F: n_state = ROW1_ADDR    ;
  240.      default: n_state = n_state      ;
  241.    endcase
  242.    end   

  243.    assign lcd_rw = 0;
  244.    always  @(posedge clk or negedge rst)begin
  245.        if(rst==1'b0)begin
  246.            lcd_rs <= 0 ;   //order or data  0: order 1:data
  247.        end
  248.        else if(write_flag == 1)begin
  249.            if((n_state==SET_FUNCTION)||(n_state==DISP_OFF)||
  250.               (n_state==DISP_CLEAR)||(n_state==ENTRY_MODE)||
  251.               (n_state==DISP_ON ) ||(n_state==ROW1_ADDR)||
  252.               (n_state==ROW2_ADDR))begin
  253.            lcd_rs<=0 ;
  254.            end
  255.            else  begin
  256.            lcd_rs<= 1;
  257.            end
  258.        end
  259.        else begin
  260.            lcd_rs<=lcd_rs;
  261.        end     
  262.    end                  

  263.    always  @(posedge clk or negedge rst)begin
  264.        if(rst==1'b0)begin
  265.            lcd_data<=0 ;
  266.        end
  267.        else  if(write_flag)begin
  268.            case(n_state)

  269.                  IDLE: lcd_data <= 8'hxx;
  270.          SET_FUNCTION: lcd_data <= 8'h38; //2*16 5*8 8λ����
  271.              DISP_OFF: lcd_data <= 8'h08;
  272.            DISP_CLEAR: lcd_data <= 8'h01;
  273.            ENTRY_MODE: lcd_data <= 8'h06;
  274.            DISP_ON   : lcd_data <= 8'h0c;  //��ʾ���ܿ���û�й��꣬�Ҳ���˸��
  275.             ROW1_ADDR: lcd_data <= 8'h80; //00+80
  276.                ROW1_0: lcd_data <= row_1 [127:120];
  277.                ROW1_1: lcd_data <= row_1 [119:112];
  278.                ROW1_2: lcd_data <= row_1 [111:104];
  279.                ROW1_3: lcd_data <= row_1 [103: 96];
  280.                ROW1_4: lcd_data <= row_1 [ 95: 88];
  281.                ROW1_5: lcd_data <= row_1 [ 87: 80];
  282.                ROW1_6: lcd_data <= row_1 [ 79: 72];
  283.                ROW1_7: lcd_data <= row_1 [ 71: 64];
  284.                ROW1_8: lcd_data <= row_1 [ 63: 56];
  285.                ROW1_9: lcd_data <= row_1 [ 55: 48];
  286.                ROW1_A: lcd_data <= row_1 [ 47: 40];
  287.                ROW1_B: lcd_data <= row_1 [ 39: 32];
  288.                ROW1_C: lcd_data <= row_1 [ 31: 24];
  289.                ROW1_D: lcd_data <= row_1 [ 23: 16];
  290.                ROW1_E: lcd_data <= row_1 [ 15:  8];
  291.                ROW1_F: lcd_data <= row_1 [  7:  0];

  292.             ROW2_ADDR: lcd_data <= 8'hc0;      //40+80
  293.                ROW2_0: lcd_data <= row_2 [127:120];
  294.                ROW2_1: lcd_data <= row_2 [119:112];
  295.                ROW2_2: lcd_data <= row_2 [111:104];
  296.                ROW2_3: lcd_data <= row_2 [103: 96];
  297.                ROW2_4: lcd_data <= row_2 [ 95: 88];
  298.                ROW2_5: lcd_data <= row_2 [ 87: 80];
  299.                ROW2_6: lcd_data <= row_2 [ 79: 72];
  300.                ROW2_7: lcd_data <= row_2 [ 71: 64];
  301.                ROW2_8: lcd_data <= row_2 [ 63: 56];
  302.                ROW2_9: lcd_data <= row_2 [ 55: 48];
  303.                ROW2_A: lcd_data <= row_2 [ 47: 40];
  304.                ROW2_B: lcd_data <= row_2 [ 39: 32];
  305.                ROW2_C: lcd_data <= row_2 [ 31: 24];
  306.                ROW2_D: lcd_data <= row_2 [ 23: 16];
  307.                ROW2_E: lcd_data <= row_2 [ 15:  8];
  308.                ROW2_F: lcd_data <= row_2 [  7:  0];
  309.            endcase                     
  310.        end
  311.        else
  312.               lcd_data<=lcd_data ;
  313.    end





  314. assign sda=(link)? sda_buf:1'bz;

  315. reg [19:0] tics;
  316. always @(posedge clk or negedge rst)
  317. begin
  318.         if(!rst)
  319.                 tics<=0;
  320.         else if(tics==20'hfffff)
  321.                         tics<=0;
  322.         else
  323.                 tics<=tics+1;

  324. end

  325. always@(posedge clk or negedge rst)
  326. begin
  327.         if(!rst)
  328.                 cnt_delay<=0;
  329.         else begin
  330.                 if(start_delaycnt) begin
  331.                         if(cnt_delay!=20'd80)
  332.                                 cnt_delay<=cnt_delay+1;
  333.                         else
  334.                                 cnt_delay<=0;
  335.                  end
  336.          end
  337. end

  338. always@(posedge clk or negedge rst)
  339. begin
  340.         if(!rst) begin
  341.                 clk_div<=0;
  342.                 phase0<=0;
  343.                 phase1<=0;
  344.                 phase2<=0;
  345.                 phase3<=0;
  346.          end
  347.         else begin
  348.                 if(clk_div!=div_parameter-1)
  349.                         clk_div<=clk_div+1;
  350.                 else
  351.                         clk_div<=0;
  352.                 if(phase0)
  353.                         phase0<=0;       
  354.                 else if(clk_div==99)
  355.                         phase0<=1;
  356.                 if(phase1)
  357.                         phase1<=0;
  358.                 else if(clk_div==24)
  359.                         phase1<=1;
  360.                 if(phase2)
  361.                         phase2<=0;
  362.                 else if(clk_div==49)
  363.                         phase2<=1;
  364.                 if(phase3)
  365.                         phase3<=0;
  366.                 else if(clk_div==74)
  367.                         phase3<=1;
  368.          end
  369. end


  370. ///////////////////////////EEPROM/////////////
  371. always@(posedge clk or negedge rst)
  372. begin
  373.         if(!rst) begin
  374.                 start_delaycnt<=0;
  375.                 main_state<=2'b00;
  376.                 i2c_state<=ini;
  377.                 inner_state<=start;
  378.                 scl<=1;
  379.                 sda_buf<=1;
  380.                 link<=0;
  381.                 ledn1<=1;
  382.                 ledn2<=1;
  383.                 ledn3<=1;
  384.                 ledn4<=1;
  385.                 readData_reg<=0;
  386.                 addr<=8'h40;
  387.          end
  388.         else begin
  389.                 case(main_state)
  390.                         2'b00: begin  
  391.                                
  392.                                 scl<=1;
  393.                                 sda_buf<=1;
  394.                                 link<=0;
  395.                                 inner_state<=start;
  396.                                 i2c_state<=ini;
  397.                                 if(cnt_delay==0)
  398.                                                 start_delaycnt<=1;
  399.                                 else if(cnt_delay==20'd80) begin
  400.                                                 start_delaycnt<=0;
  401.                                                
  402.                                                         main_state<=2'b10;
  403.                                  end
  404.                          end
  405.                        
  406.                         2'b10: begin
  407.                                 if(phase0)
  408.                                         scl<=1;
  409.                                 else if(phase2)
  410.                                         scl<=0;
  411.                                        
  412.                                 case(i2c_state)
  413.                                 ini: begin   
  414.                                         case(inner_state)
  415.                                                 start: begin
  416.                                                         if(phase1) begin
  417.                                                                 link<=1;
  418.                                                                 sda_buf<=0;
  419.                                                          end
  420.                                                         if(phase3&&link) begin
  421.                                                                 inner_state<=first;
  422.                                                                 sda_buf<=1;
  423.                                                                 link<=1;
  424.                                                          end
  425.                                                  end
  426.                                                 first:
  427.                                                         if(phase3) begin
  428.                                                                 sda_buf<=0;
  429.                                                                 link<=1;
  430.                                                                 inner_state<=second;
  431.                                                          end
  432.                                                 second:
  433.                                                         if(phase3) begin
  434.                                                                 sda_buf<=0;
  435.                                                                 link<=1;
  436.                                                                 inner_state<=third;
  437.                                                          end
  438.                                                 third:
  439.                                                         if(phase3) begin
  440.                                                                 sda_buf<=1;
  441.                                                                 link<=1;
  442.                                                                 inner_state<=fourth;
  443.                                                          end
  444.                                                 fourth:
  445.                                                         if(phase3) begin
  446.                                                                 sda_buf<=0;
  447.                                                                 link<=1;
  448.                                                                 inner_state<=fifth;
  449.                                                          end
  450.                                                 fifth:
  451.                                                         if(phase3) begin
  452.                                                                 sda_buf<=0;
  453.                                                                 link<=1;
  454.                                                                 inner_state<=sixth;
  455.                                                          end
  456.                                                 sixth:
  457.                                                         if(phase3) begin
  458.                                                                 sda_buf<=0;
  459.                                                                 link<=1;
  460.                                                                 inner_state<=seventh;
  461.                                                          end
  462.                                                 seventh:
  463.                                                         if(phase3) begin
  464.                                                                 sda_buf<=0;
  465.                                                                 link<=1;
  466.                                                                 inner_state<=eighth;
  467.                                                          end
  468.                                                 eighth:
  469.                                                         if(phase3) begin
  470.                                                                 link<=0;
  471.                                                                 inner_state<=ack;
  472.                                                          end
  473.                                                 ack: begin
  474.                                                         if(phase0)
  475.                                                                
  476.                                                                         sda_buf<=sda;
  477.                                                                
  478.                                                         if(phase1) begin
  479.                                                                 if(sda_buf==1)
  480.                                                                         //begin
  481.                                                                                 main_state<=2'b00;
  482.                                                                                 //main_state<=2'b11;
  483.                                                                
  484.                                                          end
  485.                                                         if(phase3) begin
  486.                                                                 link<=1;
  487.                                                                
  488.                                                                 sda_buf<=addr[7];
  489.                                                                 inner_state<=first;
  490.                                                                 i2c_state<=sendaddr;
  491.                                                         end
  492.                                                  end
  493.                                         endcase
  494.                                 end
  495.                                 sendaddr: begin
  496.                                         case(inner_state)
  497.                                                 first:
  498.                                                         if(phase3) begin
  499.                                                                 link<=1;
  500.                                                                 sda_buf<=addr[6];
  501.                                                                 inner_state<=second;
  502.                                                          end
  503.                                                 second:
  504.                                                         if(phase3) begin
  505.                                                                 link<=1;
  506.                                                                 sda_buf<=addr[5];
  507.                                                                 inner_state<=third;
  508.                                                          end
  509.                                                 third:
  510.                                                         if(phase3) begin
  511.                                                                 link<=1;
  512.                                                                 sda_buf<=addr[4];
  513.                                                                 inner_state<=fourth;
  514.                                                          end
  515.                                                 fourth:
  516.                                                         if(phase3) begin
  517.                                                                 link<=1;
  518.                                                                 sda_buf<=addr[3];
  519.                                                                 inner_state<=fifth;
  520.                                                          end
  521.                                                 fifth:
  522.                                                         if(phase3) begin
  523.                                                                 link<=1;
  524.                                                                 sda_buf<=addr[2];
  525.                                                                 inner_state<=sixth;
  526.                                                          end
  527.                                                 sixth:
  528.                                                         if(phase3) begin
  529.                                                                 link<=1;
  530.                                                                 sda_buf<=addr[1];
  531.                                                                 inner_state<=seventh;
  532.                                                          end
  533.                                                 seventh:
  534.                                                         if(phase3) begin
  535.                                                                 link<=1;
  536.                                                                 sda_buf<=addr[0];
  537.                                                                 inner_state<=eighth;
  538.                                                          end
  539.                                                 eighth:
  540.                                                         if(phase3) begin
  541.                                                                 link<=0;
  542.                                                                 inner_state<=ack;
  543.                                                          end
  544.                                                 ack: begin
  545.                                                         if(phase0)
  546.                                                                 sda_buf<=sda;
  547.                                                         if(phase1) begin
  548.                                                                 if(sda_buf==1)
  549.                                                                         main_state<=2'b00;
  550.                                                                         //main_state<=2'b11;
  551.                                                          end
  552.                                                         if(phase3) begin
  553.                                                                 link<=1;
  554.                                                                 sda_buf<=1;
  555.                                                                 inner_state<=start;
  556.                                                                 i2c_state<=read_ini;
  557.                                                          end
  558.                                                  end
  559.                                          endcase
  560.                                  end
  561.                                 read_ini: begin
  562.                                 case(inner_state)
  563.                                                 start: begin
  564.                                                         if(phase1) begin
  565.                                                                 link<=1;
  566.                                                                 sda_buf<=0;
  567.                                                          end
  568.                                                         if(phase3&&link) begin
  569.                                                                 inner_state<=first;
  570.                                                                 sda_buf<=1;
  571.                                                                 link<=1;
  572.                                                          end
  573.                                                  end
  574.                                                 first:
  575.                                                         if(phase3) begin
  576.                                                                 sda_buf<=0;
  577.                                                                 link<=1;
  578.                                                                 inner_state<=second;
  579.                                                          end
  580.                                                 second:
  581.                                                         if(phase3) begin
  582.                                                                 sda_buf<=0;
  583.                                                                 link<=1;
  584.                                                                 inner_state<=third;
  585.                                                          end
  586.                                                 third:
  587.                                                         if(phase3) begin
  588.                                                                 sda_buf<=1;
  589.                                                                 link<=1;
  590.                                                                 inner_state<=fourth;
  591.                                                          end
  592.                                                 fourth:
  593.                                                         if(phase3) begin
  594.                                                                 sda_buf<=0;
  595.                                                                 link<=1;
  596.                                                                 inner_state<=fifth;
  597.                                                          end
  598.                                                 fifth:
  599.                                                         if(phase3) begin
  600.                                                                 sda_buf<=0;
  601.                                                                 link<=1;
  602.                                                                 inner_state<=sixth;
  603.                                                          end
  604.                                                 sixth:
  605.                                                         if(phase3) begin
  606.                                                                 sda_buf<=0;
  607.                                                                 link<=1;
  608.                                                                 inner_state<=seventh;
  609.                                                         end
  610.                                                 seventh:
  611.                                                         if(phase3) begin
  612.                                                                 sda_buf<=1;
  613.                                                                 link<=1;
  614.                                                                 inner_state<=eighth;
  615.                                                          end
  616.                                                 eighth:
  617.                                                         if(phase3) begin
  618.                                                                 link<=0;
  619.                                                                 inner_state<=ack;
  620.                                                          end
  621.                                                 ack: begin
  622.                                                         if(phase0)
  623.                                                                 sda_buf<=sda;
  624.                                                         if(phase1) begin
  625.                                                                 if(sda_buf==1)
  626.                                                                         main_state<=2'b00;
  627.                                                                         //main_state<=2'b11;
  628.                                                          end
  629.                                                         if(phase3) begin
  630.                                                                 link<=0;
  631.                                                                 inner_state<=first;
  632.                                                                 i2c_state<=read_data;
  633.                                                          end
  634.                                                  end
  635.                                         endcase
  636.                                 end
  637.                                 read_data: begin  
  638.                                         case(inner_state)
  639.                                                 first: begin
  640.                                                         if(phase0)
  641.                                                                 sda_buf<=sda;
  642.                                                         if(phase1) begin
  643.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  644.                                                                 readData_reg[0]<=sda;
  645.                                                          end
  646.                                                         if(phase3)
  647.                                                                 inner_state<=second;
  648.                                                  end
  649.                                                 second: begin
  650.                                                         if(phase0)
  651.                                                                 sda_buf<=sda;
  652.                                                         if(phase1) begin
  653.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  654.                                                                 readData_reg[0]<=sda;
  655.                                                          end
  656.                                                         if(phase3)
  657.                                                                 inner_state<=third;
  658.                                                  end
  659.                                                 third: begin
  660.                                                         if(phase0)
  661.                                                                 sda_buf<=sda;
  662.                                                         if(phase1) begin
  663.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  664.                                                                 readData_reg[0]<=sda;
  665.                                                          end
  666.                                                         if(phase3)
  667.                                                                 inner_state<=fourth;                                                       
  668.                                                  end
  669.                                                 fourth: begin
  670.                                                         if(phase0)
  671.                                                                 sda_buf<=sda;
  672.                                                         if(phase1) begin
  673.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  674.                                                                 readData_reg[0]<=sda;
  675.                                                          end
  676.                                                         if(phase3)
  677.                                                                 inner_state<=fifth;                                                       
  678.                                                  end
  679.                                                 fifth: begin
  680.                                                         if(phase0)
  681.                                                                 sda_buf<=sda;
  682.                                                         if(phase1) begin
  683.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  684.                                                                 readData_reg[0]<=sda;
  685.                                                          end
  686.                                                         if(phase3)
  687.                                                                 inner_state<=sixth;                                                       
  688.                                                  end
  689.                                                 sixth: begin
  690.                                                         if(phase0)
  691.                                                                 sda_buf<=sda;
  692.                                                         if(phase1) begin
  693.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  694.                                                                 readData_reg[0]<=sda;
  695.                                                          end
  696.                                                         if(phase3)
  697.                                                                 inner_state<=seventh;                                                               
  698.                                                  end
  699.                                                 seventh: begin
  700.                                                         if(phase0)
  701.                                                                 sda_buf<=sda;
  702.                                                         if(phase1) begin
  703.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  704.                                                                 readData_reg[0]<=sda;
  705.                                                          end
  706.                                                         if(phase3)
  707.                                                                 inner_state<=eighth;                                                               
  708.                                                  end
  709.                                                 eighth: begin
  710.                                                         if(phase0)
  711.                                                                 sda_buf<=sda;
  712.                                                         if(phase1) begin
  713.                                                                 readData_reg[7:1]<=readData_reg[6:0];
  714.                                                                 readData_reg[0]<=sda;
  715.                                                          end
  716.                                                         if(phase3)
  717.                                                                 inner_state<=ack;
  718.                                                  end
  719.                                                 ack: begin
  720.                                                         if(phase3) begin
  721.                                                                 link<=1;
  722.                                                                 sda_buf<=0;
  723.                                                                 inner_state<=stop;
  724.                                                          end
  725.                                                  end
  726.                                                 stop: begin
  727.                                                         /*if(phase1)
  728.                                                                 sda_buf<=1;
  729.                                                                
  730.                                                                 ledn1<=0;
  731.                                                         if(phase3) begin
  732.                                                                 link<=0;
  733.                                                                 inner_state<=first;
  734.                                                                 i2c_state<=read_s1;
  735.                                                                 ledn2<=0;
  736.                                                          end*/
  737.                                                          ledn3<=1;
  738.                                                          if(phase1)
  739.                                                                 sda_buf<=1;
  740.                                                         if(phase3)
  741.                                                                 i2c_state<=read_s1;
  742.                                                  end
  743.                                                
  744.                                                  
  745.                                                  default:
  746.                                                         ;
  747.                                          endcase
  748.                                  end
  749.                          read_s1:
  750.                                 i2c_state<=read_s2;
  751.                          read_s2:
  752.                                 i2c_state<=read_s3;
  753.                          read_s3:
  754.                                 i2c_state<=read_s4;
  755.                          read_s4:
  756.                                 i2c_state<=read_s5;
  757.                          read_s5:
  758.                                 i2c_state<=read_s6;
  759.                          read_s6:
  760.                                 i2c_state<=read_s7;
  761.                          read_s7:
  762.                                 i2c_state<=read_s8;
  763.                          read_s8:
  764.                                 i2c_state<=read_s9;
  765.                          read_s9:
  766.                                 i2c_state<=read_s10;
  767.                          read_s10:
  768.                                 i2c_state<=read_s11;
  769.                          read_s11:
  770.                                 i2c_state<=read_s12;
  771.                          read_s12:
  772.                                
  773.                                
  774.                                 begin
  775.                                         if(tics[19])
  776.                                                 begin
  777.                                                         adc_data<=readData_reg;
  778.                                                         main_state<=2'b00;
  779.                                                         i2c_state<=ini;
  780.                                                         inner_state<=start;
  781.                                                         ledn3<=0;
  782.                                                 end
  783.                                         else
  784.                                                 i2c_state<=read_s12;
  785.                                 end
  786.                          default:
  787.                                
  788.                                        
  789.                                         ;
  790.                                
  791.                          endcase
  792.                 end
  793.                
  794.          endcase
  795. end
  796. end
  797.                                

  798. assign led1=ledn1;
  799. assign led2=ledn2;
  800. assign led3=ledn3;
  801. assign led4=ledn4;



  802. endmodule
请高手指教,哪里有错?谢谢!我是参考例程AR24C04的程序改的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3535

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部