资料介绍
CRC校验的重要性在此不必赘述,因为来看此帖的电子工程师都知道。
我们在设计CRC校验时,有时遇到的情况是串行比特流,即:每一个时钟读一个比特,并刷新CRC校验值,当读取最后一个比特后,CRC的值为最终校验结果。有时碰到的却是并行数据流,比如逐个字节、逐个字或逐个双字等很多情况。这时,每一个时钟周期也需要刷新一次CRC校验值,当读取最后一个并行数据后,需要得到最终的校验结果。
为满足这一需要,我特意用VHDL语言编写了一个任意比特宽、任意生成多项式的CRC校验模块ArbitraryCRC,实体如下,内容见附件。
Entity ArbitraryCRC is
Generic(
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便得到校验结果。
与大家共享,欢迎提宝贵意见。