Ошибка несоответствия типов VHDL

У меня ошибка несоответствия типов, но все значения имеют одинаковый тип std_logic. Вот код

Nx, Ny - дженерики

ipx - вектор входного порта

tempx, tempz - сигналы

ipx: в std_logic_vector (Nx-1 до 0);
.......
сигнал tempx: std_logic_vector(Ny-1 до 0):= ipx(Nx-1 до Nx-Ny); (Инициализация сигнала)
сигнал tempz: std_logic_vector(Ny-1 до 0);
............
tempx <= (Ny-1 до 1 => tempz(Ny-2 до 0), 0 => ipx(a-1));

ошибка: ошибка (10381): ошибка несоответствия типов VHDL в ArrayDivider.vhd(53): индексированное имя возвращает значение, тип которого не соответствует "std_ulogic", тип целевого выражения (ошибка в последней строке кода tempx)

Но ipx и tempz оба являются std_logic векторами, так где же здесь несоответствие типов???? Пожалуйста, дайте мне какое-нибудь решение

Я пытался использовать оператор объединения, но также он дает мне еще одну ошибку, связанную с иерархией верхнего уровня, и "не может разрешить несколько константных драйверов tempx[0]"!!!!!!

2 ответа

Решение

Сообщение об ошибке говорит вам точно, в чем проблема:

error : Error (10381): VHDL Type Mismatch error at ArrayDivider.vhd(53): indexed name returns a value whose type does not match "std_ulogic", the type of the target expression

И действительно, tempz(Ny-2 downto 0) это не std_ulogic, а вектор.

Проблема в том, что именованная ассоциация не идентифицирует кусочки вектора, а отдельные элементы; Вы не можете использовать его для назначения одного среза одного вектора на срез другого вектора.

Вместо этого используйте оператор конкатенации &,

tempx <= tempz(Ny-2 downto 0) & ipx(a-1);

Ваш пост подразумевает, что конкатенация приводит к другим ошибкам; не стесняйтесь добавлять их к вопросу.

РЕДАКТИРОВАТЬ:

>Error (10028): Can't resolve multiple constant drivers for net 
>"tempx[0]" at ArrayDivider.vhd(44) (on the line of initialing >tempx) 

Опять же, это говорит вам, что не так. Эта ошибка почти наверняка есть в обеих версиях дизайна, но оригинальная ошибка просто скрывает ее. Найдите два драйвера для tempx(0) и устраните все, что является неправильным. Вы недостаточно опубликовали свой код, чтобы прояснить, что происходит, и решать вам. Если вы используете Modelsim, команда "drivers" идентифицирует все драйверы по сигналу.

Если вам нужно инициализировать tempx для входного сигнала, а затем запустить его с другим сигналом, вы должны выбрать один из двух сигналов, например:

tempx <= ipx(Nx-1 downto Nx-Ny) when <some condition>
         else tempz(Ny-2 downto 0) & ipx(a-1);

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

Вот страница, которая довольно хорошо объясняет концепцию именованной ассоциации против позиционной ассоциации. Обратите внимание, что в примере показано использование обоих методов связи с использованием типа bit_vector.

http://www.ics.uci.edu/~jmoorkan/vhdlref/aggregat.html

Как вы заметили, VHDL возвращает bit_vector, когда вы выполняете именованную ассоциацию для вектора std_logic. Это вызывает несоответствие типов, если вы пытаетесь присвоить результат std_logic_vector.

Одним из вариантов является преобразование между bit_vector и std_logic_vector с использованием TO_BITVECTOR и TO_STDLOGICVECTOR. Они определены в библиотеке ieee.std_logic_1164, а синтаксис описан здесь:

http://www.seas.upenn.edu/~ese171/vhdl/PackageSTD_1164.html

Делать это похоже на прыжки через ненужные обручи, но это должно сработать. Удачи!

Другие вопросы по тегам