首页 > 其他分享 >尝试使用硬件电路来解释CRC计算(DS1820或者DS1822的CRC计算)

尝试使用硬件电路来解释CRC计算(DS1820或者DS1822的CRC计算)

时间:2023-05-28 15:22:36浏览次数:52  
标签:wire DS1820 DS1822 clk CRC FF rst data

      之前在培训讲解DS1822的测试时,CRC计算都是以C语言进行讲解的。今天在练习Verilog的时候,觉得也可以使用硬件电路来讲解。

      DS1820的CRC计算硬件电路示意图如下:

     这个是示意图,方框代表寄存器,XOR代表异或门。Verilog的硬件描述如下:

 1 module D_FF
 2 (
 3     input wire D, 
 4     input wire clk, 
 5     input wire rst,
 6     output reg Q
 7 );
 8     always @ (posedge clk, posedge rst)
 9     begin
10         if(rst) 
11             Q = 0;
12         else
13             Q = D;
14     end
15 endmodule
16 
17 module CRC_CHECK
18 (
19     input wire in,
20     input wire clk,
21     input wire rst,
22     output wire [7:0] Q
23 );
24     
25     wire xor7_in, xor3_in, xor2_in;
26     xor xor0(xor7_in, in, Q[0]);
27     xor xor1(xor2_in, xor7_in, Q[3]);
28     xor xor2(xor3_in, xor7_in, Q[4]);
29     
30     D_FF dq7(xor7_in, clk, rst, Q[7]);
31     D_FF dq6(Q[7], clk, rst, Q[6]);
32     D_FF dq5(Q[6], clk, rst, Q[5]);
33     D_FF dq4(Q[5], clk, rst, Q[4]);
34     D_FF dq3(xor3_in, clk, rst, Q[3]);
35     D_FF dq2(xor2_in, clk, rst, Q[2]);
36     D_FF dq1(Q[2], clk, rst, Q[1]);
37     D_FF dq0(Q[1], clk, rst, Q[0]);
38 endmodule
39 
40 module Test;
41     reg data;
42     reg clk;
43     reg rst;
44     wire [0:7] Q;
45     
46     CRC_CHECK DUT(.in(data), .clk(clk), .rst(rst), .Q(Q));
47     
48     initial
49     begin
50         data = 0;
51         clk = 0;
52         rst = 0;
53     end 
54     
55     reg [0:63] in_data;
56     initial 
57     begin
58         // 测试数据,包含CRC,所以有64位,注意是LSB到MSB的顺序
59         in_data = 64'b0100010011110000110110111110010000000000000000000000000010010110;
60     end 
61     
62     initial
63     begin
64         #3 rst = 1;
65         #3 rst = 0;
66     end 
67     
68     always
69     begin
70         #5 clk = ~clk;
71     end 
72     
73     integer i;
74     initial
75     begin
76         for(i = 0; i < 64; i = i + 1)
77         begin
78             @(posedge clk) data = in_data[i];
79         end 
80     end 
81 
82     initial
83     begin
84         $monitor($time," data=%b, Q=%b", data, Q);
85         #640 $stop;
86     end
87 endmodule

      因为ATE读取数据的时候,是LSB在前,所以Testbench中定义的时候是[0:63]而不是[63:0]。在Queta中查看原理图,结果如下:

        寄存器电路使用的D触发器,但是自动生成的电路中,寄存器的顺序有点颠倒,好像《数字设计-原理与实践》的作者吐槽过这个问题。这个不重要,这样原理图就能够和原理示意图对得上了。运行仿真,最终输出的结果为:

#                    0 data=0, Q=xxxxxxxx
#                    3 data=0, Q=00000000
#                   15 data=1, Q=00000000
#                   25 data=0, Q=10001100
#                   35 data=0, Q=01000110
#                   45 data=0, Q=00100011
#                   55 data=1, Q=10011101
#                   65 data=0, Q=01001110
#                   75 data=0, Q=00100111
#                   85 data=1, Q=10011111
#                   95 data=1, Q=01001111
#                  105 data=1, Q=00100111
#                  115 data=1, Q=00010011
#                  125 data=0, Q=00001001
#                  135 data=0, Q=10001000
#                  145 data=0, Q=01000100
#                  155 data=0, Q=00100010
#                  165 data=1, Q=00010001
#                  175 data=1, Q=00001000
#                  185 data=0, Q=10001000
#                  195 data=1, Q=01000100
#                  205 data=1, Q=10101110
#                  215 data=0, Q=11011011
#                  225 data=1, Q=11100001
#                  235 data=1, Q=01110000
#                  245 data=1, Q=10110100
#                  255 data=1, Q=11010110
#                  265 data=1, Q=11100111
#                  275 data=0, Q=01110011
#                  285 data=0, Q=10110101
#                  295 data=1, Q=11010110
#                  305 data=0, Q=11100111
#                  315 data=0, Q=11111111
#                  325 data=0, Q=11110011
#                  335 data=0, Q=11110101
#                  345 data=0, Q=11110110
#                  355 data=0, Q=01111011
#                  365 data=0, Q=10110001
#                  375 data=0, Q=11010100
#                  385 data=0, Q=01101010
#                  395 data=0, Q=00110101
#                  405 data=0, Q=10010110
#                  415 data=0, Q=01001011
#                  425 data=0, Q=10101001
#                  435 data=0, Q=11011000
#                  445 data=0, Q=01101100
#                  455 data=0, Q=00110110
#                  465 data=0, Q=00011011
#                  475 data=0, Q=10000001
#                  485 data=0, Q=11001100
#                  495 data=0, Q=01100110
#                  505 data=0, Q=00110011
#                  515 data=0, Q=10010101
#                  525 data=0, Q=11000110
#                  535 data=0, Q=01100011
#                  545 data=0, Q=10111101
#                  555 data=0, Q=11010010
#                  565 data=1, Q=01101001
#                  575 data=0, Q=00110100
#                  585 data=0, Q=00011010
#                  595 data=1, Q=00001101
#                  605 data=0, Q=00000110
#                  615 data=1, Q=00000011
#                  625 data=1, Q=00000001
#                  635 data=0, Q=00000000

  因为只是简单的仿真练习,就先不从文件读取数据了。后续可以从文件读取数据,然后对多行数据进行计算来验证CRC的电路是否正确。

 

标签:wire,DS1820,DS1822,clk,CRC,FF,rst,data
From: https://www.cnblogs.com/integrated-circuit-testing/p/17438296.html

相关文章

  • 三菱通过485bd板 CRC指令通讯示例 不含详细校验程序。
    三菱通过485bd板CRC指令通讯示例不含详细校验程序。所需硬件:三菱FX3Uplc,FX3U485BD通讯板,台达VFD-M变頻器。可以实现的功能:控制方面,正反转停止,頻率设定;读取运行状态、运行頻率、頻率指令、运行电流。内容包括plc程序,触摸屏程序,变頻器参数设置,通讯接线,视频教程。另外说明,别......
  • CRC 校验解析
    CRC校验解析一个CRC校验模型需要包含以下信息:WIDTH,指CRC校验码的最终位数(二进制)POLY,指用来做二进制除法的多项式。INIT,指CRC的初始值。存在初始值是为了避免全0数据的校验码恒为0。若初始值不为0,则对于不同长度的全0数据,校验码一般也会不一样。XOROUT,指最后对......
  • 51单片机学习笔记 STC89CRC (04)数码管和锁存器
    一、数码管 点亮:共阴极给高电平,共阳级给低电平,二进制点亮顺序为  dpgfedcba想要显示1,就可以给0x06, //00000110,bc亮起显示1.0x3F,//"0"0x06,//"1"0x5B,//"2"0x4F,//"3"0x66,//"4"0x6D,//"5"......
  • 51单片机学习笔记 STC89CRC (03)蜂鸣器和三级管
    蜂鸣器根据工作原理的不同可分为"电磁式蜂鸣器"和"压电式蜂鸣器"蜂鸣器根据驱动方式可分为"有源蜂鸣器"和"无源蜂鸣器"有源蜂鸣器:一通电就会叫无源蜂鸣器:必须用2k~5k的方波去驱动它 三极管直插式封装TO-92:面向三极管平的一面,从左往右数1.发射极2.基极3.集电极......
  • 51单片机学习笔记 STC89CRC
    STC89C51(Flash程序储器(字节)4k)52(Flash程序储器(字节)8k)53(Flash程序储器(字节)12k)...具体参考芯片手册STC89C系列51单片机封装方式1.DIP封装2.LQDP封装3.PLCC封装 电平特性数字电路中只有两种电平:高电平和低电平高电平:5V低电平:0VTTL电平信号被利用的最多是因......
  • 分享一个开源的windows安卓投屏工具,scrcpy
    看到scrcpy可能很多人会以为是大名鼎鼎的Scrcpy(一个十分强大的多线路爬虫框架),sorry今天分享的主角不是他,而是他:github地址:https://github.com/Genymobile/scrcpy废话不多说,下载windows版本开搞,推荐选择64位下载完毕后解压,然后双击scrcpy.exe然后不出意外的话,你就可以看到这......
  • 支持 "音频同步" 的安卓协同投屏软件:SCRCPY 2.0
    想要上班可以摸鱼或者提高效率,一些小伙伴会把安卓手机投屏到电脑上操作使用,目前大多数安卓手机厂商都自带有协同投屏功能,但都会有一定限制,只支持自家的产品。当然目前也有不少第三方安卓协同投屏软件代替品,例如:米卓同屏助手、LenovoOne、无界投屏等等,但是这些软件大多数都是基......
  • scrcpy有价值的操作指令
    物理键盘模拟(HID)默认情况下,scrcpy使用安卓按键或文本注入,这在任何情况都可以使用,但仅限于ASCII字符。在Linux上,scrcpy可以模拟为Android上的物理USB键盘,以提供更好地输入体验(使用USBHIDoverAOAv2):禁用虚拟键盘,并适用于任何字符和输入法。不过,这种方法仅支持USB......
  • 什么是CCRC信息安全服务资质?
    一、什么是CCRC?CCRC就是从前ISCCC的新名,也是就信息安全服务资质,规定了信息安全服务提供者在提供服务时应具备的服务安全通用要求和专业服务能力要求。今天,小编恒标知产就CCRC详细地说一说。二、CCRC的级别CCRC信息安全服务资质每一大类有一、二、三共三个级别,一级为最高级,三级为最......
  • BISS-C 8通道采集renishaw传感器及其CRC校验
    背景BISS-C是常见的位置编码器传输协议,相对于传统的协议,支持更快的传输速度,电器接口为电压差分RS422或者485,抗干扰能力较强,在精密位置传输中应用广泛。下述信息源自雷尼绍典型的请求循环进程如下:当空闲时,主接口使MA线保持高电平。光栅通过使SLO线保持高电平显示它已准备......