CRC校验全面解读:从理论到实践的深度讲解

版权申诉
0 下载量 5 浏览量 更新于2024-10-19 收藏 221KB ZIP 举报
资源摘要信息:"CRC.zip文件中包含了关于CRC(循环冗余校验)的详细介绍和解释。CRC校验是一种广泛应用于计算机网络和存储设备中,用来检测数据传输或写入过程中是否出现错误的方法。这种技术是基于二进制运算的,通过数据块和一个预定的除数(通常是一个多项式)来生成一个短的固定位数校验值(CRC校验码)。当数据被传输或存储后,通过相同的除数重新计算接收数据的CRC校验码,并与原始的校验码进行比较。如果两次计算出的校验码相同,那么可以认为数据在传输或存储过程中没有发生错误。 CRC校验的优点在于它具有较高的错误检测率,尤其在检测突发错误(即连续的一串错误)方面表现良好。它能够检测出数据中所有奇数个错误以及任意长度为小于校验码长度的错误串。但是,CRC校验并不能检测出所有类型的错误,例如两个错误的位发生反转就可能无法被检测出来。 在文件CRC.pdf中,文档将详细介绍CRC校验的工作原理,包括多项式的概念、如何生成CRC校验码以及在不同系统和协议中CRC的应用。文档还会讨论CRC校验码的长度选择、常见的CRC算法(如CRC-8、CRC-16、CRC-32等)以及它们的性能特点。此外,文件可能会提供一些实际例子和使用场景来帮助理解CRC校验的实际操作,如何在软件和硬件层面上实现CRC校验。 CRC校验在多个领域都有着广泛的应用,比如在以太网、无线通信、USB接口、存储介质(如硬盘驱动器和固态驱动器)中都有使用CRC校验来确保数据的完整性和正确性。在某些情况下,还会将CRC与其他校验技术(如奇偶校验位、海明码等)结合使用,以进一步提高数据传输的可靠性。 总之,文件CRC.pdf为学习和深入了解CRC校验提供了一个宝贵的资源,不仅涵盖了CRC校验的理论基础,还包括了它的实际应用和实施方法。对于希望掌握这一技术的读者来说,这份资料无疑是一个全面而详尽的学习材料。"
2023-05-27 上传

//XW_crc_p.v `pragma protect begin module DW_crc_p( data_in, crc_in, crc_ok, crc_out ); parameter integer data_width = 16; parameter integer poly_size = 16; parameter integer crc_cfg = 7; parameter integer bit_order = 3; parameter integer poly_coef0 = 4129; parameter integer poly_coef1 = 0; parameter integer poly_coef2 = 0; parameter integer poly_coef3 = 0; input [data_width-1:0] data_in; input [poly_size-1:0] crc_in; output crc_ok; output [poly_size-1:0] crc_out; `define DW_max_data_crc_1 (data_width>poly_size?data_width:poly_size) wire [poly_size-1:0] crc_in_inv; wire [poly_size-1:0] crc_reg; wire [poly_size-1:0] crc_out_inv; wire [poly_size-1:0] crc_chk_crc_in; reg [poly_size-1:0] crc_inv_alt; reg [poly_size-1:0] crc_polynomial; `include "bit_order_crc_function.inc" `include "bit_order_data_function.inc" `include "calculate_crc_w_in_function.inc" `include "calculate_crc_function.inc" `include "calculate_crc_crc_function.inc" generate //begin genvar bit_idx; reg [63:0] crc_polynomial64; reg [15:0] coef0; reg [15:0] coef1; reg [15:0] coef2; reg [15:0] coef3; assign coef0= poly_coef0; assign coef0= poly_coef1; assign coef0= poly_coef2; assign coef0= poly_coef3; assign crc_polynomial64 = {coef3, coef2, coef1, coef0}; assign crc_pollynomial = crc_polynomial64[poly_size-1:0]; case(crc_cfg/2) 0: assign crc_inv_alt = {poly_size{1'b0}}; 1: for(bit_idx = 0; bit_idx<poly_sizel bit_idx=bit_idx+1) assign crc_inv_alt[bit_idx] = (bit_idx % 2)? 1'b0:1'b1; 2: for(bit_idx=0; bit_idx<poly_size; bit_idx=bit_idx+1) assign crc_inv_alt[bit_idx] = (bit_idx % 2)?1'b1:1'b0; 3: assign crc_inv_alt = { poly_size{1'b1}}; endcase endgenerate assign crc_in_inv = bit_order_crc(crc_in) ^ crc_inv_alt; assign crc_reg = calculate_crc(bit_order_data(data_in)); assign crc_out_inv = crc_reg; assign crc_out = bit_order_crc(crc_out_inv)^ crc_inv_alt; assign crc_chk_crc_in = calculate_crc_crc(crc_reg, crc_in_inv); assign crc_ok = (crc_chk_crc_in ==0); `undef DW_max_data_crc_1 endmodule `pragma protect end can you write a testbench for this piece of CRC verilog code so that this verilog file and the testbench can be used togerther by vcs to verify the correctness of this verilog file?

2023-06-14 上传
2023-05-27 上传

import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu import struct # 打开两个串口 com1 = serial.Serial(port='com2', baudrate=38400, bytesize=8, parity='N', stopbits=1) com2 = serial.Serial(port='com3', baudrate=38400, bytesize=8, parity='N', stopbits=1) # 创建Modbus RTU主机(master) master = modbus_rtu.RtuMaster(com1) master.set_timeout(1.0) master.set_verbose(True) # 读取保持寄存器数据 red = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9) print(red) # 将字节数组划分为若干个长度为4的子数组 # def hex_f(a,b): # # g1=b # # z=a+g1#高低16位组合 # # z1=hex(z)[2:]#取0x后边的部分 # # # print(z1) # # return struct.unpack('!f', z1.decode('hex'))[0]#返回浮点数 # # e = hex_f(red[0],red[1]) # # print(e) red1 = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9)[0] # 这里可以修改需要读取的功能码 print(red1) new = int(red1 * 0.8) print(new) red =master.execute(1, function_code=cst.WRITE_MULTIPLE_REGISTERS, starting_address=0, output_value=[new]) # 读取输入寄存器数据 input_regs = master.execute(1, cst.READ_INPUT_REGISTERS, 0, 9) print(input_regs,1) # 读取输入线圈数据 input_bits = master.execute(1, cst.READ_COILS, 0, 9) print(input_bits,2) # 读取输出线圈数据 output_bits = master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 9) print(output_bits,3) # 将所有读取数据打包为Modbus RTU消息并写入com2串口 data = red + input_regs + input_bits + output_bits com2.write(master._do_crc(data)) # 关闭串口 com1.close() com2.close()AttributeError: 'RtuMaster' object has no attribute '_do_crc'咋修改不报错

2023-05-27 上传