请帮忙看看我ds18b20的verilog代码哪里有错,急

2019-07-15 22:12发布


复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
丶山上打老虎
2019-07-15 23:17
  1. module ds18b20_control_module(
  2.         input clk,
  3.         input rst_n,
  4.        
  5.         output [15:0]Temper,
  6.         output read_finish,
  7.        
  8.         output [3:0]flag,
  9.        
  10.         inout DQ,
  11.         input Start
  12. );
  13.         reg [15:0]rTemper;

  14.        
  15. //DQ三态
  16.         reg rDQ;
  17.         reg isRead;
  18.         assign DQ = isRead?1'bz:rDQ;

  19. //1us 定时和计数器
  20.         reg [5:0] time_1us_cnt;
  21.         reg isCount;
  22.         always @(posedge clk or negedge rst_n)
  23.                 if(!rst_n)
  24.                         time_1us_cnt <= 6'd0;
  25.                 else if(time_1us_cnt == 6'd49)
  26.                         time_1us_cnt <= 6'd0;
  27.                 else if(isCount)
  28.                         time_1us_cnt <= time_1us_cnt + 1'b1;
  29.                 else if(!isCount)
  30.                         time_1us_cnt <= 6'd0;
  31.        
  32.         reg [10:0]time_cnt;
  33.         reg [10:0]Times;
  34.         always @(posedge clk or negedge rst_n)
  35.                 if(!rst_n)
  36.                         time_cnt <= 11'd0;
  37.                 else if(time_cnt == Times)
  38.                         time_cnt <= 11'd0;
  39.                 else if(isCount && time_1us_cnt == 6'd49 )
  40.                         time_cnt <= time_cnt + 1'b1;
  41.                 else if(!isCount)
  42.                         time_cnt <= 11'd0;
  43.        
  44. //1S定时器       
  45.         reg [25:0]time_1s_cnt;
  46.         always @(posedge clk or negedge rst_n)
  47.                 if(!rst_n)
  48.                         time_1s_cnt <= 26'd0;
  49.                 else if(time_1s_cnt == 26'd49_999_999)
  50.                         time_1s_cnt <= 26'd0;
  51.                 else if(isCount)
  52.                         time_1s_cnt <= time_1s_cnt + 1'b1;
  53.                 else if(!isCount)
  54.                         time_1s_cnt <= 26'd0;
  55.        
  56.                        
  57.                        
  58. //状态机
  59.         reg [2:0]state;
  60.         reg ack;
  61.         reg flag_r;
  62.         parameter IDLE = 3'd0;
  63.         parameter RESET = 3'd1;
  64.         parameter RECEIVE = 3'd2;
  65.         parameter WRITE_ROM = 3'd3;
  66.         parameter WRITE_COMMAND_44 = 3'd4;
  67.         parameter WRITE_COMMAND_BE = 3'd5;
  68.         parameter WAIT = 3'd6;
  69.         parameter READ = 3'd7;
  70.         reg [3:0]bit_counter;
  71.         reg [3:0]i;
  72.         reg [3:0]j;
  73.         reg [7:0]command;
  74.         reg read_finish_r;
  75.         reg command_finish;
  76.         reg [15:0]ds18b20_read_data;
  77.        
  78.         reg [3:0]rflag;
  79.        
  80.         always @(posedge clk or negedge rst_n)
  81.                 if(!rst_n)
  82.                         begin
  83.                                 state <= 3'd0;
  84.                                 rTemper <= 16'd0;
  85.                                 isCount <= 1'b0;
  86.                                 rDQ <= 1'b1;
  87.                                 isRead <= 1'b0;
  88.                                 ack <= 1'b1;
  89.                                 command <= 8'd0;
  90.                                 flag_r <= 1'b0;
  91.                                 i <= 4'd0;
  92.                                 j <= 4'd0;
  93.                                 bit_counter <= 4'd0;
  94.                                 read_finish_r <= 1'b0;
  95.                                 command_finish <= 1'b0;
  96.                                 ds18b20_read_data <= 16'd0;
  97.                                 rflag <= 4'd0;
  98.                                
  99.                         end
  100.                 else
  101.                         case(state)
  102.                                 IDLE:begin
  103.                                         if(Start) state <= RESET ;
  104.                                 end
  105.                                
  106.                                 //复位
  107.                                 RESET:begin
  108.                                         if(time_cnt == Times)begin
  109.                                                 isCount <= 1'b0;
  110.                                                 state <= RECEIVE;
  111.                                         end
  112.                                         else  begin
  113.                                                 isCount <= 1'b1;
  114.                                                 isRead <= 1'b0;
  115.                                                 rDQ <= 1'b0;
  116.                                                 Times <= 600;
  117.                                         end
  118.                                 end
  119.                                
  120.                                 //接收
  121.                                 RECEIVE:begin
  122.                                         if(time_cnt == 70) begin ack <= DQ;  end
  123.                                         else if(time_cnt == 600)begin
  124.                                                 isCount <= 1'b0;
  125.                                                 if(ack == 1'b0) begin
  126.                                                                 state <= WRITE_ROM;  
  127.                                                 end
  128.                                                 else state <= IDLE ;
  129.                                         end
  130.                                         else begin
  131.                                                 isCount <= 1'b1;
  132.                                                 Times <= 600;
  133.                                                 isRead <= 1'b1;
  134.                                                 rDQ <= 1'b1;
  135.                                         end
  136.                                 end
  137.                                
  138.                                 //写cc指令
  139.                                 WRITE_ROM:begin
  140.                                         case(i)
  141.                                                 0:
  142.                                                         begin isRead <= 1'b0;isCount <= 1'b1;Times <= 11'd100; i <= i + 1'b1;command <= 8'hCC;end
  143.                                                 1:
  144.                                                         if(time_cnt == 5)begin i <= i +1'b1; end
  145.                                                         else         rDQ <= 1'b0;
  146.                                                 2:
  147.                                                         if(time_cnt == 90)i <= i +1'b1;
  148.                                                         else rDQ <= command[bit_counter];
  149.                                                 3:
  150.                                                         if(time_cnt == 100) begin isCount <= 1'b0; i <= i + 1'b1;   end
  151.                                                         else         begin isRead <= 1'b1;rDQ <= 1'b1;end
  152.                                                 4:
  153.                                                         if( bit_counter == 7)begin bit_counter <= 4'd0; i <= i + 1'b1;  end
  154.                                                         else begin bit_counter <= bit_counter + 1'b1; i <= 4'd0; end
  155.                                                 5:
  156.                                                         begin        command_finish <= 1'b1;i <= i + 1'b1;   end
  157.                                                 6:
  158.                                                         begin       
  159.                                                                         if(flag_r == 1'b0)begin  state <= WRITE_COMMAND_44;command_finish <= 1'b0; i <= 4'd0; end
  160.                                                                         else if( flag_r == 1'b1)begin state <= WRITE_COMMAND_BE;command_finish <= 1'b0; i <= 4'd0;end
  161.                                                         end
  162.                                         endcase
  163.                                 end
  164.                                
  165.                                 //写44转换
  166.                                 WRITE_COMMAND_44:begin
  167.                                         case(i)
  168.                                                 0:
  169.                                                         begin isRead <= 1'b0;isCount <= 1'b1;Times <= 11'd100; i <= i + 1'b1;command <= 8'h44;end
  170.                                                 1:
  171.                                                         if(time_cnt == 5)begin i <= i +1'b1; end
  172.                                                         else         rDQ <= 1'b0;
  173.                                                 2:
  174.                                                         if(time_cnt == 90)i <= i +1'b1;
  175.                                                         else rDQ <= command[bit_counter];
  176.                                                 3:
  177.                                                         if(time_cnt == 100) begin isCount <= 1'b0; i <= i + 1'b1;   end
  178.                                                         else isRead <= 1'b1;//        rDQ <= 1'b1;
  179.                                                 4:
  180.                                                         if( bit_counter == 7)begin bit_counter <= 4'd0; i <= i + 1'b1;  end
  181.                                                         else begin bit_counter <= bit_counter + 1'b1; i <= 4'd0; end
  182.                                                 5:
  183.                                                         begin        command_finish <= 1'b1;i <= i + 1'b1;   end
  184.                                                 6:
  185.                                                         begin        command_finish <= 1'b0; state <= WAIT ; i <= 4'd0;end
  186.                                         endcase
  187.                                 end
  188.                                
  189.                                         WRITE_COMMAND_BE:begin
  190.                                                 case(i)
  191.                                                         0:
  192.                                                                 begin isRead <= 1'b0;isCount <= 1'b1;Times <= 11'd100; i <= i + 1'b1;command <= 8'hBE;end
  193.                                                         1:
  194.                                                                 if(time_cnt == 5)begin i <= i +1'b1; end
  195.                                                                 else         rDQ <= 1'b0;
  196.                                                         2:
  197.                                                                 if(time_cnt == 90)i <= i +1'b1;
  198.                                                                 else rDQ <= command[bit_counter];
  199.                                                         3:
  200.                                                                 if(time_cnt == 100) begin isCount <= 1'b0; i <= i + 1'b1;   end
  201.                                                                 else         isRead <= 1'b1;//rDQ <= 1'b1;
  202.                                                         4:
  203.                                                                 if( bit_counter == 7)begin bit_counter <= 4'd0; i <= i + 1'b1;  end
  204.                                                                 else begin bit_counter <= bit_counter + 1'b1; i <= 4'd0; end
  205.                                                         5:
  206.                                                                 begin        command_finish <= 1'b1;i <= i + 1'b1;   end
  207.                                                         6:
  208.                                                                 begin        command_finish <= 1'b0; state <= READ ; i <= 4'd0; end
  209.                                                 endcase
  210.                                         end
  211.                                 //等待1s
  212.                                 WAIT:begin
  213.                                         if(time_1s_cnt == 26'd42_999_999)begin state <=RESET;flag_r <= 1'b1;isCount <= 1'b0;  end
  214.                                         else begin isCount <= 1'b1; end
  215.                                 end
  216.                                 //读取
  217.                                 READ:begin
  218.                                         case(j)
  219.                                                 0:
  220.                                                         begin isCount <= 1'b1;Times <= 11'd100; j <= j + 1'b1;flag_r <= 1'b0;end
  221.                                                 1:
  222.                                                         if(time_cnt == 3) j <= j +1'b1;
  223.                                                         else begin isRead <= 1'b0;rDQ <= 1'b0;end
  224.                                                 2:
  225.                                                         if(time_cnt == 80) j <= j +1'b1;
  226.                                                         else if(time_cnt == 10)begin ds18b20_read_data <= {DQ,ds18b20_read_data[15:1]};   end
  227.                                                         else begin isRead <= 1'b1;rDQ <= 1'b1;end
  228.                                                 3:
  229.                                                         if(time_cnt == 90) begin isCount <= 1'b0; j <= j + 1'b1;   end
  230.                                                         else begin end//isRead <= 1'b0;rDQ <= 1'b1;end
  231.                                                 4:
  232.                                                         if( bit_counter == 15)begin bit_counter <= 4'd0; j <= j + 1'b1;  end
  233.                                                         else begin bit_counter <= bit_counter + 1'b1; j <= 4'd0; end
  234.                                                 5:
  235.                                                         begin        read_finish_r <= 1'b1;j <= j + 1'b1; end
  236.                                                 6:
  237.                                                         begin       
  238.                                                                  state <= IDLE ; read_finish_r <= 1'b0;rTemper <= ds18b20_read_data ;rflag[0]<=1;
  239.                                                         end

  240.                                         endcase
  241.                                 end
  242.                         endcase
  243.                        

  244.         assign Temper = rTemper ;
  245.         assign read_finish = read_finish_r;
  246.         assign flag = rflag;
  247.        


  248. endmodule
复制代码

一周热门 更多>