Adeks 0 24 мая, 2013 Опубликовано 24 мая, 2013 · Жалоба Недавно начал осваивать данный язык. Получил задание по реализации 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikolascha 0 24 мая, 2013 Опубликовано 24 мая, 2013 · Жалоба На первый взгляд, Вы перепутали имя и тип сигнала matrix(i,j) -> matr(i,j)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Adeks 0 24 мая, 2013 Опубликовано 24 мая, 2013 · Жалоба На первый взгляд, Вы перепутали имя и тип сигнала 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 надо удалить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikolascha 0 24 мая, 2013 Опубликовано 24 мая, 2013 · Жалоба "can't write to interface object "matr" of mode IN"" - означает что у вас порт входной, а вы в него хотите данные записать - так нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Adeks 0 24 мая, 2013 Опубликовано 24 мая, 2013 · Жалоба "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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikolascha 0 24 мая, 2013 Опубликовано 24 мая, 2013 · Жалоба Для умножения 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 ...); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Adeks 0 25 мая, 2013 Опубликовано 25 мая, 2013 · Жалоба Для умножения 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 выглядит так , элемент S - это 8-битное число. Может как-то поможет понять. MATR44.vhd MixColumns.vhd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikolascha 0 25 мая, 2013 Опубликовано 25 мая, 2013 · Жалоба При умножении 8ми битных векторов результат будет 16ти битный, поэтому вам понадобится промежуточный сигнал или переменная 16ти битный вектр std_logic_vector. Закидывайте результат сначала в него, а потом младшие восемь бит перекидывайте в Bmatr. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Adeks 0 26 мая, 2013 Опубликовано 26 мая, 2013 · Жалоба При умножении 8ми битных векторов результат будет 16ти битный, поэтому вам понадобится промежуточный сигнал или переменная 16ти битный вектр std_logic_vector. Закидывайте результат сначала в него, а потом младшие восемь бит перекидывайте в Bmatr. :a14: Спасибо, все получилось. Если будут вопросы по другим блокам, чиркану в этой теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться