灵敏度列表VHDL过程

时间:2015-01-04 08:52:03

标签: vhdl

我正在尝试使用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;

我的问题与流程中的敏感度列表有关。由于它对选择位的变化敏感,我必须顺序地执行这些功能,首先是减法,然后在测试台中再加一次减法。在这个问题中,我感觉你应该能够顺序完成几个加法,之间没有相减。当然,我可以添加一个启用信号并让过程对此敏感,但我认为应该在问题中说明。我错过了语言中的某些内容,还是我的解决方案“正确”?

1 个答案:

答案 0 :(得分:6)

ALU流程的问题是wait on sel;不包含 ab,因此进程不会唤醒,输出也不会 重新计算这些输入的变化。解决此问题的一种方法是添加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);

使用并行分配,如上所述,可以跳过 灵敏度列表,因此忘记其中一个信号或端口的风险 这是计算的一部分。