我想检查一下我的代码是否正确
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;
答案 0 :(得分:0)
我找到了一篇用于嵌入式网络的文章循环冗余码(CRC)多项式选择http://www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf在表3中将CRC7逆指定为多项式选择0x44并且是1 + x ^ 3 + x ^ 7.
OutputLogic.com有一个CRC Generator,它将输出Verilog或VHDL。步骤1,将数据宽度设置为32,将多项式宽度设置为7.协议是用户定义的,因为CRC7不是预定义的情况之一(听起来像是一个类赋值)。点击Apply按钮,选择步骤2.在步骤2中,选择X ^ 1和X ^ 3作为多项式系数,假设为X ^ 7。点击Generate VHDL Code按钮,你会很快收到绿色信息'Code is generated'。
让我们说它看起来很像你的代码(你应该检查整个事情),并告诉我们它在评论中产生了什么 - lfsr(6:0)= 1 + x ^ 3 + x ^ 7;
多项式是否正确可能取决于比我发现的文章更权威的来源,更不用说你是否应该使用其他CRC7定义,多项式选择0x48(X ^ 4而不是X ^ 3) 。在Cyclic redundancy check上还有一个维基百科条目,表明你(我们)有正确的多项式。它进入了什么样的CRC。
一旦你验证了你应该使用的多项式,就可以在OutputLogic.com上生成VHDL,抓住它,保存到文件中,因为它的实体名称是crc,默认情况下你可以编写一个测试平台来比较两者各种32位测试用例的断言声明。
或者你可以通读两者并比较它们(暗示你可以在一个地方改变名称并做一个忽略差异的空白区域)。