Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сравнить (через сжатие) два 512разядных(и более)сущности
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Мур
Уважаемые форумчане!
Обращаюсь к вашему опыту, ибо боюсь при такой разрядности съесть рессурс уже готового проекта.
Время не жмёт, его достаточно. ...Пугает здоровенный мультиплексор, если прогонять по CRC32 всю последовательность(64байта) через автомат.
Может нечто древовидное организовать? Может и не CRC, а сигнатуры какие породить?...
Итог,- убедиться в одинаковости сигнатур приходящей извне(в последовательном коде) со сгенерированной у себя.
Кто что подобное ваял?
Интуитивно, чтобы не создавать проблемы основному проекту, просится что-то разнесённое, древовидное, т.к. сами сущности размазаны по ПЛИС.
Я пока готовлюсь к простому автомату CRC ...в лоб. Но неуютно в перспективе!
Спасибо! Рад любым идеям и заделам... tort.gif
des00
а чем плох сдвиговый регистр ? или на памяти
Oldring
Зачем "через сжатие"?

Любые сигнатуры чреваты ложными совпадениями. Особенно, просто считаемые.
Мур
Цитата(des00 @ Mar 10 2011, 12:11) *
а чем плох сдвиговый регистр ? или на памяти


Сдвиговый регистр как раз подходит к сигнатурному анализатору! Согласен!... Я в этом случае не имею информации о неоднозначности результата такой операции сжатия. Для CRC такая оценка есть. Для пробы можно. Кстати, сигнатуру можно получить, помнится, и из двумерного массива.

Так в саму память заброс информации потребует тот-же рессурс. Да, дальше легче пойдётЁ...
iosifk
Цитата(Мур @ Mar 10 2011, 11:47) *
Время не жмёт, его достаточно. ...Итог,- убедиться в одинаковости приходящей извне(в последовательном коде) со сгенерированной у себя.

Так вот прямо при приеме побитно и проверять. Всего-то нужен дополнительно сдвиговый регистр (СР), для загрузки шаблона, схема сравнения на 1 бит и триггер совпадения. В СР заносите шаблон и при приеме данных его сдвигаете. И сравниваете приходящий бит с битом шаблона. Если есть несовпадение хотя бы в одном бите - сбрасываете триггер...
Я так делал проверку МАС-адреса...
Собственно и все.
Удачи!
Мур
Цитата(Oldring @ Mar 10 2011, 12:14) *
Зачем "через сжатие"?

Любые сигнатуры чреваты ложными совпадениями. Особенно, просто считаемые.


Вот-вот!... Тут надо покруче.
В общем, я плаваю в материале. Признаю!
...А есть гибрид CRC с сигнатурным сжимателем? По сути,-сигнатурный анализатор-частный случай CRC, который имеет массу вариантов.
--------------
Всего хотелось минимума проблем при ещё большей разрядности в перспективе. Сжатие, как способ сэкономить рессурс.
Цитата(iosifk @ Mar 10 2011, 12:23) *
Так вот прямо при приеме побитно и проверять. Всего-то нужен дополнительно сдвиговый регистр (СР), для загрузки шаблона, схема сравнения на 1 бит и триггер совпадения. В СР заносите шаблон и при приеме данных его сдвигаете. И сравниваете приходящий бит с битом шаблона. Если есть несовпадение хотя бы в одном бите - сбрасываете триггер...
Я так делал проверку МАС-адреса...
Собственно и все.
Удачи!

Супер! Спасибо Мэтру!
Шаблон-то гибкий должен быть. Коды меняются и там и здесь...
yes
что-то я не понял
если есть 512 бит "сущность" и ее сжимаете/получаете сигнатуру/црц самым прогрессивным методом, известным человечеству. ну, например до 8 бит, то в среднем каждая 256 "сущность" будет иметь одинаковую сигнатуру

--------

то есть нельзя посадить 11 кроликов в 10 клеток так, чтобы в каждой клетке сидело не больше 1 кролика

--------

то есть с сигнатурами можно либо дать ответ: 100% не совпадает, а если сигнатуры равны - то равны ли сущности - достоверно не известно

и если в контексте црц/сигнатур сдвиговый регистр LFSR - то непонятно нафига это надо - сравнивайте побитно сущности.

---------

с LFSR наверно можно уменьшить вероятность если считать несколько сигнатур, но это имеет смысл только при каких-то знаниях о структуре "сущности" - в общем случае - см. про кроликов
Oldring
Цитата(yes @ Mar 10 2011, 14:11) *
с LFSR наверно можно уменьшить вероятность если считать несколько сигнатур, но это имеет смысл только при каких-то знаниях о структуре "сущности" - в общем случае - см. про кроликов


Угу. Достаточно двух клеток, чтобы избежать размножения кроликов. Но нужно в кроликах разбираться, да и ошибиться проще.
Мур
Цитата(yes @ Mar 10 2011, 14:11) *
что-то я не понял
если есть 512 бит "сущность" и ее сжимаете/получаете сигнатуру/црц самым прогрессивным методом, известным человечеству. ну, например до 8 бит, то в среднем каждая 256 "сущность" будет иметь одинаковую сигнатуру
то есть нельзя посадить 11 кроликов в 10 клеток так, чтобы в каждой клетке сидело не больше 1 кролика
то есть с сигнатурами можно либо дать ответ: 100% не совпадает, а если сигнатуры равны - то равны ли сущности - достоверно не известно
и если в контексте црц/сигнатур сдвиговый регистр LFSR - то непонятно нафига это надо - сравнивайте побитно сущности.
с LFSR наверно можно уменьшить вероятность если считать несколько сигнатур, но это имеет смысл только при каких-то знаниях о структуре "сущности" - в общем случае - см. про кроликов

У меня на стапеле CRC32. Говорить о неравенстве при истинном равенстве(или наоборот) можно с вероятностью 10 в минус 1х степени. Это обговаривалось выше. Кстати, пускать весь поток извне для сравнения в лоб,-тоже подвергать систему лишнему сбою. Вопрос требует изучения.
i-mir
Для CRC16 привожу анализ помехоустойчивости различных полиномов.
Проводились испытания для различной длины пакетов данных (64...512 бит).
Для удобства ошибки считались относительно помехоустойчивости полинома 8005h (1500 пропусков).
В общем случае метод CRC16 ловит все 1х, 2х, 3х ошибки.
Здесь рассматриваются только ошибки 4х, которые CRC16 не ловит одну из 30 000 вариантов (в среднем).
Анализ ошибок более высокого порядка не привожу, чтобы не засорять основную идею.

Интересный факт: пересечение помехоустойчивости полиномов на длине пакета 256 бит.
Мур
Цитата(i-mir @ Mar 10 2011, 18:56) *
Для CRC16 привожу анализ помехоустойчивости различных полиномов.
Проводились испытания для различной длины пакетов данных (64...512 бит).
Для удобства ошибки считались относительно помехоустойчивости полинома 8005h (1500 пропусков).
В общем случае метод CRC16 ловит все 1х, 2х, 3х ошибки.
Здесь рассматриваются только ошибки 4х, которые CRC16 не ловит одну из 30 000 вариантов (в среднем).
Анализ ошибок более высокого порядка не привожу, чтобы не засорять основную идею.

Интересный факт: пересечение помехоустойчивости полиномов на длине пакета 256 бит.

Огромное спасибо! Интересная инфа!....

Вот интересная реализация CRC8, говорящая о единой природе расчёта CRC и получения сигнатуры.
Тут ,при определённом умении, легко реализовать любой полином. От CRC4 до CRC100

Код
--
-- Description :            X8+X7+X2+1
--
-------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity signature is
     port(
         CLK : in STD_LOGIC;
         Reset : in STD_LOGIC;
         ind : in STD_LOGIC;
         dat : out STD_LOGIC_VECTOR(7 downto 0)
         );
end signature;

architecture signature_body of signature is

signal rg_baza      :  STD_LOGIC_VECTOR(7 downto 0);
signal rg_bz      :  STD_LOGIC_VECTOR(7 downto 0);

begin
process (CLK)
begin
if CLK'event and CLK = '1' then
    if Reset = '1' then
        rg_baza <= "00000000";
        else
        rg_baza <= rg_bz;
    end if;
end if;
end process;
rg_bz(0) <= rg_baza(7)xor ind;
rg_bz(1) <= rg_baza(0);
rg_bz(2) <= rg_baza(1) xor (rg_baza(7) xor ind);
rg_bz(3) <= rg_baza(2);
rg_bz(4) <= rg_baza(3);
rg_bz(5) <= rg_baza(4);
rg_bz(6) <= rg_baza(5);
rg_bz(7) <= rg_baza(6) xor (rg_baza(7) xor ind);

dat<= rg_baza;

end signature_body;

Я проверил по таблице из текста
Цитата
Контрольная сумма. В качестве алгоритма вычисления контрольной суммы используется CRC-8, с начальным значением 0x00 и полиномом x8+x7+x2+1. Таблица и функция для вычисления контрольной суммы, определенные в форме языка С, приведены ниже:

unsigned char crc8TableA[256] =
{
0x00, 0x85, 0x8F, 0x0A, 0x9B, 0x1E, 0x14, 0x91, 0xB3, 0x36,
0x3C, 0xB9, 0x28, 0xAD, 0xA7, 0x22, 0xE3, 0x66, 0x6C, 0xE9,
0x78, 0xFD, 0xF7, 0x72, 0x50, 0xD5, 0xDF, 0x5A, 0xCB, 0x4E,
0x44, 0xC1, 0x43, 0xC6, 0xCC, 0x49, 0xD8, 0x5D, 0x57, 0xD2,
0xF0, 0x75, 0x7F, 0xFA, 0x6B, 0xEE, 0xE4, 0x61, 0xA0, 0x25,
0x2F, 0xAA, 0x3B, 0xBE, 0xB4, 0x31, 0x13, 0x96, 0x9C, 0x19,
0x88, 0x0D, 0x07, 0x82, 0x86, 0x03, 0x09, 0x8C, 0x1D, 0x98,
0x92, 0x17, 0x35, 0xB0, 0xBA, 0x3F, 0xAE, 0x2B, 0x21, 0xA4,
0x65, 0xE0, 0xEA, 0x6F, 0xFE, 0x7B, 0x71, 0xF4, 0xD6, 0x53,
0x59, 0xDC, 0x4D, 0xC8, 0xC2, 0x47, 0xC5, 0x40, 0x4A, 0xCF,
0x5E, 0xDB, 0xD1, 0x54, 0x76, 0xF3, 0xF9, 0x7C, 0xED, 0x68,
0x62, 0xE7, 0x26, 0xA3, 0xA9, 0x2C, 0xBD, 0x38, 0x32, 0xB7,
0x95, 0x10, 0x1A, 0x9F, 0x0E, 0x8B, 0x81, 0x04, 0x89, 0x0C,
0x06, 0x83, 0x12, 0x97, 0x9D, 0x18, 0x3A, 0xBF, 0xB5, 0x30,
0xA1, 0x24, 0x2E, 0xAB, 0x6A, 0xEF, 0xE5, 0x60, 0xF1, 0x74,
0x7E, 0xFB, 0xD9, 0x5C, 0x56, 0xD3, 0x42, 0xC7, 0xCD, 0x48,
0xCA, 0x4F, 0x45, 0xC0, 0x51, 0xD4, 0xDE, 0x5B, 0x79, 0xFC,
0xF6, 0x73, 0xE2, 0x67, 0x6D, 0xE8, 0x29, 0xAC, 0xA6, 0x23,
0xB2, 0x37, 0x3D, 0xB8, 0x9A, 0x1F, 0x15, 0x90, 0x01, 0x84,
0x8E, 0x0B, 0x0F, 0x8A, 0x80, 0x05, 0x94, 0x11, 0x1B, 0x9E,
0xBC, 0x39, 0x33, 0xB6, 0x27, 0xA2, 0xA8, 0x2D, 0xEC, 0x69,
0x63, 0xE6, 0x77, 0xF2, 0xF8, 0x7D, 0x5F, 0xDA, 0xD0, 0x55,
0xC4, 0x41, 0x4B, 0xCE, 0x4C, 0xC9, 0xC3, 0x46, 0xD7, 0x52,
0x58, 0xDD, 0xFF, 0x7A, 0x70, 0xF5, 0x64, 0xE1, 0xEB, 0x6E,
0xAF, 0x2A, 0x20, 0xA5, 0x34, 0xB1, 0xBB, 0x3E, 0x1C, 0x99,
0x93, 0x16, 0x87, 0x02, 0x08, 0x8D};
=SSN=
Цитата(Мур @ Mar 11 2011, 10:53) *
Тут, при определённом умении, легко реализовать любой полином. От CRC4 до CRC100

А оно надо, умение? CSC Tool.
Мур
Для простоты восприятия рисуночек в приложении.
Для повышения помехозащищенности при обмене с внешней средой очень симпатично применять в дополнение к CRC инверсный код(так и набирать в гугле!)

Цитата(=SSN= @ Mar 11 2011, 12:05) *
А оно надо, умение? CSC Tool.

Мне это известно. Ловушка в том, что в этом тулзе разрядность выхода не 1,- а это уход от сдвигового регистра! Это куча мультиплексоров. Тут предлагается однобитовый поток(гигантский сдвиговый регистр). Затраты минимальны. Эффект максимальный.
dvladim
Цитата(Мур @ Mar 11 2011, 11:39) *
Мне это известно. Ловушка в том, что в этом тулзе разрядность выхода не 1,- а это уход от сдвигового регистра! Это куча мультиплексоров.

Нормально там все. Пишешь: crc <= newCRC(crc, data); и получается нормальный сдвиговый регистр с xor-ми в нужных местах.
Мур
Цитата(dvladim @ Mar 12 2011, 21:40) *
Нормально там все. Пишешь: crc <= newCRC(crc, data); и получается нормальный сдвиговый регистр с xor-ми в нужных местах.

Не думаю... Вызов функции происходит по каждому тику клока. Так что подача данных порциями по 8 точно есть!
Я это применял в побайтном темпе. Вот оттуда ваш код(с указанного сайта) мною применяемый
Цитата
library ieee;
use ieee.std_logic_1164.all;

package PCK_CRC8_D8 is
-- polynomial: (0 2 7 8)
-- data width: 8
-- convention: the first serial bit is D[7]
function nextCRC8_D8
(Data: std_logic_vector(7 downto 0);
crc: std_logic_vector(7 downto 0))
return std_logic_vector;
end PCK_CRC8_D8;


package body PCK_CRC8_D8 is

-- polynomial: (0 2 7 8)
-- data width: 8
-- convention: the first serial bit is D[7]
function nextCRC8_D8
(Data: std_logic_vector(7 downto 0);
crc: std_logic_vector(7 downto 0))
return std_logic_vector is

variable d: std_logic_vector(7 downto 0);
variable c: std_logic_vector(7 downto 0);
variable newcrc: std_logic_vector(7 downto 0);

begin
d := Data;
c := crc;

newcrc(0) := d(7) xor d(5) xor d(4) xor d(3) xor d(2) xor d(1) xor d(0) xor c(0) xor c(1) xor c(2) xor c(3) xor c(4) xor c(5) xor c(7);
newcrc(1) := d(6) xor d(5) xor d(4) xor d(3) xor d(2) xor d(1) xor c(1) xor c(2) xor c(3) xor c(4) xor c(5) xor c(6);
newcrc(2) := d(6) xor d(1) xor d(0) xor c(0) xor c(1) xor c(6);
newcrc(3) := d(7) xor d(2) xor d(1) xor c(1) xor c(2) xor c(7);
newcrc(4) := d(3) xor d(2) xor c(2) xor c(3);
newcrc(5) := d(4) xor d(3) xor c(3) xor c(4);
newcrc(6) := d(5) xor d(4) xor c(4) xor c(5);
newcrc(7) := d(7) xor d(6) xor d(4) xor d(3) xor d(2) xor d(1) xor d(0) xor c(0) xor c(1) xor c(2) xor c(3) xor c(4) xor c(6) xor c(7);
return newcrc;
end nextCRC8_D8;

end PCK_CRC8_D8;
dvladim
Цитата(Мур @ Mar 14 2011, 09:48) *
Не думаю... Вызов функции происходит по каждому тику клока. Так что подача данных порциями по 8 точно есть!
Я это применял в побайтном темпе. Вот оттуда ваш код(с указанного сайта) мною применяемый

Вызов функции - ваше дело. Хотите каждый такт, хотите не каждый. Это уж как вы решите.
Ширина данных - вещь параметризуемая. Нужна ширина в 1 бит - ну так сгенерите. Не вижу проблемы.
Да, и кстати, код не мой.
Мур
Цитата(dvladim @ Mar 14 2011, 12:58) *
Вызов функции - ваше дело. Хотите каждый такт, хотите не каждый. Это уж как вы решите.
Ширина данных - вещь параметризуемая. Нужна ширина в 1 бит - ну так сгенерите. Не вижу проблемы.
Да, и кстати, код не мой.

Да, там якобы можно менять ширину шины выходной. Но на самом деле 1 не получишь....
Попробуйте!
dvladim
Цитата(Мур @ Mar 14 2011, 12:17) *
Да, там якобы можно менять ширину шины выходной. Но на самом деле 1 не получишь....
Попробуйте!

Ширина выходной шины соответствует разрядности полинома.
Извините, но проблемы в упор не вижу.
Мур
Цитата(dvladim @ Mar 15 2011, 00:43) *
Ширина выходной шины соответствует разрядности полинома.
Извините, но проблемы в упор не вижу.

Ой, это я лоханулся. Извините! Конечно же входная шина!...
Выходная всегда по размеру CRC.
dvladim
Цитата(Мур @ Mar 15 2011, 09:43) *
Ой, это я лоханулся. Извините! Конечно же входная шина!...
Выходная всегда по размеру CRC.

Ну а ширину входных данных, как я уже говорил, можно выбрать при генерации.
Shtirlits
Я вам вот какой момент расскажу. Если написать функцию для однобитного потока данных и потом её применить столько раз за такт, сколько нужно битов обрабатывать в параллель, то Xilinx разведет это дело на частоту в ~1.5 раза большую, чем получается с кодом всех этих генераторов и opencores.

ЗЫ: исходник продается sm.gif
Kuzmi4
2 Shtirlits
а какой синтезатор ?
Shtirlits
xst, хотя это не важно, synplify при этом тоже хорош sm.gif чего я только не пробовал, чтобы поднять тактовую... а оказалось все так просто и сногсшибательно.
Kuzmi4
За XST я такое замечал, а вот Synplify в таких случаях синтезировал однаково..
То есть вы хотите сказать, что применительно к этой задаче, разбиение на биты дало одинаковые результаты для XST и Synplify то есть увеличило тактовую ?
Shtirlits
crc32 - задача, которая сильно зависит от способа реализации и размещения. И чем больше её регистры пытается дублировать синтезатор, тем она занимает больше площади и получается еще хуже.
Сражался я с этим 5 лет назад, утверждать не буду, но помнится, что я никак не мог сделать больше 212MHz на virtex-2pro никаким синтезатором. Когда уже замучался и написал себе модель для тестирования и тупо попытался её развести, получил 270Mhz. Сильно удивился.
des00
Цитата(Shtirlits @ Mar 15 2011, 14:49) *
ЗЫ: исходник продается sm.gif

гыыы, если учесть что я раза 3 его выкладывал на форуме...... то вы сударь почти барыга wink.gif
Shtirlits
Дык! Но вы выкладывали разве мой исходник? sm.gif
des00
Цитата(Shtirlits @ Mar 16 2011, 00:06) *
Дык! Но вы выкладывали разве мой исходник? sm.gif

а будет разница ? wink.gif
Shtirlits
Хотел было предложить соревнование, но заленился, да и некогда.
Наверное не будет разницы, если у вас все написано так, как я про это думаю.
Мур
Цитата(Shtirlits @ Mar 16 2011, 10:46) *
..Наверное не будет разницы, если у вас все написано так, как я про это думаю.

Ну вот для куражу за 2 минуты CRC24
Цитата
-------------------------------------------------------------------------------
--
-- Description : X24+X23+X6+X5+X1+1
--
-------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity signature is
port(
CLK : in STD_LOGIC;
Reset : in STD_LOGIC;
ind : in STD_LOGIC;
dat : out STD_LOGIC_VECTOR(23 downto 0)
);
end signature;

architecture signature_body of signature is
signal rg_baza : STD_LOGIC_VECTOR(23 downto 0);
signal rg_bz : STD_LOGIC_VECTOR(23 downto 0);
begin
process (CLK,Reset)
begin
if Reset = '1' then
rg_baza <= "000000000000000000000000";
elsif CLK'event and CLK = '1' then
rg_baza <= rg_bz;
end if;
end process;
rg_bz(0) <= rg_baza(23)xor ind;
rg_bz(1) <= rg_baza(0) xor (rg_baza(23) xor ind);
rg_bz(2) <= rg_baza(1);
rg_bz(3) <= rg_baza(2);
rg_bz(4) <= rg_baza(3);
rg_bz(5) <= rg_baza(4) xor (rg_baza(23) xor ind);
rg_bz(6) <= rg_baza(5) xor (rg_baza(23) xor ind);
rg_bz(21 downto 7) <= rg_baza(20 downto 6);
rg_bz(22) <= rg_baza(21) xor (rg_baza(23) xor ind);
rg_bz(23) <= rg_baza(22) xor (rg_baza(23) xor ind);
dat<= rg_baza;
end signature_body;
Shtirlits
Страшно извиняюсь, но я имел в виду CRC-32, который за такт обрабатывает сразу 32 бита.
У меня вопрос стоял так - 125 MHz и 64 бита или 250 MHz 32 бита. Второй вариант победил.
Мур
Цитата(Shtirlits @ Mar 17 2011, 22:14) *
Страшно извиняюсь, но я имел в виду CRC-32, который за такт обрабатывает сразу 32 бита.
У меня вопрос стоял так - 125 MHz и 64 бита или 250 MHz 32 бита. Второй вариант победил.

Мне нет нужды так спешить. biggrin.gif
Мне важно новой примочкой не создавать проблемы в готовом проекте. Сдвиговый регистр-идеальный побитный вариант. Ожидается больше 2000 точек просмотра.
Victor®
Цитата(Shtirlits @ Mar 17 2011, 22:14) *
Страшно извиняюсь, но я имел в виду CRC-32, который за такт обрабатывает сразу 32 бита.
У меня вопрос стоял так - 125 MHz и 64 бита или 250 MHz 32 бита. Второй вариант победил.


Воспользовался ради интереса свободным временем, гуглом и практически сразу найденным CRC генератором
http://outputlogic.com/?page_id=321

Исходные данные:
- 32-бита CRC32 802.3
- В сгенерированном VHDL ничего не модифицировалось.
- ISE 12.3
- Все установки ISE дефолтные
- Device - XC6SLX100T-3FGG484
- Использовал констрейнт на сигнал clk

Получил:
- All constrain meet
- Максимальная частота, при которой констрейнт вписывается в чип - 321,44 MHz

Может можно еще что-то выжать с помощью конвейера, но предоставлю эту возможность Вам;-)
Возможно эта информация кому-то пригодится.

За сим откланиваюсь. Желаю успехов!

Shtirlits
А если на входе data_in сначала засунуть в регистр, а crc_out на выходе тоже?

Спрашиваю потому, что если вы написали констрейны для входов и выходов, то это один результат и добавление регистров на один или два такта только улучшит ситуацию, так как облегчит разводку, позволит сделать дублирование и т.п.
Если не написали, то совсем другие пути участвуют в обработке данных и добавление регистров вернет все реальности.
Victor®
Цитата(Shtirlits @ Mar 18 2011, 14:27) *
А если на входе data_in сначала засунуть в регистр, а crc_out на выходе тоже?

Спрашиваю потому, что если вы написали констрейны для входов и выходов, то это один результат и добавление регистров на один или два такта только улучшит ситуацию, так как облегчит разводку, позволит сделать дублирование и т.п.
Если не написали, то совсем другие пути участвуют в обработке данных и добавление регистров вернет все реальности.


Вот единственный констрейнт
Код
NET "clk" TNM_NET = clk;
TIMESPEC TS_clk = PERIOD "clk" 321.44 MHz HIGH 50%;


У меня нет задачи делать CRC (по крайней мере сейчас)...
поэтому ничего больше не констрейнтилось... IOSTANDART, сэтапы, холды и пр.
Ну и наверняка в реальной жизни входы и выходы CRC врядли будут идти на пины ;-)

P.S.
crc_out имеет регистр на выходе
Мур
Цитата(=SSN= @ Mar 11 2011, 12:05) *
А оно надо, умение? CSC Tool.

Беру свои слова назад. Нормальный тулз! И одноразрядный вход можно поставить. Я не врубился до конца. Можно и 1 разряд получить.
Извините, если кого ввёл в заблуждение! maniac.gif wacko.gif
Мур
И что приятно, прогон тестбенча показал полное сходство в поведении моего модулька и того, что генерируется предложенным тулзом.
Начинающим предлагаю для накопления опыта оба текста для сравнения
функция nextCRC32_D1
CODE
-- Purpose : synthesizable CRC function
-- * polynomial: (0 1 2 4 6 7 10 11 15 16 17 19 20 26 28 29 30 32)
-- * data width: 1
--
-- Info : tools@easics.be
-- http://www.easics.com
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;

package PCK_CRC32_D1 is
-- polynomial: (0 1 2 4 6 7 10 11 15 16 17 19 20 26 28 29 30 32)
-- data width: 1
-- convention: the first serial bit is D[0]
function nextCRC32_D1
(Data: std_logic;
crc: std_logic_vector(31 downto 0))
return std_logic_vector;
end PCK_CRC32_D1;


package body PCK_CRC32_D1 is

-- polynomial: (0 1 2 4 6 7 10 11 15 16 17 19 20 26 28 29 30 32)
-- data width: 1
-- convention: the first serial bit is D[0]
function nextCRC32_D1
(Data: std_logic;
crc: std_logic_vector(31 downto 0))
return std_logic_vector is

variable d: std_logic_vector(0 downto 0);
variable c: std_logic_vector(31 downto 0);
variable newcrc: std_logic_vector(31 downto 0);

begin
d(0) := Data;
c := crc;

newcrc(0) := d(0) xor c(31);
newcrc(1) := d(0) xor c(0) xor c(31);
newcrc(2) := d(0) xor c(1) xor c(31);
newcrc(3) := c(2);
newcrc(4) := d(0) xor c(3) xor c(31);
newcrc(5) := c(4);
newcrc(6) := d(0) xor c(5) xor c(31);
newcrc(7) := d(0) xor c(6) xor c(31);
newcrc(8) := c(7);
newcrc(9) := c(8);
newcrc(10) := d(0) xor c(9) xor c(31);
newcrc(11) := d(0) xor c(10) xor c(31);
newcrc(12) := c(11);
newcrc(13) := c(12);
newcrc(14) := c(13);
newcrc(15) := d(0) xor c(14) xor c(31);
newcrc(16) := d(0) xor c(15) xor c(31);
newcrc(17) := d(0) xor c(16) xor c(31);
newcrc(18) := c(17);
newcrc(19) := d(0) xor c(18) xor c(31);
newcrc(20) := d(0) xor c(19) xor c(31);
newcrc(21) := c(20);
newcrc(22) := c(21);
newcrc(23) := c(22);
newcrc(24) := c(23);
newcrc(25) := c(24);
newcrc(26) := d(0) xor c(25) xor c(31);
newcrc(27) := c(26);
newcrc(28) := d(0) xor c(27) xor c(31);
newcrc(29) := d(0) xor c(28) xor c(31);
newcrc(30) := d(0) xor c(29) xor c(31);
newcrc(31) := c(30);
return newcrc;
end nextCRC32_D1;

end PCK_CRC32_D1;

И мой
CODE
-- Description : X32+X30+X29+X28+X26+X20+X19+X17+X16+X15+X11+X10+X7+X6+X4+X2+X1+1
-- 0xBA0DC66B
-------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity signature32 is
port(
CLK : in STD_LOGIC;
en : in STD_LOGIC;
Reset : in STD_LOGIC;
ind : in STD_LOGIC;
dat : out STD_LOGIC_VECTOR(31 downto 0)
);
end signature32;

architecture signature_body of signature32 is
signal rg_baza : STD_LOGIC_VECTOR(31 downto 0);
signal rg_bz : STD_LOGIC_VECTOR(31 downto 0);
begin
process (CLK,Reset)
begin
if Reset = '1' then
rg_baza <= "00000000000000000000000000000000";
elsif CLK'event and CLK = '1' and en = '1' then
rg_baza <= rg_bz;
end if;
end process;
rg_bz(0) <= rg_baza(31)xor ind;
rg_bz(1) <= rg_baza(0) xor (rg_baza(31) xor ind);
rg_bz(2) <= rg_baza(1) xor (rg_baza(31) xor ind);
rg_bz(3) <= rg_baza(2);
rg_bz(4) <= rg_baza(3) xor (rg_baza(31) xor ind);
rg_bz(5) <= rg_baza(4);
rg_bz(6) <= rg_baza(5) xor (rg_baza(31) xor ind);
rg_bz(7) <= rg_baza(6) xor (rg_baza(31) xor ind);
rg_bz(8) <= rg_baza(7);
rg_bz(9) <= rg_baza(8);
rg_bz(10) <= rg_baza(9) xor (rg_baza(31) xor ind);
rg_bz(11) <= rg_baza(10) xor (rg_baza(31) xor ind);
rg_bz(12) <= rg_baza(11);
rg_bz(13) <= rg_baza(12);
rg_bz(14) <= rg_baza(13);
rg_bz(15) <= rg_baza(14) xor (rg_baza(31) xor ind);
rg_bz(16) <= rg_baza(15) xor (rg_baza(31) xor ind);
rg_bz(17) <= rg_baza(16) xor (rg_baza(31) xor ind);
rg_bz(18) <= rg_baza(17);
rg_bz(19) <= rg_baza(18) xor (rg_baza(31) xor ind);
rg_bz(20) <= rg_baza(19) xor (rg_baza(31) xor ind);
rg_bz(25 downto 21) <= rg_baza(24 downto 20);
rg_bz(26) <= rg_baza(25) xor (rg_baza(31) xor ind);
rg_bz(27) <= rg_baza(26);
rg_bz(28) <= rg_baza(27) xor (rg_baza(31) xor ind);
rg_bz(29) <= rg_baza(28) xor (rg_baza(31) xor ind);
rg_bz(30) <= rg_baza(29) xor (rg_baza(31) xor ind);
rg_bz(31) <= rg_baza(30);
dat<= rg_baza;
end signature_body;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.