【问题标题】:sensitivity list VHDL process敏感度列表 VHDL 过程
【发布时间】:2015-01-04 08:52:03
【问题描述】:

我正在尝试使用 Peter Ashenden 的书“The Designer's Guide to VHDL”来学习 VHDL,但似乎无法摆脱我错过了与敏感度列表相关的基本项目的感觉。

例如,一个问题是“编写一个模型,表示一个简单的 ALU,具有整数输入和输出,以及位类型的函数选择输入。如果函数选择为 '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;

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

【问题讨论】:

  • 等待语句敏感度子句“定义了等待语句的敏感度集,即等待语句对其敏感的信号集。敏感度列表中的每个信号名称将给定信号标识为敏感集的成员。” (权威 IEEE Std 1076-2008,10.2 等待声明)。敏感度列表中没有ab,它们也可以在流程声明声明中提供。 (11.3 过程声明)。 Morten 的答案是基于 Ashenden 的书中首次出现的“敏感列表”和“敏感条款”,结构良好的搜索。

标签: vhdl


【解决方案1】:

ALU进程的问题是wait on sel;不包括 ab,因此进程不会唤醒,输出不会 在这些输入发生变化时重新计算。解决此问题的一种方法是添加 a 和 'b' 到 wait 声明,例如:

wait on sel, a, b;

但是,为进程编写此内容的常用方法是使用敏感度列表, 这是process 关键字之后的信号列表,因此不包含 wait 声明。

Ashendens book 3rd edition page 68 描述了一个敏感列表:

process 语句在关键字 process 之后包含一个敏感度列表。 这是进程对其敏感的信号列表。当任何一个 这些信号改变值,进程恢复并执行顺序 陈述。执行完最后一条语句后,进程挂起 再次。

还描述了使用敏感列表等同于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);

使用像上面这样的并发分配,可以跳过 敏感度列表,因此存在忘记信号或端口之一的风险 这是计算的一部分。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多