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

AES128 на VHDL

Недавно начал осваивать данный язык. Получил задание по реализации aes128 на vhdl. В данном алгоритме происходит блочный метод шифрования. Матрица 4х4.

Описал один блок. При компиляции в квартусе, он выдает вот такую ошибку

"Error (10410): VHDL Type Conversion error at MixColumns.vhd(20): Type Conversion near text or symbol "matrix" must have one argument"

Прикрепил два файла. Один из них пакет, где описана матрица. Второй, один из блоков.

Подскажите как решить данную проблему.

MATR44.vhd

MixColumns.vhd

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


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

На первый взгляд, Вы перепутали имя и тип сигнала matrix(i,j) -> matr(i,j)...

Попробовал изменить, пишет "Error (10568): VHDL error at MixColumns.vhd(19): can't write to interface object "matr" of mode IN". Когда поменял if i=1 then matr(i,j) <= (("00000010"*matrix(1,j)) xor ("00000011"*matrix(2,j)) xor matrix(3,j) xor matrix(4,j));.

p.s. пересмотрев код, увидел, что process должен быть относительно mart, а reset и clk надо удалить.

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


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

"can't write to interface object "matr" of mode IN"" - означает что у вас порт входной, а вы в него хотите данные записать - так нельзя.

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


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

"can't write to interface object "matr" of mode IN"" - означает что у вас порт входной, а вы в него хотите данные записать - так нельзя.

Переделал описание. Теперь придирается к оператору "*". "Error (10327): VHDL error at MixColumns.vhd(19): can't determine definition of operator ""*"" -- found 0 possible definitions".

Как я понимаю, это из-за не состыковки типов данных. Если это так, то как можно это решить?

MixColumns.vhd

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


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

Для умножения std_logic_vector обычно можно использовать тип unsigned (или signed) из пакета numeric_std. Кстати, сразу два пакета numeric_std и std_logic_arith одновременно не желательно использовать. Предпочтительно использовать numeric_std, так как он является стандартом ieee. Чтобы заработало умножение нужно использовать преобразование типа:

Bmatr(i,j) <= std_logic_vector( unsigned("00000010")*unsigned(Amatr(1,j)) xor ...);

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


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

Для умножения std_logic_vector обычно можно использовать тип unsigned (или signed) из пакета numeric_std. Кстати, сразу два пакета numeric_std и std_logic_arith одновременно не желательно использовать. Предпочтительно использовать numeric_std, так как он является стандартом ieee. Чтобы заработало умножение нужно использовать преобразование типа:

Bmatr(i,j) <= std_logic_vector( unsigned("00000010")*unsigned(Amatr(1,j)) xor ...);

Начал доделывать описание. Столкнулся с другими проблемами. Решил сделать все, так сказать, в лоб.

Сделал дополнительные два входных сигнала:

generic (R: integer:=8);

A_02: in std_logic_vector (R-1 downto 0)

B_03: in std_logic_vector (R-1 downto 0)

на которые будет подаваться наши множители "00000010" и "00000011".

Соответственно переделал описание пакета и основного файла. Написал частично, для 4х элементов, чтобы проверить ошибки. В выражении возникла ошибка "Error (10344): VHDL expression error at MixColumns.vhd(29): expression has 16 elements, but must have 8 elements". Она возникла, из-за перемножения 8 разрядного элемента массива и 8 разрядного входного сигнала как я понял.

Как это решить, чтобы сигнал и элемент массива нормально перемножались?

 

Начал доделывать описание. Столкнулся с другими проблемами. Решил сделать все, так сказать, в лоб.

Сделал дополнительные два входных сигнала:

generic (R: integer:=8);

A_02: in std_logic_vector (R-1 downto 0)

B_03: in std_logic_vector (R-1 downto 0)

на которые будет подаваться наши множители "00000010" и "00000011".

Соответственно переделал описание пакета и основного файла. Написал частично, для 4х элементов, чтобы проверить ошибки. В выражении возникла ошибка "Error (10344): VHDL expression error at MixColumns.vhd(29): expression has 16 elements, but must have 8 elements". Она возникла, из-за перемножения 8 разрядного элемента массива и 8 разрядного входного сигнала как я понял.

Как это решить, чтобы сигнал и элемент массива нормально перемножались?

 

p.s. сама формула в процедуре mixcolumns выглядит так WYnio5vz.png, элемент S - это 8-битное число. Может как-то поможет понять.

MATR44.vhd

MixColumns.vhd

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


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

При умножении 8ми битных векторов результат будет 16ти битный, поэтому вам понадобится промежуточный сигнал или переменная 16ти битный вектр std_logic_vector. Закидывайте результат сначала в него, а потом младшие восемь бит перекидывайте в Bmatr.

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


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

При умножении 8ми битных векторов результат будет 16ти битный, поэтому вам понадобится промежуточный сигнал или переменная 16ти битный вектр std_logic_vector. Закидывайте результат сначала в него, а потом младшие восемь бит перекидывайте в Bmatr.

:a14: Спасибо, все получилось. Если будут вопросы по другим блокам, чиркану в этой теме.

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


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

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

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

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

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

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

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

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

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

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