2013-07-26 2 views
-1

Я хотел бы проверить, если мой код является правильным для этого32 бита data_in и CRC7 VHDL код

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; 
+1

Работайте через [БЕЗОПАСНОЕ РУКОВОДСТВО ДЛЯ АЛГОРИТМОВ ОБНАРУЖЕНИЯ ОШИБКИ CRC] (http://www.repairfaq.org/filipg/LINK/F_crc_v3.html), пока вы не поймете процесс CRC. Затем сделайте маленький на бумаге. Постройте маленький в VHDL. Сделайте тестовый стенд, который его проверяет. Когда он работает, попробуйте выполнить полный CRC-код. –

ответ

0

Я нашел бумагу с помощью циклического избыточного кода (CRC) Полином выбора для встраиваемых сетей http://www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf Что в таблице 3 CRC7 определяющее обратное, как полиномиальное 0x44 выбора и является 1 + х^3 + х^7.

В OutputLogic.com есть CRC Generator, который выводит Verilog или VHDL. Шаг 1, установите ширину данных равным 32, установите ширину полинома равным 7. Протокол определяется пользователем, поскольку CRC7 не является одним из предопределенных случаев (и это похоже на присвоение класса). Нажмите кнопку «Применить» и выберите «Шаг 2.». На шаге 2 выберите X^1 и X^3 как полиномиальные коэффициенты, X^7. Нажмите кнопку «Создать код VHDL», и вы довольно быстро получите зеленое сообщение «Код генерируется».

Давайте просто скажем, что это выглядит удивительно, как ваш код (и вы должны проверить все это), и рассказывает нам, что он произвел в комментарии - lfsr (6: 0) = 1 + x^3 + x^7 ;

enter image description here

ли не многочлен правильно может зависеть от более авторитетного источника, кроме бумаги, я обнаружил, не говоря уже о том, следует ли вы быть с помощью другого определения CRC7, полиномиальная выбор 0x48 (X^4 вместо X^3). Также есть запись в Википедии по адресу Cyclic redundancy check, что указывает на то, что у вас есть правильный полином. Это относится к тому, что CRC немного.

После того, как вы проверили полином, который предполагается использовать, вы можете сгенерировать VHDL на OutputLogic.com, захватить его, сохранить в файл и, поскольку по умолчанию это имя объекта crc, вы можете написать testbench, чтобы сравнить два с утверждением для различных 32-битных тестовых случаев.

Или вы можете прочитать их и сравнить их (подсказка, что вы можете изменить имена в одном и сделать пустое пространство, игнорируя diff).

+0

Привет, Дэвид, спасибо за этот совет. Но как понять код, который генерируется, так как я запутался в том, как формируется сигнал для этого кода. – user2617652

+0

Я не вижу, как могут быть достигнуты понимание CRC-кодов и/или таргетинга на определенный размер слова (* Срочно). Неясно, что вы не понимаете, кодеки CRC вообще или как они применяются к определенному размеру блока. Субъект находится вне сферы действия тега vhdl. – user1155120

Смежные вопросы