Jump to content

    

ГОСТ 28147-89

Может кто-то реализовывал ГОСТ на VHDL. Я написала проект на VHDL, при создании конфигурации

Number of 4 input LUTs: 6,648 out of 4,704 141% (OVERMAPPED)

Number of occupied Slices: 4,024 out of 2,352 171% (OVERMAPPED)

Total Number 4 input LUTs: 7,632 out of 4,704 162% (OVERMAPPED)

Как решить вопрос с перегрузкой? Помогите, плз :help:

Share this post


Link to post
Share on other sites

Либо использовать кристалл (микросхему) большей емкости, либо пытаться создать более оптимальную с точки зрения занимаемых ресурсов архитектуру проекта. По первому варианту кристалл подобрать можно, по второму существует естественно некоторый предел, при котором в меньший объем уже не уложиться.

Share this post


Link to post
Share on other sites

Так же проверьте какой тип оптимизации стоит в настройках синтезатора, если стоит скорость измените на оптимизацию по занимаемому месту.

Share this post


Link to post
Share on other sites

Несколько лет назад делал ГОСТ для Spartan 2E. Частота 160 Мгц. Одновременно 4 слова за 132 такта. Поместилось всё в S2E-50 и осталось еще много места т.к. это был блок в составе хэша. Делал и для Altera Flex10K, но там не так удобно делать блоки замены.

 

Несколько лет назад делал ГОСТ для Spartan 2E. Частота 160 Мгц. Одновременно 4 слова за 132 такта. Поместилось всё в S2E-50 и осталось еще много места т.к. это был блок в составе хэша. Делал и для Altera Flex10K, но там не так удобно делать блоки замены.

Соврал. Непосредственно ГОСТ занимал 36 тактов

Share this post


Link to post
Share on other sites

Интересно, как это у Вас 160 МГц в Спартане 2е получилось :07: ? У меня выходило максимум 70 и заоптимизировано было по самое некуда.

Share this post


Link to post
Share on other sites
Интересно, как это у Вас 160 МГц в Спартане 2е получилось ?
Присоединяюсь к вопросу! Имхо предел для кристалла для этого алгоритма где-то в районе 90-100 МГц (у меня выходило около 83МГц).

Share this post


Link to post
Share on other sites
Интересно, как это у Вас 160 МГц в Спартане 2е получилось :07: ? У меня выходило максимум 70 и заоптимизировано было по самое некуда.

Вечером посмотрю что осталось, бо прошло уже лет 5 и после я уже над этим не работал. Плата осталась, проект по-моему тоже. Над оптимизацией работал очень много.

Share this post


Link to post
Share on other sites

Так где же обещанные результаты анализа закромов? Ждем-с.

Share this post


Link to post
Share on other sites

BSV

Может под словом частота подразумевалось 160 мбит/с? Тогда, IMHO, результат вполне реальный.

Или конвеерная схема. Но это уже, по ресурсам, как минимум 2 устройства. Два независимых устройства, IMHO, поудобнее будут.

urri

Присоединяюсь к BSV.

Интересно как сложный вычислитель может работать на такой частоте. А то слышал жалобы, что Spartan 2E на 133 МГц работает нестабильно.

Share this post


Link to post
Share on other sites
Может кто-то реализовывал ГОСТ на VHDL. Я написала проект на VHDL, при создании конфигурации

Number of 4 input LUTs: 6,648 out of 4,704 141% (OVERMAPPED)

Number of occupied Slices: 4,024 out of 2,352 171% (OVERMAPPED)

Total Number 4 input LUTs: 7,632 out of 4,704 162% (OVERMAPPED)

Как решить вопрос с перегрузкой? Помогите, плз :help:

 

Alice, а вы вообще использовали синхронную реализацию (занимает 33 и более тактов) или это единый асинхронный компонент?

И ещё. В большинстве FPGA есть встроенные блоки DRAM. Их можно применять для ГОСТ-а, например, чтобы упаковать в них ключ - немало экономит остальные ресурсы.

Share this post


Link to post
Share on other sites

Вот здесь лежат исходники для ГОСТ 28147-89 для режима простой замены

http://www.sendspace.com/file/haeds8

Режим с обратной связью предлагаю доделать самостоятельно, если он нужен.

 

Я исходники подкорректировал сейчас (поубирал лишнее), так что с некоторой вероятностью могут не заработать - негде проверить.

ЗЫ. Ежели кто присоветует чего - как лучше сделать, то буду только рад. Единственное: ключ хранится в специально выделенном для него блоке DRAM, и это не устранимо. В моём случае.

Share this post


Link to post
Share on other sites

Спасибо за исходники.

Но отсутсвует файл с описанием архитектуры компонента gost key_mem.

 

еще объясните пожалуйста как работает компонент gost89_nowkey:

 

непонятно взаимодействие с компонентом LUT4 и что выполняет этот компонент

 

gost89_nowkey.

Share this post


Link to post
Share on other sites

gost key_mem - это двухпортовая память, правда с разной разрядностью по портам (названия сигналов полностью отражают их назначение) - на распределенной памяти. Сделано по всей видимости потому, что ключи грузятся по 16-разрядной шине.

 

gost89_nowkey - элемент, преобразующий номер цикла шифрования в номер ключа. При зашифровании в простой замене ключи подаются в порядке 0 1 2 3 ... 7 0 ... 7 0 ... 7 7 ... 0, при расшифровании - в обратном. LUT4 - это look-up-table - элемент, позволяющий построить логическую функцию от 4-х переменных, является основным элементом реализации логических функций в различных ПЛИС (Xilinx и Altera, за остальных не скажу). INIT в данном случае задает таблицу истинности логической функции.

 

Добавлю свои 5 копеек. Шина 64 разряда для загрузки и выдачи результата - зряшнее расходование ресурсов. Достаточно 32 без снижения скорости. (дело в том, что после предпоследнего цикла алгоритма в накопителе N1 лежит младшее 32-разрядное слово результата, а после последнего - старшее, по описанию после последнего цикла они меняются местами.) В предлагаемом варианте совершенно не рассмотрен такой эротичный и каверзный момент, как загрузка узла замены (подстановки). Видимо, предполагается работа с фиксированным узлом замены, однако не всегда это допустимо. Кроме того, что касается выработки адреса для ключа - незачем удлинять дополнительной логикой и без того длинную цепочку (32 разрядный сумматор, две памяти), лучше построить хитрый счетчик, с которого непосредственно и брать адрес для выборки нужной части ключа (если для хранения ключа используется память с регистром на выходе, т.е. синхронная, то пойдет и так). Также, этот участок кода

--  Каждый цикл выполняется это
Datareg1_proc : process (Clk, CalcEn, LongWordIn, Xorer, DataReg1)
begin
if StartDelay = '1' then 
    DataReg1 <= LongWordIn (31 downto  0);
    DataReg2 <= LongWordIn (63 downto 32);
elsif rising_edge(Clk) then
    DataReg1 <= Xorer;
    DataReg2 <= DataReg1;
end if;
end process;

вряд ли будет нормально синтезировано.

А правильно так:

--  Каждый цикл выполняется это
Datareg1_proc : process (Clk)
begin
  if rising_edge(Clk) then
    if StartDelay = '1' then 
      DataReg1 <= LongWordIn (31 downto  0);
      DataReg2 <= LongWordIn (63 downto 32);
    else
      DataReg1 <= Xorer;
      DataReg2 <= DataReg1;
    end if;
  end if;
end process;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this