无法将std_logic添加到未签名

时间:2019-09-08 19:29:43

标签: vhdl

我正在编写一个程序,以计算std_logic_vector中的全1,程序中的out也应该是std_logic_vector。向量大小基于通用数字。为了进行计数,我使用了for生成,并将1加到无符号信号上,但是它不起作用。这是来自ide的错误: 第27行。unsigned不能具有返回类型为UNSIGNED的此类操作数。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use IEEE.NUMERIC_STD.ALL;

entity proj2_1 is
     GENERIC (N: INTEGER := 8); -- SIZE OF THE VECTOR
    Port ( VTIN : in  STD_LOGIC_VECTOR (N-1 downto 0);
           VTOUT : out  STD_LOGIC_VECTOR (N-1 downto 0);
              cont: buffer unsigned  (N-1 downto 0) );
end proj2_1;
architecture Behavioral of proj2_1 is
begin
    gen: FOR i IN VTIN' RANGE GENERATE  
    BEGIN
        cont <= cont + ( unsigned (VTIN(i)));
    END GENERATE;
    VTOUT <= std_logic_vector(cont);
end Behavioral;

1 个答案:

答案 0 :(得分:2)

首先,由于软件包std_logic_arith和numeric_std之间存在冲突,因此不应存在无符号可见声明。使用一个或另一个(numeric_std是VHDL标准的一部分)。

第二个VTIN的元素类型是std_logic或std_ulogic,具体取决于与阵列类型/子类型std_logic_vector不兼容的VHDL版本。这意味着类型转换是不合法的。

接下来,将并发信号分配详细说明为一个过程,该过程暗示了最长静态前缀(此处为续)的驱动程序。使VTIN'LENGTH进程生成'X',将解析值,并缩短驱动器输出。

在带有for迭代方案的顺序循环语句中,使用带有用于对“ 1”进行计数的变量的过程来代替generate语句。使用该变量是因为信号cont的值在进程暂停之前不会更新。在循环语句之后,将变量值分配给cont。进程暂停后,cont的值将可用于分配给VTOUT的操作。 std_logic_arith可以向std_logic_vector添加std_logic值,就像-2008中的numeric_std一样(否则unsigned(“”&VTIN(i))会将std_logic转换为unsigned。您还可以实现一个子程序。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- use ieee.std_logic_arith.all;
use IEEE.NUMERIC_STD.ALL;

entity proj2_1 is
     GENERIC (N: INTEGER := 8); -- SIZE OF THE VECTOR
    Port ( VTIN : in  STD_LOGIC_VECTOR (N-1 downto 0);
           VTOUT : out  STD_LOGIC_VECTOR (N-1 downto 0);
              cont: buffer unsigned  (N-1 downto 0) );
end entity proj2_1;
architecture behavioral of proj2_1 is
begin
    -- gen: FOR i IN VTIN' RANGE GENERATE
    -- BEGIN
    --     cont <= cont + ( unsigned (VTIN(i)));
    -- END GENERATE;

SEQUENTIAL_LOOP_NOT_GENERATE_STATEMENT:
    process (VTIN)
    variable ones: unsigned(VTOUT'RANGE);
    begin
        ones := (others => '0'); -- zero
        for i in VTIN'RANGE loop
            ones := ones + unsigned'("" & VTIN(i));
        end loop;
        VTOUT <= std_logic_vector (cont + ones);
    end process;
end architecture behavioral;

generate语句是一个并发语句,对于包含该并发语句的generate参数的每个值,该语句都会详细说明一个块语句,该并发语句具有等效的process语句。流程语句为语句序列中分配的每个信号都有一个驱动程序。一个驱动程序与多个驱动程序。

使用软件包数字std,您还可以将变量(在此声明为整数)(自然)。 numeric_std支持将自然范围整数添加到无符号值。

请注意,没有任何东西定义端口cont的初始值,该初始值具有缓冲模式,本质上是内部读取的输出。默认初始值将是枚举类型std_ulogic的最左边的值(others => 'U')。最初的意图是错误的(从std_logic_vector计算所有1,或者更可能是您在VTIN中实际上是1的总体计数。

后者需要更改:

architecture behavioral of proj2_1 is
begin
SEQUENTIAL_LOOP_NOT_GENERATE_STATEMENT:
    process (VTIN)
    variable ones: unsigned(VTOUT'RANGE);
    begin
        ones := (others => '0'); -- zero
        for i in VTIN'RANGE loop
            ones := ones + unsigned'("" & VTIN(i));
        end loop;
        -- VTOUT <= std_logic_vector (cont + ones);
        VTOUT <= std_logic_vector (ones);
        cont <= ones;
    end process;
end architecture behavioral;

不反映原始代码,但不累积在VTIN的新值中并且可以合成。

人口计数为1的整数变量版本看起来像

architecture integer_variable of proj2_1 is
begin
SEQUENTIAL_LOOP_NOT_GENERATE_STATEMENT:
    process (VTIN)
    variable ones: natural;
    begin
        ones := 0;
        for i in VTIN'RANGE loop
            if TO_BIT(VTIN(i)) = '1' then
                ones := ones + 1;
            end if;
        end loop;
        VTOUT <= std_logic_vector (to_unsigned(ones, VTOUT'length));
        cont <= to_unsigned(ones, VTOUT'length); -- and both outputs don't make sense
    end process;
end architecture integer_variable;

添加整数值不会在添加过程中传播来自VTIN的元值。