CRC校验的重要性在此不必赘述,因为来看此帖的电子工程师都知道。 我们在设计CRC校验时,有时遇到的情况是串行比特流,即:每一个时钟读一个比特,并刷新CRC校验值,当读取最后一个比特后,CRC的值为最终校验结果。有时碰到的却是并行数据流,比如逐个字节、逐个字或逐个双字等很多情况。这时,每一个时钟周期也需要刷新一次CRC校验值,当读取最后一个并行数据后,需要得到最终的校验结果。 为满足这一需要,我特意用VHDL语言编写了一个任意比特宽、任意生成多项式的CRC校验模块ArbitraryCRC,实体如下,内容见附件。Entity ArbitraryCRC isGeneric( data_width : integer := 1; crc_polynomial : std_logic_vector := "10011" );Port( clock : in std_logic; rst : in std_logic; data : in std_logic_vector(data_width-1 downto 0); q : out std_logic_vector( crc_polynomial'length-2 downto 0) );End ArbitraryCRC;说明: data_width--表示输入数据流的比特宽度,当值为1时表示比特流,为8则是字节流,等等。默认为比特流。 crc_polynomial--生成多项式,默认为CRC_4采用的一种生成多项式。 clock--工作时钟,上升沿读取rst和data并刷新q值。 rst--校验开始,rst有效后接下来的一个时钟周期为需要校验的第一个数。 data--数据流。 q--CRC校验动态结果,最后一个数据有效后接下来的一个周期即为最终校验值,即:在最后一个数据的下一个周期读取q便得到校验结果。与大家共享,欢迎提宝贵意见。……