jenya7 0 6 марта, 2022 Опубликовано 6 марта, 2022 · Жалоба Есть модуль 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 марта, 2022 Опубликовано 6 марта, 2022 · Жалоба 1 minute ago, jenya7 said: Но это CRC на один байт. А если мне нужен CRC на массив байтов, что я делаю с промежуточным результатом? и как вообще перебрать массив, в for i in 0 to x loop? И я снова предложу вам взять ручку и бумажку и нарисовать структурную схему того что вы делаете. Потом функциональную, в которой ядро CRC это вот это ваше ядро. И тогда вам станет ясно какую функциональность надо вам добавить, что выполнить требования вашего ТЗ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 марта, 2022 Опубликовано 6 марта, 2022 · Жалоба 2 minutes ago, des00 said: И я снова предложу вам взять ручку и бумажку и нарисовать структурную схему того что вы делаете. Потом функциональную, в которой ядро CRC это вот это ваше ядро. И тогда вам станет ясно какую функциональность надо вам добавить, что выполнить требования вашего ТЗ. мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 6 марта, 2022 Опубликовано 6 марта, 2022 · Жалоба 4 minutes ago, jenya7 said: мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало. Что бы RTL viewer нарисовал, нужно сначала написать код. А если не знаешь, какой код писать - RTL viewer ничего не нарисует. Яйцо и курица) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 марта, 2022 Опубликовано 6 марта, 2022 · Жалоба 3 minutes ago, jenya7 said: мне даже рисовать не надо. RTL Viewer прекрасно это делает за меня. но понятней от этого не стало. RTL Viewer рисует вам то что вы написали. А у вас проблема с тем что написать, иначе вы бы с вашим вопросом, тут не появились. А основная фаза до того как написать, это поставить четкое ТЗ и сделать по этому заданию структурную схему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 9 марта, 2022 Опубликовано 9 марта, 2022 (изменено) · Жалоба Типовая задачка. 1) Генерим в любом онлайн генераторе CRC (если он типовой) код на нужную ширину данных 2) При поступлении очередных данных пропускаем через эту функцию/модуль 3) Если концовка всегда плавающая (не равна ширине данных), то также придется сгенерировать код crc на другую/ие ширину данных и обрабатывать это У вас в коде вроде как не стандартный CRC16 полином, надо поковыряться поискать, что за полином UPD1 Нашел, у вас полином CRC16 для USB2.0 Юзайте такой онлайн генератор кодаhttp://outputlogic.com/ UPD2 Я не силен в vhdl, но для verilog генерит нормальную функцию, где на вход подается CRC от предыдущего расчета. А VHDL не пойму, делает ли такое Изменено 9 марта, 2022 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 марта, 2022 Опубликовано 10 марта, 2022 (изменено) · Жалоба 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; Изменено 10 марта, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 11 марта, 2022 Опубликовано 11 марта, 2022 · Жалоба 23 hours ago, jenya7 said: это CRC на байт. а что делать с массивом? если бы это был verilog, я вроде написал алгоритм действий. Массив то у вас наверняка не сразу формируется, а по мере поступления данных. Поэтому обрабатывать не массив, а поэтапно входящие данные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 11 марта, 2022 Опубликовано 11 марта, 2022 · Жалоба 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; Это тем более не правильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esokol 0 12 марта, 2022 Опубликовано 12 марта, 2022 (изменено) · Жалоба 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 будет находится итоговый результат расчета. Изменено 12 марта, 2022 пользователем esokol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 13 марта, 2022 Опубликовано 13 марта, 2022 · Жалоба 23 hours ago, esokol said: Перед расчетом CRC вы делаете сброс далее по байтно (и по "тактно") прогоняете данные массива через функцию(модуль) расчета CRC, промежуточные результаты вас не интересуют, по окончанию в регистре crc_out будет находится итоговый результат расчета. спасибо. это я как раз не понимал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 марта, 2022 Опубликовано 14 марта, 2022 · Жалоба Возник такой вопрос. Нужно проверить сгенерированный CRC на стороне CPU. Начал делать Си аналог модуля - выходит как то монструозно. Есть какой то Си аналог для этого модуля? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fguy 5 14 марта, 2022 Опубликовано 14 марта, 2022 · Жалоба 3 часа назад, jenya7 сказал: Возник такой вопрос. Нужно проверить сгенерированный CRC на стороне CPU. Начал делать Си аналог модуля - выходит как то монструозно. Есть какой то Си аналог для этого модуля? Погуглить "CRC16 на Си" и выбрать подходящий Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 марта, 2022 Опубликовано 14 марта, 2022 · Жалоба 3 minutes ago, fguy said: Погуглить "CRC16 на Си" и выбрать подходящий в смысле подходящий? алгоритмы передающего и принимающего должны совпадать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fguy 5 14 марта, 2022 Опубликовано 14 марта, 2022 · Жалоба Только что, jenya7 сказал: в смысле подходящий? алгоритмы передающего и принимающего должны совпадать. алгоритм вроде как один - разные только полиномы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться