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

Применить CRC для массива.

Есть модуль CRC

entity CRC is
port
(
    CLK:      in  std_logic;
    RST:      in  std_logic;
      
    DATA_IN:  in  std_logic_vector (7 downto 0);
    CRC_EN:   in  std_logic;
       
    CRC_OUT:  out std_logic_vector (15 downto 0)
);
end CRC;

architecture behavior of CRC is

signal lfsr_q: std_logic_vector (15 downto 0) := (others => '1');
signal lfsr_c: std_logic_vector (15 downto 0);
	 
begin

    crc_out <= lfsr_q;

    lfsr_c(0) <= lfsr_q(8) xor lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor 
                 lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor 
                 data_in(0) xor data_in(1) xor data_in(2) xor data_in(3) xor 
                 data_in(4) xor data_in(5) xor data_in(6) xor data_in(7);
    lfsr_c(1) <= lfsr_q(9) xor lfsr_q(10) xor lfsr_q(11) xor lfsr_q(12) xor 
                 lfsr_q(13) xor lfsr_q(14) xor lfsr_q(15) xor data_in(1) xor 
                 data_in(2) xor data_in(3) xor data_in(4) xor data_in(5) xor 
                 data_in(6) xor data_in(7);
    lfsr_c(2) <= lfsr_q(8) xor lfsr_q(9) xor data_in(0) xor data_in(1);
    lfsr_c(3) <= lfsr_q(9) xor lfsr_q(10) xor data_in(1) xor data_in(2);
    lfsr_c(4) <= lfsr_q(10) xor lfsr_q(11) xor data_in(2) xor data_in(3);
    lfsr_c(5) <= lfsr_q(11) xor lfsr_q(12) xor data_in(3) xor data_in(4);
    lfsr_c(6) <= lfsr_q(12) xor lfsr_q(13) xor data_in(4) xor data_in(5);
    lfsr_c(7) <= lfsr_q(13) xor lfsr_q(14) xor data_in(5) xor data_in(6);
    lfsr_c(8) <= lfsr_q(0) xor lfsr_q(14) xor lfsr_q(15) xor data_in(6) xor 
                 data_in(7);
    lfsr_c(9) <= lfsr_q(1) xor lfsr_q(15) xor data_in(7);
    lfsr_c(10) <= lfsr_q(2);
    lfsr_c(11) <= lfsr_q(3);
    lfsr_c(12) <= lfsr_q(4);
    lfsr_c(13) <= lfsr_q(5);
    lfsr_c(14) <= lfsr_q(6);
    lfsr_c(15) <= lfsr_q(7) xor lfsr_q(8) xor lfsr_q(9) xor lfsr_q(10) xor 
                  lfsr_q(11) xor lfsr_q(12) xor lfsr_q(13) xor lfsr_q(14) xor 
                  lfsr_q(15) xor data_in(0) xor data_in(1) xor data_in(2) xor 
                  data_in(3) xor data_in(4) xor data_in(5) xor data_in(6) xor 
                  data_in(7);
						
						
process (CLK, RST)
    begin
        if RST = '1' then
            lfsr_q   <= (others => '1');
        elsif rising_edge(CLK) then
            if CRC_EN = '1' then
                lfsr_q <= lfsr_c;
            end if;
        end if;
    end process;		
	 
end behavior;

Но это CRC на один байт. А если мне нужен CRC на массив байтов, что я делаю с промежуточным результатом? и как вообще перебрать массив, в  for i in 0 to x loop?

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


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

1 minute ago, jenya7 said:

Но это CRC на один байт. А если мне нужен CRC на массив байтов, что я делаю с промежуточным результатом? и как вообще перебрать массив, в  for i in 0 to x loop?

И я снова предложу вам взять ручку и бумажку и нарисовать структурную схему того что вы делаете. Потом функциональную, в которой ядро CRC это вот это ваше ядро. И тогда вам станет ясно какую функциональность надо вам добавить, что выполнить требования вашего ТЗ. 

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


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

2 minutes ago, des00 said:

И я снова предложу вам взять ручку и бумажку и нарисовать структурную схему того что вы делаете. Потом функциональную, в которой ядро CRC это вот это ваше ядро. И тогда вам станет ясно какую функциональность надо вам добавить, что выполнить требования вашего ТЗ. 

мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало.

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


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

4 minutes ago, jenya7 said:

мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало.

Что бы RTL viewer нарисовал, нужно сначала написать код. А если не знаешь, какой код писать - RTL viewer ничего не нарисует. Яйцо и курица)

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


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

3 minutes ago, jenya7 said:

мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало.

RTL Viewer рисует вам то что вы написали. А у вас проблема с тем что написать, иначе вы бы с вашим вопросом, тут не появились. А основная фаза до того как написать, это поставить четкое ТЗ и сделать по этому заданию структурную схему. 

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


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

Типовая задачка. 

1) Генерим в любом онлайн генераторе CRC (если он типовой) код на нужную ширину данных
2) При поступлении очередных данных пропускаем через эту функцию/модуль
3) Если концовка всегда плавающая (не равна ширине данных), то также придется сгенерировать код crc на другую/ие ширину данных и обрабатывать это

 

У вас в коде вроде как не стандартный CRC16 полином, надо поковыряться поискать, что за полином

 

UPD1

Нашел, у вас полином CRC16 для USB2.0
Юзайте такой онлайн генератор кода
http://outputlogic.com/

 

UPD2
Я не силен в vhdl, но для verilog генерит нормальную функцию, где на вход подается CRC от предыдущего расчета. А VHDL не пойму, делает ли такое

Изменено пользователем new123

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


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

19 hours ago, new123 said:

 

 

спасибо. но что делать с результатом?

entity crc is
port 
( 
    data_in : in std_logic_vector (7 downto 0);
    crc_en , rst, clk : in std_logic;
    crc_out : out std_logic_vector (15 downto 0)
);
end crc;

это CRC на байт. а что делать с массивом?

на данный момент я делаю в цикле

crc_result <= crc_result xor crc_out;

Изменено пользователем jenya7

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


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

23 hours ago, jenya7 said:

это CRC на байт. а что делать с массивом?

если бы это был verilog, я вроде написал алгоритм действий. Массив то у вас наверняка не сразу формируется, а по мере поступления данных. Поэтому обрабатывать не массив, а поэтапно входящие данные

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


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

On 3/10/2022 at 9:23 AM, jenya7 said:

спасибо. но что делать с результатом?


entity crc is
port 
( 
    data_in : in std_logic_vector (7 downto 0);
    crc_en , rst, clk : in std_logic;
    crc_out : out std_logic_vector (15 downto 0)
);
end crc;

Это неправильный crc - у правильного crc ещё должен быть входной порт crc_in: in std_logic_vector(15 downto 0)

On 3/10/2022 at 9:23 AM, jenya7 said:

на данный момент я делаю в цикле

crc_result <= crc_result xor crc_out;

Это тем более не правильно

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


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

On 3/10/2022 at 9:23 AM, jenya7 said:

это CRC на байт. а что делать с массивом?

делать так как сказал new123:

On 3/11/2022 at 9:08 AM, new123 said:

Массив то у вас наверняка не сразу формируется, а по мере поступления данных. Поэтому обрабатывать не массив, а поэтапно входящие данные

Если массив у вас уже сформирован то делайте FSM которая переберет данные из массива.

22 hours ago, xvr said:

Это неправильный crc - у правильного crc ещё должен быть входной порт crc_in: in std_logic_vector(15 downto 0)

Это правильный CRC, предыдущий расчет crc хранится в выходном регистре crc_out и он используется для расчета нового значения пока не сделаем сброс.

On 3/6/2022 at 2:44 PM, jenya7 said:

что я делаю с промежуточным результатом?

Перед расчетом CRC вы делаете сброс далее по байтно (и по "тактно") прогоняете данные массива через функцию(модуль) расчета CRC, промежуточные результаты вас не интересуют, по окончанию в регистре crc_out будет находится итоговый результат расчета.

Изменено пользователем esokol

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


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

23 hours ago, esokol said:

Перед расчетом CRC вы делаете сброс далее по байтно (и по "тактно") прогоняете данные массива через функцию(модуль) расчета CRC, промежуточные результаты вас не интересуют, по окончанию в регистре crc_out будет находится итоговый результат расчета.

спасибо. это я как раз не понимал.

 

 

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


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

Возник такой вопрос. Нужно проверить сгенерированный CRC на стороне CPU. Начал делать Си аналог модуля - выходит как то монструозно. Есть какой то Си аналог для этого модуля?

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


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

3 часа назад, jenya7 сказал:

Возник такой вопрос. Нужно проверить сгенерированный CRC на стороне CPU. Начал делать Си аналог модуля - выходит как то монструозно. Есть какой то Си аналог для этого модуля?

Погуглить "CRC16 на Си" и выбрать подходящий

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


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

3 minutes ago, fguy said:

Погуглить "CRC16 на Си" и выбрать подходящий

в смысле подходящий? алгоритмы передающего и принимающего должны совпадать.

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


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

Только что, jenya7 сказал:

в смысле подходящий? алгоритмы передающего и принимающего должны совпадать.

алгоритм вроде как один - разные только полиномы

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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