[FPGA] DS2401 verilog驱动代码,实测有效,自己产品加密用

[复制链接]
926|0
 楼主| feihufuture 发表于 2021-4-29 09:16 | 显示全部楼层 |阅读模式
本帖最后由 feihufuture 于 2021-4-29 09:21 编辑

xilinx的fpga自带DNA可以用来加密;可是换了国产FPGA芯片,无法加密怎么搞?
我就用DS2401,价格也便宜,占用管脚也少,就一根!
读取也方便,总共也就140行代码module one_wire_controller
        #
        (
        parameter CLK_FREQ = 50000000
        )
        (
        input                                 Clk ,  
        input                                 Rst ,
        inout                                 Dq ,
        output          [63:0]         ReadData,
        output reg                         ReadFinish
        );
[payamount]1.00[/payamount]
[pay]
  1.        
  2.         //
  3.         //do read after reset is high
  4.        
  5.         module one_wire_controller
  6.         #
  7.         (
  8.         parameter CLK_FREQ = 50000000
  9.         )
  10.         (
  11.         input                                 Clk , //50M
  12.         input                                 Rst ,
  13.         inout                                 Dq ,
  14.         output          [63:0]         ReadData,
  15.         output reg                         ReadFinish
  16.         );
  17.        
  18.        
  19.         localparam      ROM_CMD = 8'h33;
  20.         localparam                 IDLE_STATE                         = 8'b0000_0001 ,
  21.                                         RESET                                 = 8'b0000_0010 ,
  22.                                         READ_PULSE                         = 8'b0000_0100 ,
  23.                                         WRITE_ROM_CMD                 = 8'b0000_1000 ,
  24.                                         READ_FAMILY_CODE         = 8'b0001_0000 ,
  25.                                         READ_SERINUM_CODE         = 8'b0010_0000 ,
  26.                                         READ_CRC_CODE                 = 8'b0100_0000 ,
  27.                                         DATA_EN                         = 8'b1000_0000 ;
  28.        
  29.        
  30.         `define   TIME_2US  CLK_FREQ/1000000*2
  31.         `define   TIME_10US  CLK_FREQ/1000000*10        
  32.         `define   TIME_70US  CLK_FREQ/1000000*70
  33.         `define   TIME_90US  CLK_FREQ/1000000*90
  34.         `define   TIME_100US  CLK_FREQ/1000000*100
  35.         `define   TIME_500US  CLK_FREQ/1000000*500
  36.         `define   TIME_600US  CLK_FREQ/1000000*600
  37.        
  38.        
  39.        
  40.         reg         [7        :        0]         St;
  41.         reg                                        SlaveAck ;
  42.         reg         [31        :        0]         DelayCnt ;
  43.         reg         [5        :        0]         BitCnt ;
  44.         reg         [63        :        0]         ReadDataReg;
  45.         reg                                 DqReg ;
  46.         reg                                 ReadEn;
  47.        
  48.        
  49.         assign         Dq = ReadEn ? 1'bz : DqReg;
  50.         assign ReadData = ReadDataReg;
  51.         always @(posedge Clk)
  52.         begin
  53.         case( St )
  54.         IDLE_STATE ,  DATA_EN         :         begin DqReg <= 1'b1; ReadEn <= 1'b0; end //Dq output
  55.         READ_PULSE                                 :         begin DqReg <= 1'b1; ReadEn <= 1'b1; end //Dq input
  56.         RESET                                        :         DqReg <= 1'b0; //Dq output
  57.         WRITE_ROM_CMD                        :        begin
  58.                                                                 ReadEn <= 1'b0; //Dq output
  59.                                                                 if(DelayCnt < `TIME_2US ) DqReg <= 1'b0; //Dq output 0 keep 2us
  60.                                                                 else if(DelayCnt < `TIME_90US ) //delay for 90us
  61.                                                                         begin
  62.                                                                         if(ROM_CMD[BitCnt] == 1) DqReg <= 1'b1;
  63.                                                                         else DqReg <= 1'b0;
  64.                                                                         end
  65.                                                                 else DqReg <= 1'b1;
  66.                                                                 end
  67.         READ_FAMILY_CODE,READ_SERINUM_CODE, READ_CRC_CODE        :
  68.                                                                 begin
  69.                                                                 if(DelayCnt < `TIME_2US ) begin DqReg <= 1'b0 ; ReadEn <= 1'b0 ; end //Dq output 0 keep 2us
  70.                                                                 else if( DelayCnt == `TIME_10US ) begin ReadDataReg <= {Dq, ReadDataReg[63:1]}; ReadEn <= 1'b1 ; end //at 10us read Dq data
  71.                                                                 else if( DelayCnt < `TIME_90US ) ReadEn <= 1'b1 ;
  72.                                                                 else begin DqReg <= 1'b1 ; ReadEn <= 1'b0 ; end //Dq is output
  73.                                                                 end
  74.         default        :        begin DqReg <= 1'b1; ReadEn <= 1'b0; end
  75.         endcase
  76.         end
  77.        
  78.        
  79.        
  80.         always @(posedge Clk )
  81.         begin
  82.         case(St)
  83.         RESET                        :        begin
  84.                                                         if(DelayCnt > `TIME_600US ) DelayCnt <= 32'd0; //delay for 600us
  85.                                                         else DelayCnt <= DelayCnt + 32'd1;
  86.                                                         end
  87.         READ_PULSE                :        begin
  88.                                                         if( DelayCnt >= `TIME_500US ) DelayCnt <= 32'd0; //delay for 500us
  89.                                                         else if( DelayCnt == `TIME_70US ) begin SlaveAck <= Dq ;  DelayCnt <= DelayCnt + 32'd1; end//delay for 70us //get slave reponse
  90.                                                         else DelayCnt <= DelayCnt + 32'd1;
  91.                                                         end
  92.         WRITE_ROM_CMD, READ_FAMILY_CODE, READ_CRC_CODE        :
  93.                                                                 begin
  94.                                                                 if(DelayCnt >= `TIME_100US ) //delay for 100us
  95.                                                                         begin
  96.                                                                         DelayCnt <= 32'd0;
  97.                                                                         if( BitCnt == 6'd7 ) BitCnt <= 6'd0;
  98.                                                                         else BitCnt <= BitCnt + 6'd1;
  99.                                                                         end
  100.                                                                 else begin BitCnt <= BitCnt; DelayCnt <= DelayCnt + 32'd1; end
  101.                                                                 end
  102.         READ_SERINUM_CODE:        begin
  103.                                                                 if(DelayCnt >= `TIME_100US )//delay for 100us
  104.                                                                         begin
  105.                                                                         DelayCnt <= 32'd0;
  106.                                                                         if(BitCnt == 6'd47) BitCnt <= 6'd0;
  107.                                                                         else BitCnt <= BitCnt + 6'd1;
  108.                                                                         end
  109.                                                                 else begin BitCnt <= BitCnt; DelayCnt <= DelayCnt + 32'd1; end
  110.                                                                 end
  111.         DATA_EN                        :        ReadFinish <= 1'b1;
  112.         default                        :        begin BitCnt <= 6'd0; SlaveAck <= 1'b1;  DelayCnt <= 32'd0; ReadFinish <= 1'b0; end
  113.         endcase
  114.         end
  115.        
  116.        
  117.        
  118.        
  119.         always [url=home.php?mod=space&uid=72445]@[/url] (posedge Clk)
  120.         begin
  121.         if( ~Rst ) St <= IDLE_STATE;
  122.         else
  123.                 case(St)
  124.                 IDLE_STATE                        :          St <= RESET;
  125.                 RESET                                :         if(        DelayCnt > `TIME_600US ) St <= READ_PULSE; //delay for 600us
  126.                 READ_PULSE                        :        begin
  127.                                                                         if( DelayCnt >= `TIME_500US ) //delay for 500us
  128.                                                                                 begin
  129.                                                                                 if(SlaveAck == 0 ) St <= WRITE_ROM_CMD;
  130.                                                                                 end
  131.                                                                 end
  132.                 WRITE_ROM_CMD                 :        if( ( DelayCnt >= `TIME_100US ) && (        BitCnt == 6'd7        ) ) St <= READ_FAMILY_CODE        ;                                                       
  133.                 READ_FAMILY_CODE        :        if( ( DelayCnt >= `TIME_100US ) && (        BitCnt == 6'd7        ) ) St <= READ_SERINUM_CODE         ;
  134.                 READ_SERINUM_CODE        :        if( ( DelayCnt >= `TIME_100US ) && (        BitCnt == 6'd47) ) St <= READ_CRC_CODE ;
  135.                 READ_CRC_CODE                :        if( ( DelayCnt >= `TIME_100US ) && (        BitCnt == 6'd7        ) ) St <= DATA_EN ;
  136.                 default                         :         ;
  137.                 endcase
  138.         end
  139.        
  140.        
  141.         endmodule
  142.        
  143.        
  144.        
  145.        


[/pay]

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:WX:feihu612 免费合作开发ECAT主从站

171

主题

1029

帖子

101

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