我正在编写一个程序,以计算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;
答案 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
的元值。