Вычитание std_logic_vector из целого числа
У меня проблема вычитания STD_LOGIC_VECTOR из целого числа.
Вот код, который у меня есть сейчас:
entity ROM is
Port ( hcount: in STD_LOGIC_VECTOR(9 downto 0);
vcount: in STD_LOGIC_VECTOR(9 downto 0);
hpos: in integer;
vpos: in integer;
clk25: in STD_LOGIC;
Pixeldata: out std_logic);
end ROM;
architecture Behavioral of ROM is
signal romtemp : std_logic_vector(9 downto 0);
shared variable yas : integer range 0 to 9 := 0;
shared variable xas : integer range 0 to 9 := 0;
Type RomType is array (9 downto 0) of std_logic_vector(9 downto 0);
Constant Rom: RomType :=
( "0001111000", "0111111110", "0111111110", "1111111111", "1111111111"
, "1111111111", "1111111111", "0111111110", "0111111110", "0001111000");
begin
process(clk25)
begin
if(hpos > hcount - 10) and (hpos <= hcount) and (vpos > vcount - 10) and (vpos <= vcount) then
xas := hpos - to_integer(unsigned(hcount));
end if;
end process;
end Behavioral;
Проблема заключается в следующей строке кода:
xas := hpos - to_integer(unsigned(hcount));
Я пытаюсь поместить вычитание в целое число с именем xas.
В этой строке происходят следующие ошибки:
Ошибка: множественные объявления без знака включены через несколько предложений использования; ни один не сделан прямо видимым
Ошибка: ожидается тип unsigned для
. Ошибка: формальный
не имеет фактического значения или значения по умолчанию. Ошибка: тип целое число не является типом массива и не может быть проиндексирован
Ошибка: найдено '0' определений оператора "=", невозможно определить точное определение соответствия перегрузки для "-"
Кто-то, кто может помочь мне с этой ошибкой? (Я новичок в VHDL)
1 ответ
Вы не включили свой use
пункты в верхней части файла, но эта ошибка говорит о том, что из use
пункты, он нашел два разных определения unsigned
, Из-за этого инструмент игнорировал оба определения, создавая ошибку и заставляя вас решать проблему.
Наиболее вероятным объяснением является то, что у вас есть:
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
std_logic_arith
является нестандартным, и вы должны реализовать свой дизайн, используя типы и функции, доступные в numeric_std
только. Удалить std_logic_arith
линия.
В общем, если что-то является числом, используйте числовой тип для его представления. Например, ваш hcount
а также vcount
входы явно являются счетчиками и могут использовать тип unsigned
, Если вы в первую очередь используете более подходящие типы, вы избегаете необходимости неуклюжих преобразований типов, например:
xas := hpos - to_integer(unsigned(hcount));
станет
xas := hpos - hcount;
Дополнительные проблемы в вашем коде:
- Ваш список чувствительности процесса содержит только
clk25
, но процесс на самом деле не является синхронным процессом, и поэтому все используемые входные сигналы должны быть в списке (или вы можете использовать зарезервированныйall
ключевое слово для генерации автоматического списка, т.е.process(all)
). - Если это не какой-то особый случай, вам лучше привыкнуть писать синхронные процессы. Это выглядит так:
process(clk)
begin
if (rising_edge(clk)) then
-- Do things
end if;
end process;
xas
является общей переменной, которая подразумевает, что вы можете назначать ее и в других процессах. Это, вероятно, не будет работать так, как вы ожидаете. Вам следует избегать общих переменных, пока у вас не будет четкого понимания того, как именно они работают, и когда может быть целесообразно использовать их.