VHDL:内部信号未定义,即使在架构声明部分中定义
所以我一直在为我的VHDL课程做一些家庭作业,我似乎不理解这个问题。 这里的要点是创建一个ALU的加法器/减法器,它同时在2的补码和无符号32位总线上工作,这就是为什么我有一个称为sub_模式(a-B=a+!B+1)的条件,当激活时它也将是进位。 其余的不同输入和输出都是不言自明的。 我的问题是这种组件的测试台,即使carry_temp和r_temp已经在体系结构的声明部分进行了初始化,但最终显示为未定义。我猜这是由于过程中的for循环把一切都搞砸了。这是一个准确的猜测吗?如果是,是否可以继续将两位总线相加,而不必完全创建由n个1位加法器组件构成的n位加法器VHDL:内部信号未定义,即使在架构声明部分中定义,vhdl,test-bench,alu,Vhdl,Test Bench,Alu,所以我一直在为我的VHDL课程做一些家庭作业,我似乎不理解这个问题。 这里的要点是创建一个ALU的加法器/减法器,它同时在2的补码和无符号32位总线上工作,这就是为什么我有一个称为sub_模式(a-B=a+!B+1)的条件,当激活时它也将是进位。 其余的不同输入和输出都是不言自明的。 我的问题是这种组件的测试台,即使carry_temp和r_temp已经在体系结构的声明部分进行了初始化,但最终显示为未定义。我猜这是由于过程中的for循环把一切都搞砸了。这是一个准确的猜测吗?如果是,是否可以继续将
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity add_sub is
port(
a : in std_logic_vector(31 downto 0);
b : in std_logic_vector(31 downto 0);
sub_mode : in std_logic;
carry : out std_logic;
zero : out std_logic;
r : out std_logic_vector(31 downto 0)
);
end add_sub;
architecture synth of add_sub is
signal cond_inv : std_logic_vector(31 downto 0);
signal carry_temp : std_logic_vector(32 downto 0) := (others => '0');
signal r_temp : std_logic_vector(31 downto 0) := (others => '0');
begin
behave : process(a,b,sub_mode)
begin
if sub_mode = '1' then
cond_inv <= b xor x"ffffffff";
else
cond_inv <= b;
end if;
carry_temp(0) <= sub_mode;
for i in 0 to 31 loop
r_temp(i) <= a(i) xor cond_inv(i) xor carry_temp(i);
carry_temp(i+1) <=
(a(i) and cond_inv(i)) or
(a(i) and carry_temp(i)) or
(cond_inv(i)and carry_temp(i));
end loop;
if r_temp = x"00000000" then
zero <= '1';
else
zero <= '0';
end if;
r <= r_temp;
carry <= carry_temp(32);
end process behave;
end synth;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体add_sub是
港口(
a:标准逻辑向量(31到0);
b:标准逻辑向量(31到0);
sub_模式:在标准_逻辑中;
执行:执行标准逻辑;
零:输出标准逻辑;
r:输出标准逻辑向量(31到0)
);
结束添加_sub;
add_sub的体系结构综合
信号状态变量:标准逻辑向量(31向下至0);
信号进位温度:标准逻辑向量(32到0):=(其他=>'0');
信号r_temp:std_逻辑_向量(31向下至0):=(其他=>'0');
开始
行为:过程(a、b、sub_模式)
开始
如果sub_mode='1',则
cond_invcarry_temp
和r_temp
都是从输入分配的。您确定在测试台上初始化了这些值吗?这和外表无关。每个位将单独分配。IEEE Std 1076-2008 14.7.3.4信号更新“网络是驱动器、信号(包括端口和隐式信号)、转换函数和分辨率函数的集合,它们共同决定网络上每个信号的有效值和驱动值。”驱动器在哪里?14.7.5.2初始化“初始化阶段由以下步骤组成:…f)对于模型中的每个非托管流程P,以下操作按指示顺序发生:1)流程执行,直到挂起初始化通常会克服默认初始值。另请参阅11.3过程语句和10.2等待语句,以正确构造行为过程的敏感度列表。提供一个。如果要在单个进程中编写此代码,那么需要立即更新的任何临时变量都需要是一个变量。为什么不松开循环并进行临时进位,然后简单地写入(进位临时进位):=('0'&a)+cond\u inv+进位(0);