微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求指点我ds18b20用verilog写的代码老是不对

求指点我ds18b20用verilog写的代码老是不对

时间:10-02 整理:3721RD 点击:

  1. module ds18b20_control_module(
  2.         input clk,
  3.         input rst_n,
  4.         
  5.         output [15:0]Temper,
  6.         output read_finish,
  7.         
  8.         inout DQ,
  9.         input Start
  10. );
  11.         reg [15:0]rTemper;

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

  17. //1us 定时和计数器
  18.         reg [5:0] time_1us_cnt;
  19.         reg isCount;
  20.         always @(posedge clk or negedge rst_n)
  21.                 if(!rst_n)
  22.                         time_1us_cnt <= 6'd0;
  23.                 else if(time_1us_cnt == 6'd49)
  24.                         time_1us_cnt <= 6'd0;
  25.                 else if(isCount)
  26.                         time_1us_cnt <= time_1us_cnt + 1'b1;
  27.                 else if(!isCount)
  28.                         time_1us_cnt <= 6'd0;
  29.         
  30.         reg [10:0]time_cnt;
  31.         reg [10:0]Times;
  32.         always @(posedge clk or negedge rst_n)
  33.                 if(!rst_n)
  34.                         time_cnt <= 11'd0;
  35.                 else if(time_cnt == Times)
  36.                         time_cnt <= 11'd0;
  37.                 else if(isCount && time_1us_cnt == 6'd49 )
  38.                         time_cnt <= time_cnt + 1'b1;
  39.                 else if(!isCount)
  40.                         time_cnt <= 11'd0;
  41.         
  42. //1S定时器        
  43.         reg [25:0]time_1s_cnt;
  44.         always @(posedge clk or negedge rst_n)
  45.                 if(!rst_n)
  46.                         time_1s_cnt <= 26'd0;
  47.                 else if(time_1s_cnt == 26'd49_999_999)
  48.                         time_1s_cnt <= 26'd0;
  49.                 else if(isCount)
  50.                         time_1s_cnt <= time_1s_cnt + 1'b1;
  51.                 else if(!isCount)
  52.                         time_1s_cnt <= 26'd0;
  53.         
  54.                         
  55.                         
  56. //状态机
  57.         reg [2:0]state;
  58.         reg ack;
  59.         reg flag_r;
  60.         parameter IDLE = 3'd0;
  61.         parameter RESET = 3'd1;
  62.         parameter RECEIVE = 3'd2;
  63.         parameter WRITE_ROM = 3'd3;
  64.         parameter WRITE_COMMAND_44 = 3'd4;
  65.         parameter WRITE_COMMAND_BE = 3'd5;
  66.         parameter WAIT = 3'd6;
  67.         parameter READ = 3'd7;
  68.         reg [3:0]bit_counter;
  69.         reg [3:0]i;
  70.         reg [3:0]j;
  71.         reg [7:0]command;
  72.         reg read_finish_r;
  73.         reg command_finish;
  74.         reg [15:0]ds18b20_read_data;
  75.         

  76.         
  77.         always @(posedge clk or negedge rst_n)
  78.                 if(!rst_n)
  79.                         begin
  80.                                 state <= 3'd0;
  81.                                 rTemper <= 16'd0;
  82.                                 isCount <= 1'b0;
  83.                                 rDQ <= 1'b1;
  84.                                 isRead <= 1'b0;
  85.                                 ack <= 1'b1;
  86.                                 command <= 8'd0;
  87.                                 flag_r <= 1'b0;
  88.                                 i <= 4'd0;
  89.                                 j <= 4'd0;
  90.                                 bit_counter <= 4'd0;
  91.                                 read_finish_r <= 1'b0;
  92.                                 command_finish <= 1'b0;
  93.                                 ds18b20_read_data <= 16'd0;
  94.                                 
  95.                         end
  96.                 else
  97.                         case(state)
  98.                                 IDLE:begin
  99.                                         if(Start) state <= RESET ;
  100.                                 end
  101.                                 
  102.                                 //复位
  103.                                 RESET:begin
  104.                                         if(time_cnt == Times)begin isCount <= 1'b0;state <= RECEIVE; end
  105.                                         else  begin isCount <= 1'b1;isRead <= 1'b0;rDQ <= 1'b0;Times <= 600;  end
  106.                                 end
  107.                                 
  108.                                 //接收
  109.                                 RECEIVE:begin
  110.                                         if(time_cnt == 90) begin ack <= DQ;  end
  111.                                         else if(time_cnt == 580)begin
  112.                                                 isCount <= 1'b0;
  113.                                                 if(ack == 1'b0) begin state <= WRITE_ROM; end
  114.                                                 else state <= IDLE ;
  115.                                         end
  116.                                         else begin isCount <= 1'b1; Times <= 600; isRead <= 1'b1;rDQ <= 1'b1;end
  117.                                 end
  118.                                 
  119.                                 //写cc指令
  120.                                 WRITE_ROM:begin
  121.                                         case(i)
  122.                                                 0:
  123.                                                         begin isRead <= 1'b0;isCount <= 1'b1;Times <= 11'd100; i <= i + 1'b1;command <= 8'hcc;end
  124.                                                 1:
  125.                                                         if(time_cnt == 2)begin i <= i +1'b1; end
  126.                                                         else         rDQ <= 1'b0;
  127.                                                 2:
  128.                                                         if(time_cnt == 90)i <= i +1'b1;
  129.                                                         else rDQ <= command[bit_counter];
  130.                                                 3:
  131.                                                         if(time_cnt == 100) begin isCount <= 1'b0; i <= i + 1'b1;   end
  132.                                                         else         rDQ <= 1'b1;
  133.                                                 4:
  134.                                                         if( bit_counter == 7)begin bit_counter <= 4'd0; i <= i + 1'b1;  end
  135.                                                         else begin bit_counter <= bit_counter + 1'b1; i <= 4'd0; end
  136.                                                 5:
  137.                                                         begin        command_finish <= 1'b1;i <= i + 1'b1;   end
  138.                                                 6:
  139.                                                         begin        
  140.                                                                         if(flag_r == 1'b0)begin  state <= WRITE_COMMAND_44;command_finish <= 1'b0; i <= 4'd0; end
  141.                                                                         else if( flag_r == 1'b1)begin state <= WRITE_COMMAND_BE;command_finish <= 1'b0; i <= 4'd0;end
  142.                                                         end
  143.                                         endcase
  144.                                 end
  145.                                 
  146.                                 //写44转换
  147.                                 WRITE_COMMAND_44:begin
  148.                                         case(i)
  149.                                                 0:
  150.                                                         begin isRead <= 1'b0;isCount <= 1'b1;Times <= 11'd100; i <= i + 1'b1;command <= 8'h44;end
  151.                                                 1:
  152.                                                         if(time_cnt == 2)begin i <= i +1'b1; end
  153.                                                         else         rDQ <= 1'b0;
  154.                                                 2:
  155.                                                         if(time_cnt == 90)i <= i +1'b1;
  156.                                                         else rDQ <= command[bit_counter];
  157.                                                 3:
  158.                                                         if(time_cnt == 100) begin isCount <= 1'b0; i <= i + 1'b1;   end
  159.                                                         else         rDQ <= 1'b1;
  160.                                                 4:
  161.                                                         if( bit_counter == 7)begin bit_counter <= 4'd0; i <= i + 1'b1;  end
  162.                                                         else begin bit_counter <= bit_counter + 1'b1; i <= 4'd0; end
  163.                                                 5:
  164.                                                         begin        command_finish <= 1'b1;i <= i + 1'b1;   end
  165.                                                 6:
  166.                                                         begin        command_finish <= 1'b0; state <= WAIT ; i <= 4'd0;end
  167.                                         endcase
  168.                                 end
  169.                                 
  170.                                         WRITE_COMMAND_BE:begin
  171.                                                 case(i)
  172.                                                         0:
  173.                                                                 begin isRead <= 1'b0;isCount <= 1'b1;Times <= 11'd100; i <= i + 1'b1;command <= 8'hBE;end
  174.                                                         1:
  175.                                                                 if(time_cnt == 2)begin i <= i +1'b1; end
  176.                                                                 else         rDQ <= 1'b0;
  177.                                                         2:
  178.                                                                 if(time_cnt == 90)i <= i +1'b1;
  179.                                                                 else rDQ <= command[bit_counter];
  180.                                                         3:
  181.                                                                 if(time_cnt == 100) begin isCount <= 1'b0; i <= i + 1'b1;   end
  182.                                                                 else         rDQ <= 1'b1;
  183.                                                         4:
  184.                                                                 if( bit_counter == 7)begin bit_counter <= 4'd0; i <= i + 1'b1;  end
  185.                                                                 else begin bit_counter <= bit_counter + 1'b1; i <= 4'd0; end
  186.                                                         5:
  187.                                                                 begin        command_finish <= 1'b1;i <= i + 1'b1;   end
  188.                                                         6:
  189.                                                                 begin        command_finish <= 1'b0; state <= READ ; i <= 4'd0; end
  190.                                                 endcase
  191.                                         end
  192.                                 //等待1s
  193.                                 WAIT:begin
  194.                                         if(time_1s_cnt == 26'd49_999_999&&flag_r == 1'b0)begin state <=RESET;flag_r <= 1'b1;isCount <= 1'b0;  end
  195.                                         else begin isCount <= 1'b1; end
  196.                                 end
  197.                                 //读取
  198.                                 READ:begin
  199.                                         case(j)
  200.                                                 0:
  201.                                                         begin isCount <= 1'b1;Times <= 11'd100; j <= j + 1'b1;flag_r <= 1'b0;end
  202.                                                 1:
  203.                                                         if(time_cnt == 2) j <= j +1'b1;
  204.                                                         else begin isRead <= 1'b0;rDQ <= 1'b0;end
  205.                                                 2:
  206.                                                         if(time_cnt == 90) j <= j +1'b1;
  207.                                                         else if(time_cnt == 14)begin ds18b20_read_data <= {DQ,ds18b20_read_data[15:1]};  end
  208.                                                         else isRead <= 1'b1;
  209.                                                 3:
  210.                                                         if(time_cnt == 100) begin isCount <= 1'b0; j <= j + 1'b1;   end
  211.                                                         else begin isRead <= 1'b0;rDQ <= 1'b1;end
  212.                                                 4:
  213.                                                         if( bit_counter == 15)begin bit_counter <= 4'd0; j <= j + 1'b1;  end
  214.                                                         else begin bit_counter <= bit_counter + 1'b1; j <= 4'd0; end
  215.                                                 5:
  216.                                                         begin        read_finish_r <= 1'b1;j <= j + 1'b1; end
  217.                                                 6:
  218.                                                         begin        
  219.                                                                  state <= IDLE ; read_finish_r <= 1'b0;rTemper <= ds18b20_read_data ;
  220.                                                         end

  221.                                         endcase
  222.                                 end
  223.                         endcase
  224.                         

  225.         assign Temper = rTemper ;
  226.         assign read_finish = read_finish_r;
  227.         


  228. endmodule

复制代码



已退回5积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top