从整数中减去std_logic_vector

时间:2017-03-07 15:22:38

标签: vector integer logic vhdl subtraction

我在从整数中减去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的初学者)

1 个答案:

答案 0 :(得分:3)

您尚未在文件顶部包含use条款,但此错误的含义是use条款中找到了{{1}的两个不同定义}}。因此,该工具忽略了这两个定义,产生错误并迫使您处理问题。

最可能的解释是你有:

unsigned

use ieee.numeric_std.all; use ieee.std_logic_arith.all; 是非标准的,您应该仅使用std_logic_arith中提供的类型和函数来实现您的设计。删除numeric_std行。

通常,如果某个数字是数字,请使用数字类型来表示它。例如,您的std_logic_arithhcount输入显然是计数器,可以使用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; 是一个共享变量,这意味着您可能也会在其他进程中分配它。这可能不会像你期望的那样有效。在完全理解它们的工作方式以及何时使用它们之前,您应该完全避免使用共享变量。