вычитание 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 для ‹ unsigned(hcount) ›.

Ошибка: формальный ‹ аргумент › не имеет фактического значения или значения по умолчанию.

Ошибка: тип integer не является типом массива и не может быть проиндексирован

Ошибка: найдено «0» определений оператора =, невозможно определить точное определение соответствия перегрузки для -

Кто-то, кто может помочь мне с этой ошибкой? (Я новичок в VHDL)


person Community    schedule 07.03.2017    source источник


Ответы (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 — это общая переменная, что означает, что вы можете назначать ее и в других процессах. Вероятно, это не сработает так, как вы ожидаете. Вы должны полностью избегать общих переменных, пока не получите четкое представление о том, как именно они работают и когда их целесообразно использовать.
person scary_jeff    schedule 07.03.2017
comment
Последний пункт очень важен. Старайтесь не использовать общие переменные, если вы не знаете, что делаете. Используйте переменные в области процесса или используйте сигналы в области архитектуры. Если это не работает для того, чего вы пытаетесь достичь, то я ожидаю, что вы исходите из другого языка программирования. VHDL — это язык проектирования аппаратуры: в коде можно многое, но в итоге все равно приходится думать о нем как о регистрах и логике. Там возможно не все, например нулевая задержка распространения. - person JHBonarius; 08.03.2017