1、CRC 编码译码模块程序设计本课题的最终目标是,用 Verilog HDL 硬件描述语言编写出 CRC 循环冗余校验码的编解码模块电路,并通过仿真。前边三部分讨论了 CRC 码的编译码理论,下面以这些理论为指导,来编些 CRC 编译码模块。本课题 选用 CCITT 建议的标准生成多项式,即 g(x)= X16+X12 +X5+1。因此,nkr 16,即有 16 位监督位。但 k 的值并未给定,也就是信息位的个数没有给定。确定信息位的个数 k 时,一定要把握一条原则:通过 nk16 计算出n 值后,必须保证使 g(x)是 xn1 的因式。 根据此原则,可以得出对 k 取值的要求:k 必须为字节长
2、度的整数倍数,这样才能保证 xn1 被 g(x)整除。为了提高编译码模块的通用性,本程序采用可参数化设计,设参数 width表示输入数据的位宽,参数 amount 表示码组中的信息位部分含有输入数据的个数。模块中 width 暂取值为 1,amount 暂取值为 32。也就是说,每 32 位信息位后加 16 位 CRC 监督位。编码模块“crc_send ”和译码模块“crc_receive”的外部引脚和连接关系如下图所示:以上两模块的各个引脚定义如下:data_inwidth-1:0编码模块信息数据输入,位宽为 width。reset编码模块计数器预置信号输入(上升沿有效) 。clk时钟信号
3、输入。err迫使接收端接收数据出错信号输入(高电平有效) 。data_sendwidth*amount+15:0编码后的 CRC 循环码组输出,位宽为width*amount+16。ready(output)编码模块的准备就绪信号输出,告诉译码模块可以接收了(高电平有效) 。data_receivewidth*amount+15:0译码模块接收 CRC 循环码组的输入。ready(input)译码模块准备就绪信号输入(高电平有效) 。data_outwidth-1:0译码模块译码后信息数据的输出,位宽为 width。resend重发信号输出(高电平有效) 。1编码模块设计整体思路:每个时钟上升
4、沿到来时,输入端送来一组位宽为 width 的数据data_inwidth-1:0,在输入缓冲器 buf_in 里将前 amount 个时钟上升沿到来的width*amount 位数据累积起来作为码组中的信息位部分,并在最后一个时钟周期里进行除法运算(将信息位左移 16 位,再除以 CCITT 标准生成多项式对应的校验序列 1,0001,0000,0010,0001)求得 16 位余数作为监督位,再与信息位组装起来成为完整的 CRC 码组并发送给译码端,同时将准备就绪信号 ready 置为1。Verilog HDL 程序如下:module crc_send(data_send,ready,da
5、ta_in,reset,clk);parameter width=1,amount=32; /参数定义,输入数据位宽 width,码组中的信息/位部分由 amount 个输入数据组成。output width*amount+15:0 data_send;output ready; /握手信号,即发送数据准备就绪信号。input width-1:0 data_in;input reset,clk;reg width*amount+15:0 data_send;reg ready; reg width*amount+15:0 buf_in; /输入缓冲器。integer n,i; / n 为累积
6、amount 个输入数据的计数器;/ i 为做除法时的计数器。/initial n=0; initial 语句不被综合器支持,因此,为计数器 n 预置 0 值时不能用/如上所示的 initial 语句。在此,引入预置端 reset,专门用于开始计数前为计数器 n 赋 0/值。always (posedge reset or posedge clk) beginif(reset)n=0; /检测到 reset 信号的上升沿时,为 n 赋 0 值。else if(n1;shift15=shift14shift11;if(!shift15:12) shift15:12=4b1000; endcrc_
7、send send(data_send,ready,data_in,reset,clk); /调用被测试编码模块。crc_receive receive(data_out,resend,data_send,ready,clk,err); /调用被测试译码模块。endmodule 编写测试模块的关键点是:reset 和 err 两控制信号产生的时机必须恰到好处,否则被测试模块就检测不到它们,达不到测试目的。也就是说,上边 initial语句中延时多少的确定是关键。延时很可能一次确定不成功,可以通过多次仿真观察波形,逐步找到正确的时机。4仿真至此,功能模块和测试模块都已编写完毕,最后用 Veril
8、ogXL 仿真器进行仿真。在仿真器里,可以单步执行,跟踪观察变量值的变化;也可以通过波形观察器观察完整的仿真波形,看到清晰的时序关系。五、小结通过本次编译码模块的设计,深刻体会到要想成功的设计出预定功能的电路,以下几点能力缺一不可:首先,必须对电路功能有明确的了解,对电路的工作机理有详细的认识,对该电路在整个电子系统中所处地位以及它承前启后的作用也必须有准确的了解。其次,在具备上述要求的基础上,还必须能够熟练的使用 Verilog HDL 硬件描述语言,对其中的各种语法要能灵活运用,这样才能将自己的设计思想准确表达出来,进而得到预期电路。再次,在从电路的功能到 HDL 语言描述的转变过程中,还存在着一个选择算法问题,通常实现一个特定功能的电路往往有多种不同的算法,我们要尽量选择最佳的算法。