我在从整数中减去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的整数中。
该行发生以下错误:
错误:通过多个use子句包含多个unsigned声明;没有一个是直接可见的
错误:期望类型为unsigned for&lt; unsigned(hcount)&gt;。
错误:正式&lt; arg&gt;没有实际值或默认值。
错误:类型整数不是数组类型,无法编入索引
错误:找到运算符“=”的'0'定义,无法确定“ - ”的精确重载匹配定义
有人可以帮我解决这个错误吗? (我是VHDL的初学者)
答案 0 :(得分:3)
您尚未在文件顶部包含use
条款,但此错误的含义是use
条款中找到了{{1}的两个不同定义}}。因此,该工具忽略了这两个定义,产生错误并迫使您处理问题。
最可能的解释是你有:
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;
是一个共享变量,这意味着您可能也会在其他进程中分配它。这可能不会像你期望的那样有效。在完全理解它们的工作方式以及何时使用它们之前,您应该完全避免使用共享变量。