根据Verilog言语完成CRC校验
1 前语。
(1) 什么是CRC校验?
CRC即循环冗余校验码:是数据。通讯。范畴中最常用的一种查错校验码,其特征是信息字段和校验字段的长度能够恣意选定。循环冗余查看(CRC)是一种数据传输检错功用,对数据进行多项式核算,并将得到的成果附在帧的后边,接纳设备也履行相似的。算法。,以确保数据传输的正确性和完整性。
LFSR核算CRC,能够用多项式G(x)标明,G(x) = X16+X12+X5+1模型可如下图所示。
(2) 校验原理。
其底子思维便是先在要发送的帧后边附加一个数(这个便是用来校验的校验码,但要留意,这儿的数也是二进制序列的,下同),生成一个新帧发送给接纳端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接纳端一起选定的某个特定数整除(留意,这儿不是直接选用二进制除法,而是选用一种称之为“模2除法”)。抵达接纳端后,再把接纳到的新帧除以(相同选用“模2除法”)这个选定的除数。由于在发送端发送数据帧之前就现已过附加一个数,做了“去余”处理(也就现已能整除了),所以成果应该是没有余数。假如有余数,则标明该帧在传输进程中呈现了过失。
要校验的数据加上此数据核算出来的crc组成新的数据帧,如下图所示。
模2除法:
模2除法与算术除法相似,但每一位除的成果不影响其它位,即不向上一位借位,所以实际上便是异或。在循环冗余校验码(CRC)的核算中有应用到模2除法。
(3) 进程。
CRC校验中有两个要害点,一是预先确定一个发送送端和接纳端都用来作为除数的二进制比特串(或多项式),能够随机挑选,也能够运用国际标准,可是最高位和最低位有必要为1;二是把原始帧与上面核算出的除数进行模2除法运算,核算出CRC码。
1. 挑选适宜的除数。
2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方法除上面的除数,得到的余数便是该帧的CRC校验码。留意,余数的位数必定只比除数位数少一位,也便是CRC校验码位数比除数位数少一位,假如前面位是0也不能省掉。
3. 将核算出来的CRC校验码附加在原数据帧后边,构建成一个新的数据帧进行发送;终究接纳端在以模2除法方法除以前面挑选的除数,假如没有余数,则阐明数据帧在传输的进程中没有犯错。
(4) 核算实例。
现假定挑选的CRC生成多项式为G(X) = X4+ X3+ 1,要求出二进制序列10110011的CRC校验码。下面是详细的核算进程:
①将多项式转化为二进制序列,由G(X) = X4+ X3+ 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001。
②多项式的位数位5,则在数据帧的后边加上5-1位0,数据帧变为101100110000,然后运用模2除法除以除数11001,得到余数。
③将核算出来的CRC校验码添加在原始帧的后边,真实的数据帧为101100110100,再把这个数据帧发送到接纳端。
④接纳端收到数据帧后,用上面选定的除数,用模2除法除掉,验证余数是否为0,假如为0,则阐明数据帧没有犯错。
2 流程。
(1)并行核算crc用。verilog。言语描绘是杂乱繁琐的,所以能够运用在线东西生成verilog或许VHDL模板:http://www.e。asic。s.com/webtools/crctool,模板生成的代码稍加修正即可运用。
(2)本次校验模型为G(x) = X16+X12+X5+1。在在线东西中操作相关选项生成模板。
模板v文件如下:
1 //////////////////////////////////////////////////////////////////////////////// 2 // Copyright (C) 1999-2008 Easics NV. 3 // This source file may be used and distribu。te。d without restric。ti。on 4 // provided that this copyright statement is not removed from the file 5 // and that any derivative work cont。ai。ns the original copyright notice 6 // and the associated disclaimer. 7 // 8 // THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS 9 // OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED10 // WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.11 //12 // Purpose : synthesizable CRC function13 // * polynomial: x^16 + x^12 + x^5 + 114 // * data width: 1615 //16 // Info : toolseasics.be17 // http://www.easics.com18 ////////////////////////////////////////////////////////////////////////////////19 module CRC16_D16;20 21 // polynomial: x^16 + x^12 + x^5 + 122 // data width: 1623 // convention: the fi。rs。t serial bit is D[15]24 function [15:0] nextCRC16_D16;25 26 input [15:0] Data;27 input [15:0] crc;28 reg [15:0] d;29 reg [15:0] c;30 reg [15:0] newcrc;31 begin32 d = Data;33 c = crc;34 35 newcrc[0] = d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[8] ^ c[11] ^ c[12];36 newcrc[1] = d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[9] ^ c[12] ^ c[13];37 newcrc[2] = d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[10] ^ c[13] ^ c[14];38 newcrc[3] = d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[11] ^ c[14] ^ c[15];39 newcrc[4] = d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[12] ^ c[15];40 newcrc[5] = d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[13];41 newcrc[6] = d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[14];42 newcrc[7] = d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15];43 newcrc[8] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14] ^ c[15];44 newcrc[9] = d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[9] ^ c[12] ^ c[13] ^ c[15];45 newcrc[10] = d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[5] ^ c[9] ^ c[10] ^ c[13] ^ c[14];46 newcrc[11] = d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[6] ^ c[10] ^ c[11] ^ c[14] ^ c[15];47 newcrc[12] = d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[7] ^ c[8] ^ c[15];48 newcrc[13] = d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[8] ^ c[9];49 newcrc[14] = d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[9] ^ c[10];50 newcrc[15] = d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[10] ^ c[11];51 nextCRC16_D16 = newcrc;52 end53 endfunction54 endmodule。
(3)修正模板终究如下:
1 `timescale 1ns/1ps 2 module crc16_test ( 3 input wire i_clk , //。时钟。; 4 input wire i_rst_n , //同步复位; 5 input wire i_din_valid , //输入数据有用; 6 input wire [15:0] i_din , //输入数据; 7 output wire o_dout_valid , //输出CRC值有用; 8 output wire [15:0] o_dout //输出CRC; 9 );10 reg [15:0] r_dout;11 wire [15:0] d;12 wire [15:0] c;13 assign d = i_din;14 assign c = r_dout;15 always (posedge i_clk) begin16 if (~i_rst_n) 17 r_dout <= 16'hffff; //初始值为ffff;18 else if (i_din_valid) 19 begin //核算逻辑;20 r_dout[0] = d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[8] ^ c[11] ^ c[12];21 r_dout[1] = d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[9] ^ c[12] ^ c[13];22 r_dout[2] = d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[10] ^ c[13] ^ c[14];23 r_dout[3] = d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[11] ^ c[14] ^ c[15];24 r_dout[4] = d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[12] ^ c[15];25 r_dout[5] = d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[13];26 r_dout[6] = d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[14];27 r_dout[7] = d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15];28 r_dout[8] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14] ^ c[15];29 r_dout[9] = d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[9] ^ c[12] ^ c[13] ^ c[15];30 r_dout[10] = d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[5] ^ c[9] ^ c[10] ^ c[13] ^ c[14];31 r_dout[11] = d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[6] ^ c[10] ^ c[11] ^ c[14] ^ c[15];32 r_dout[12] = d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[7] ^ c[8] ^ c[15];33 r_dout[13] = d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[8] ^ c[9];34 r_dout[14] = d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[9] ^ c[10];35 r_dout[15] = d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[10] ^ c[11];36 end37 end 38 reg r_dout_valid = 0; 39 always (posedge i_clk) //输入数据在一个时钟内完结CRC核算,下一个时钟输出;40 begin41 r_dout_valid <= i_din_valid;42 end43 44 assign o_dout_valid = r_dout_valid;45 assign o_dout = r_dout ;46 47 endmodule // end the crc16_test model;。 <= 16'hffff; //初始值为ffff;18 else if (i_din_valid) 19 begin //计算逻辑;20 r_dout[0] = d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[8] ^ c[11] ^ c[12];21 r_dout[1] = d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[9] ^ c[12] ^ c[13];22 r_dout[2] = d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[10] ^ c[13] ^ c[14];23 r_dout[3] = d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[11] ^ c[14] ^ c[15];24 r_dout[4] = d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[12] ^ c[15];25 r_dout[5] = d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[13];26 r_dout[6] = d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[14];27 r_dout[7] = d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15];28 r_dout[8] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14] ^ c[15];29 r_dout[9] = d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[9] ^ c[12] ^ c[13] ^ c[15];30 r_dout[10] = d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[5] ^ c[9] ^ c[10] ^ c[13] ^ c[14];31 r_dout[11] = d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[6] ^ c[10] ^ c[11] ^ c[14] ^ c[15];32 r_dout[12] = d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[7] ^ c[8] ^ c[15];33 r_dout[13] = d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[8] ^ c[9];34 r_dout[14] = d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[9] ^ c[10];35 r_dout[15] = d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[10] ^ c[11];36 end37 end 38 reg r_dout_valid = 0; 39 always @(posedge i_clk) //输入数据在一个时钟内完成CRC计算,下一个时钟输出;40 begin41 r_dout_valid <= i_din_valid;42 end43 44 assign o_dout_valid = r_dout_valid;45 assign o_dout = r_dout ;46 47 endmodule // end the crc16_test model;3。
仿真。
仿真成果和在线东西核算成果进行比较,在线东西地址:http://www.ip33.com/crc.html。(1)编写tb文件,对代码进行测验,测验成果如下图所示:(2)在线校验。输入需求校验的数据,挑选参数模型,输入初始值(此次crc成果的前一个crc值,代码中初始化为ffff)。能够比照发现核算无误。第一次核算0011(初始值为ffff),成果为1f1f。第2次核算0013(初始值为1f1f),成果为d2c1。4 归纳。本次归纳参阅芯片为:xc7k325。tf。fg676-2。
(1) 资源运用量如下图所示。(2) 模块时钟束缚为100M,裕量如下图所示,满意时序要求。内容来源:https://harmonyscentsg.com/app-1/bài baccarat,https://chatbotjud-hml.saude.mg.gov.br/app-1/palavra-do-dia-jogo
(责任编辑:新闻)