CRC算法学习资料及C语言实现分享

版权申诉
0 下载量 58 浏览量 更新于2024-10-11 收藏 19KB RAR 举报
资源摘要信息:"CRC_code.rar是一个包含有关循环冗余校验(CRC)的压缩资源包。CRC是数据传输中常用的一种错误检测技术,它基于数据的二进制位串,通过特定的多项式计算得出一个固定长度的校验值,该值随后附加在原始数据后一起传输。在接收到数据后,接收方可以使用相同的多项式再次计算CRC值,如果两次计算结果相同,则认为数据在传输过程中未发生错误。 描述中提到的个人整理的简单基本资料,说明这是一份针对初学者准备的入门资料。它不仅包含了CRC的基础理论知识,而且提供了一个用C语言编写的CRC算法实现。这份资料对于希望了解和实现CRC校验的新手来说,是一个有价值的资源。 文件中的CRC简单资料.doc可能包含了CRC的原理介绍、计算方法、CRC码的生成和检测过程、以及CRC在不同领域的应用。文档可能详细解释了CRC码的位数选择、生成多项式的确定、以及如何在软件中实现CRC校验。CRC码通常用于通信协议中,例如在以太网、无线局域网、USB等数据传输中,确保数据的完整性。 ***.txt文件名暗示了这可能是来自中国知名代码分享平台PUDN的链接或者是描述信息。PUDN是一个代码托管网站,用户可以在上面分享和下载各种编程语言编写的代码,包括C语言。该文本文件可能包含有关如何在PUDN网站上找到CRC相关代码的指导,或者是对下载链接的描述。 总的来说,这个压缩包对于初学者来说是一个非常实用的学习工具。它可以帮助新手快速理解CRC算法的基本原理,并通过实例代码学习如何在程序中应用CRC校验,从而提高数据传输的可靠性。" 知识点: 1. 循环冗余校验(CRC)的基本概念:CRC是一种广泛用于通信和存储领域的错误检测算法,主要用于发现数据传输或存储过程中的随机错误。 2. CRC的工作原理:通过将数据视作一个大的二进制数,使用一个预定的生成多项式进行除法运算,得到的余数作为校验码附加到原数据后进行传输。 3. CRC码的计算方法:首先选择合适的生成多项式,然后根据这个多项式计算数据的CRC校验值。计算过程中可能使用位反转、多项式运算等技术。 4. CRC的应用场景:CRC在校验网络通信、文件存储、数据同步等多种场合中广泛应用,用于保证数据的完整性和正确性。 5. C语言实现CRC:文件中包含了C语言编写的CRC算法实现,对于初学者而言,这是一个实践的机会,通过阅读和理解源代码,可以加深对算法的理解。 6. CRC码的位数选择和生成多项式的确定:这些都是CRC设计中的关键步骤,决定了算法的效率和可靠性。 7. 如何在PUDN网站上获取CRC相关的代码:介绍如何在PUDN网站中搜索和下载CRC算法相关的代码资源,这对于编程人员而言是一个便捷的学习途径。 通过学习上述知识点,学习者可以掌握CRC的基本原理和应用,并能在自己的项目中实现数据校验功能,提高数据处理的可靠性和安全性。

//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 上传

void PWM_THREAD(void* arg) { uint16_t t = 0; uint16_t key = 0; adc_init(); /* 初始化ADC */ chanl_init(); atmr_tmrx_npwm_chy_init(AUTOLOAD - 1, PRE_DIVIDER - 1); /* 初始化高级定时器PWM输出模式 */ dsp_mos_init(); dsp_rd_init(); DSP_MOS1(1); DSP_MOS2(1); DSP_MOS3(1); DSP_MOS4(1); Temp_data.pwm_ch=5; Temp_data.pwmdutyr=AUTOLOAD/4; // Temp_data.mos_ch = 2; Temp_data.mos_enable = 1; while (1) { osMutexAcquire(tempmutex,osWaitForever); key++; /* 输出5个PWM波(控制TMR8_CH1, 即PC6输出5个脉冲) */ t++; osDelay(1); if (t >= 10) /* 控制LED0闪烁, 提示程序运行状态 */ { t = 0; atmr_tmrx_npwm_chy_set(100); /* 高级定时器设置输出PWM个数 最多255个*/ } if(key>2000) { key=0; if(Temp_data.pwm_ch > 5) Temp_data.pwm_ch=0; Temp_data.tempmax = Temp_data.test_temp[0]; for(uint8_t i =0;i<8;i++) { if(Temp_data.test_temp[i]>Temp_data.tempmax) Temp_data.tempmax = Temp_data.test_temp[i]; } if(Temp_data.receivebuf[1]==WRITEDUTYR||(dutyr>0&&dutyr<AUTOLOAD)) { sutyrcrc = crc16_modbus(Temp_data.receivebuf,6); dutyrcrc_H = (uint16_t)((sutyrcrc&0xFF00)>>8); dutyrcrc_L = (uint16_t)(sutyrcrc&0x00FF); if((dutyrcrc_H == Temp_data.receivebuf[6])&&(dutyrcrc_L == Temp_data.receivebuf[7])) { pwmdutyr_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); pwmdutyr_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.pwmdutyr = (pwmdutyr_H<<8)|pwmdutyr_L; if(Temp_data.pwmdutyr>AUTOLOAD) { Temp_data.pwmdutyr=AUTOLOAD; } if(Temp_data.pwmdutyr==0) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; } pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(dutyr>0&&dutyr<AUTOLOAD) { Temp_data.pwmdutyr = dutyr; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } } else { if(Temp_data.tempmax>25) { Temp_data.pwmdutyr = (uint32_t)(Temp_data.tempmax*2); pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax<25) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax>50) { Temp_data.pwmdutyr = AUTOLOAD; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } // Temp_data.pwm_RD[Temp_data.pwm_ch-1] = readfault_channel(Temp_data.pwm_ch); } readRD(Temp_data.pwm_RD); } osMutexRelease(tempmutex); } },解析这段代码

2023-07-15 上传