Jump to content

    

Recommended Posts

Недавно начал осваивать данный язык. Получил задание по реализации 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

Share this post


Link to post
Share on other sites
На первый взгляд, Вы перепутали имя и тип сигнала 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 надо удалить.

Share this post


Link to post
Share on other sites
"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

Share this post


Link to post
Share on other sites

Для умножения 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 ...);

Share this post


Link to post
Share on other sites
Для умножения 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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this