我正在尝试使用Peter Ashenden的书“VHDL设计师指南”来学习VHDL,但似乎无法摆脱我错过了与敏感度列表相关的基本项目的感觉。
例如一个问题是“编写一个表示带有整数输入和输出的简单ALU的模型,以及一个类型为bit的函数选择输入。如果函数选择为'0',则ALU输出应该是否则输出应该是输入的差异。“
我的解决方法是
entity ALU is
port (
a : in integer; -- A port
b : in integer; -- B port
sel : in bit; -- Fun select
z : out integer); -- result
end entity ALU;
architecture behav of ALU is
begin -- architecture behav
alu_proc: process is
variable result : integer := 0;
begin -- process alu_proc
wait on sel;
if sel = '0' then
result := a + b;
else
result := a - b;
end if;
z <= result;
end process alu_proc;
end architecture behav;
与测试台
entity alu_test is
end entity alu_test;
architecture alu_tb of alu_test is
signal a, b, z : integer;
signal sel : bit;
begin -- architecture alu_tb
dut: entity work.alu(behav)
port map (a, b, sel, z);
test_proc: process is
begin -- process test_proc
a <= 5; b <= 5; wait for 5 ns; sel <= '1'; wait for 5 ns;
assert z = 0;
a <= 10; b <= 5; wait for 5 ns; sel <= '0'; wait for 5 ns;
assert z = 15;
wait;
end process test_proc;
end architecture alu_tb;
我的问题与流程中的敏感度列表有关。由于它对选择位的变化敏感,我必须顺序地执行这些功能,首先是减法,然后在测试台中再加一次减法。在这个问题中,我感觉你应该能够顺序完成几个加法,之间没有相减。当然,我可以添加一个启用信号并让过程对此敏感,但我认为应该在问题中说明。我错过了语言中的某些内容,还是我的解决方案“正确”?
答案 0 :(得分:6)
ALU流程的问题是wait on sel;
不包含
a
和b
,因此进程不会唤醒,输出也不会
重新计算这些输入的变化。解决此问题的一种方法是添加a
和
'{'到wait
语句,如:
wait on sel, a, b;
但是,为进程编写此代码的常用方法是使用敏感列表,
这是process
关键字之后的信号列表,因此没有。{
wait
声明。
Ashendens第3版第68页描述了敏感度列表:
流程语句包含关键字流程后的敏感度列表。 这是过程敏感的信号列表。当任何一个 这些信号改变值,过程恢复并执行顺序 声明。执行完最后一条语句后,进程暂停 试。
还描述了使用敏感性列表等同于wait
语句
在Ashendens的书中,第152页。
如果重写过程以使用敏感度列表,则它将是:
alu_proc: process (sel, a, b) is
begin -- process alu_proc
if sel = '0' then
z <= a + b;
else
z <= a - b;
end if;
end process alu_proc;
请注意,我删除了result
变量,因为z
输出也可以
在这种情况下直接分配。
当计算中使用任何值时,上述内容将重新计算z
更改,因为计算z
的所有参数都包含在。{
敏感性清单。以这种方式进行这种连续计算的风险,
如果在敏感性列表中忘记了一个或多个参数,
如果遗忘的参数发生变化,则不会重新计算z
的新值。
VHDL-2008允许自动包含所有信号和端口
使用all
时的敏感度列表如:
alu_proc: process (all) is
最后的评论,然后是一个简单的进程进行异步计算,比如
对于显示的ALU,如果生成,则可以在没有进程的情况下进行
z
的写法如下:
z <= (a + b) when (sel = '0') else (a - b);
使用并行分配,如上所述,可以跳过 灵敏度列表,因此忘记其中一个信号或端口的风险 这是计算的一部分。