-1

我想检查我的代码是否正确

32 bits data_in
7 bits CRC

请帮我检查一下,如果可能的话,请解释一下这段代码是如何工作的。

library ieee;
use ieee.std_logic_1164.all;

entity CRC7_32 is
port (data_in : in std_logic_vector (31 downto 0);
crc_en , rst, clk : in std_logic;
crc_out : out std_logic_vector (6 downto 0));

end CRC7_32;

architecture behavior of CRC7_32 is

signal crc_block: std_logic_vector (6 downto 0);
signal crc_next_state: std_logic_vector (6 downto 0);

begin

crc_out <= crc_block;

crc_next_state(0) <= crc_block(5) xor crc_block(6) xor data_in(0) xor data_in(4) xor data_in(7) xor data_in(8) xor data_in(12) xor data_in(14) xor data_in(15) xor data_in(16) xor data_in(18) xor data_in(20) xor data_in(21) xor data_in(23) xor data_in(24) xor data_in(30) xor data_in(31);
crc_next_state(1) <= crc_block(6) xor crc_block(0) xor data_in(1) xor data_in(5) xor data_in(8) xor data_in(9) xor data_in(13) xor data_in(15) xor data_in(16) xor data_in(17) xor data_in(19) xor data_in(21) xor data_in(22) xor data_in(24) xor data_in(25) xor data_in(31);
crc_next_state(2) <= crc_block(0) xor crc_block(1) xor data_in(2) xor data_in(6) xor data_in(9) xor data_in(10) xor data_in(14) xor data_in(16) xor data_in(17) xor data_in(18) xor data_in(20) xor data_in(22) xor data_in(23) xor data_in(25) xor data_in(26);
crc_next_state(3) <= crc_block(1) xor crc_block(2) xor crc_block(5) xor crc_block(6) xor data_in(0) xor data_in(3) xor data_in(4) xor data_in(8) xor data_in(10) xor data_in(11) xor data_in(12) xor data_in(14) xor data_in(16) xor data_in(17) xor data_in(19) xor data_in(20) xor data_in(26) xor data_in(27) xor data_in(30) xor data_in(31);
crc_next_state(4) <= crc_block(2) xor crc_block(3) xor crc_block(6) xor data_in(1) xor data_in(4) xor data_in(5) xor data_in(9) xor data_in(11) xor data_in(12) xor data_in(13) xor data_in(15) xor data_in(17) xor data_in(18) xor data_in(20) xor data_in(21) xor data_in(27) xor data_in(28) xor data_in(31);
crc_next_state(5) <= crc_block(3) xor crc_block(4) xor data_in(2) xor data_in(5) xor data_in(6) xor data_in(10) xor data_in(12) xor data_in(13) xor data_in(14) xor data_in(16) xor data_in(18) xor data_in(19) xor data_in(21) xor data_in(22) xor data_in(28) xor data_in(29);
crc_next_state(6) <= crc_block(4) xor crc_block(5) xor data_in(3) xor data_in(6) xor data_in(7) xor data_in(11) xor data_in(13) xor data_in(14) xor data_in(15) xor data_in(17) xor data_in(19) xor data_in(20) xor data_in(22) xor data_in(23) xor data_in(29) xor data_in(30);

process (clk,rst)

begin

if (rst = '1') then
crc_block <= b"0000000";
elsif (clk'EVENT and clk = '1') then
if (crc_en = '1') then
crc_block <= crc_next_state;
end if;
end if;
end process;
end architecture behavior;
4

1 回答 1

0

我发现了一篇论文 Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks http://www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf在表 3 中将 CRC7 逆指定为多项式选择 0x44 并且是1+x^3+x^7。

OutputLogic.com 有一个CRC 生成器,可以输出 Verilog 或 VHDL。第 1 步,将数据宽度设置为 32,将多项式宽度设置为 7。该协议是用户定义的,因为 CRC7 不是预定义的情况之一(听起来像是一个类分配)。点击 Apply 按钮并选择 Step 2。在 Step 2 中,选择 X^1 和 X^3 作为多项式系数,假设 X^7。点击 Generate VHDL Code 按钮,您将很快得到一条绿色消息“代码已生成”。

我们只是说它看起来很像你的代码(你应该检查整个事情),并在评论中告诉我们它产生了什么—— lfsr(6:0)=1+x^3+x^7;

在此处输入图像描述

多项式是否正确可能取决于比我发现的论文更权威的来源,更不用说您是否应该使用其他 CRC7 定义,多项式选择 0x48(X^4 而不是 X^3)。还有一个关于循环冗余检查的维基百科条目表明你(我们)有正确的多项式。它涉及到什么是 CRC。

一旦你验证了你应该使用的多项式,你可以在 OutputLogic.com 上生成 VHDL,抓住它,保存到一个文件中,因为它的实体名称默认是 crc,你可以编写一个测试台来比较两者与一个断言语句适用于各种 32 位测试用例。

或者您可以通读这两者并比较它们(提示您可以将名称更改为一个并做一个空格忽略差异)。

于 2013-07-26T07:23:22.050 回答