如何在 VHDL 中创建具有敏感度列表的进程
您应该始终使用敏感度列表 触发生产模块中的流程。敏感度列表是一个进程的参数,它列出了该进程对其敏感的所有信号。如果任何一个信号发生变化,进程就会被唤醒,并执行其中的代码。
我们已经学会使用 wait on
和 wait until
用于在信号更改时唤醒进程的语句。但是,说实话,这不是我编写大部分流程的方式。
这篇博文是基本 VHDL 教程系列的一部分。
编写 VHDL 代码时,编写方式取决于代码是否仅打算在模拟器中运行。如果我正在编写模拟代码,就像我们在本教程系列中所做的那样,我总是 使用 wait
用于控制进程的语句。如果我正在编写我打算创建物理实现的代码,我从不 使用 wait
声明。
具有敏感度列表的进程的语法是:process(<signal1>, <signal2>, ..) is
begin
<main logic here>
end process;
敏感度列表的一个重要特点是 all 在进程中读取的信号必须在敏感度列表中。但是,如果您未能将信号添加到敏感度列表中,模拟器不会通知您,因为它在 VHDL 语言中是合法的。问题是,如果你不这样做,代码在合成并用于物理实现时会表现不同。
在 VHDL-2008 中,关键字 all
允许使用而不是列出每个信号。不幸的是,大多数合成软件不支持这个新版本的 VHDL 语言。
运动
在本视频教程中,我们将学习如何使用 VHDL 中的敏感度列表创建进程:
我们在本教程中创建的最终代码:
entity T09_SensitivityListTb is end entity; architecture sim of T09_SensitivityListTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; -- Process triggered using Wait On process is begin if CountUp = CountDown then report "Process A: Jackpot!"; end if; wait on CountUp, CountDown; end process; -- Equivalent process using a sensitivity list process(CountUp, CountDown) is begin if CountUp = CountDown then report "Process B: Jackpot!"; end if; end process; end architecture;
当我们在 ModelSim 中按下运行按钮时,模拟器控制台的输出:
VSIM 2> run # ** Note: Process A: Jackpot # Time: 40 ns Iteration: 1 Instance: /t09_sensitivitylisttb # ** Note: Process B: Jackpot # Time: 40 ns Iteration: 1 Instance: /t09_sensitivitylisttb
分析
我们可以从打印输出中看到这两个过程的行为相似。这是因为具有敏感性列表的进程在定义上等同于具有 wait on
的进程 在流程结束时。
具有敏感性列表的进程通常用于要合成的代码中。这种代码通常称为寄存器传输级 (RTL) 代码。这是一个约定,但有充分的理由。虽然有些wait on
和 wait until
语句可以合成,很难知道它会创建什么样的硬件。
外卖
- 具有敏感性列表的进程等效于具有
wait on
的进程 最后 - 在进程中读取的所有信号都必须在敏感度列表中
- 使用
wait
模拟代码中的语句,以及 RTL 代码中的敏感度列表
转到下一个教程 »
VHDL