Перейти к содержанию
    

Ну вы уже совсем.

 

Без комментариев.

 

Спасибо, что показали ошибку/опечатку :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/6/2008 at 11:05 AM, xvr said:

Сильно :)

Функция nextCRC16_D8(Data,CRC)


 

signal CRC : STD_LOGIC_VECTOR (15 downto 0) := x"FFFF";


CRC_counter : process (clk,reset_CRC)
begin
if reset_CRC = '1' then
CRC <= x"FFFF";
elsif clk'event and clk='1' and SLD = '1' then
CRC <= nextCRC16_D8(data,CRC);

end if;

end process CRC_counter;
 

 

Народ!

А для варианта    nextCRC16_D16(Data,CRC) ?

Работа всего блока должна быть с теми же CRC(для одного и того же набора данных на входе как для nextCRC16_D8 ) ?...

У меня получается совсем другой...   Причем, если вставляю его родной код CRC на вход, то новый раунд честно даёт  0000!

Растерян!...

Проверка велась на https://www.lammertbies.nl/comm/info/crc-calculation

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/23/2021 at 3:36 PM, Мур said:

Народ!

Лучшее - враг хорошего!  Психанул и форсировал на 2 фазы имеющееся...

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--====================================================================
entity crc16_modbus is
port(
	en 			: 	in 	std_logic;							-- разрешение работы
       clk	  		:	in  	std_logic;						-- строб вычисления
        reset   	:	in  	std_logic;						-- Сброс
        data_in 	:	in  	std_logic_vector(15 downto 0);	-- Входные данные
        crc_out 	:	out 	std_logic_vector(15 downto 0)	-- Выход контрольной суммы
	);
end entity;


architecture arh of crc16_modbus is

 signal en2 			: 	 	std_logic;

begin
	
process(clk, reset)
variable crc : std_logic_vector (15 downto 0);
variable f : std_logic;
begin
if (reset = '1') then
	 crc := x"FFFF";	 
elsif (rising_edge(clk)) then
	en2	<=		en;
	if (en = '1') then
		crc := crc(15 downto 8) & (crc(7 downto 0) xor data_in(7 downto 0));
	elsif  (en2 = '1') then
		crc := crc(15 downto 8) & (crc(7 downto 0) xor data_in(15 downto 8));
	end if;	

	if (en = '1') or (en2 = '1') then
		for i in 0 to 7 loop   
			f := crc(0);
			crc := '0' & crc(15 downto 1);              
			if (f = '1') then
				crc := crc xor x"A001";
			end if;
		end loop;
	end if;
end if;

crc_out <= crc;

end process;
end arh;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, данное видео показывающее визуализацию CRC и параллельного CRC на FPGA должно быть полезным:

https://www.youtube.com/watch?v=_tB576MhmrI

fee219f1d52148081e6dbd151c974a8c.PNG

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...