信号与 VHDL 中的变量有何不同
在之前的教程中,我们学习了如何在进程中声明变量。变量有利于在流程中创建算法,但外部世界无法访问它们。如果变量的范围仅在单个进程内,它如何与任何其他逻辑交互?解决方案是信号 .
信号在 architecture <architecture_name> of <entity_name> is
之间声明 行和 begin
VHDL 文件中的语句。这被称为架构的声明部分。
这篇博文是基本 VHDL 教程系列的一部分。
声明信号的语法是:signal <name> : <type>;
可以选择使用初始值声明信号:signal <name> : <type> := <initial_value>;
运动
在本视频教程中,我们学习如何声明信号。我们还将了解变量和信号之间的主要区别:
我们在本教程中创建的最终代码:
entity T06_SignalTb is end entity; architecture sim of T06_SignalTb is signal MySignal : integer := 0; begin process is variable MyVariable : integer := 0; begin report "*** Process begin ***"; MyVariable := MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); MyVariable := MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); wait for 10 ns; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); end process; end architecture;
当我们在 ModelSim 中按下运行按钮时,模拟器控制台的输出:
VSIM 2> run # ** Note: *** Process begin *** # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=1, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: *** Process begin *** # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=3, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=2 # Time: 20 ns Iteration: 0 Instance: /t06_signaltb ...
分析
我们创建了一个初始值为 0 的信号和一个变量。在我们的过程中,我们以完全相同的方式处理它们,但打印输出显示它们的行为不同。首先我们看到变量和信号的赋值在 VHDL 中有不同的表示法。变量赋值使用 :=
运算符 while 信号分配使用 <=
运营商。
MyVariable
行为就像人们期望变量的行为一样。在循环的第一次迭代中,它递增到 1,然后递增到 2。第一次迭代的最后一个打印输出显示它的值仍然是 2,正如我们所期望的那样。
MySignal
行为略有不同。第一个 +1 增量似乎没有任何效果。打印输出显示其值仍为 0,即初始值。在第二个 +1 增量之后也是如此。现在 MyVariable
的值 是 2,但是 MySignal
的值 还是0。wait for 10 ns;
之后 第三个打印输出显示 MySignal
的值 现在是 1。随后的打印输出也遵循此模式。
这是什么法术?我会给你一个线索,wait for 10 ns;
与它有关。信号仅在进程暂停时更新。我们的进程只暂停一个地方,在 wait for 10 ns;
.因此,信号值仅在每次命中这条线时发生变化。 10 纳秒是一个任意值,它可以是任何值,甚至是 0 纳秒。试试吧!
另一个重要的观察是该事件虽然信号在 wait
之前增加了两次 ,它的值只增加一次。这是因为当分配给进程中的信号时,最后的分配“获胜”。 <=
运算符只为信号安排一个新值,直到 wait
.因此,在 MySignal
的第二个增量 , 1 被添加到它的 old 价值。再次递增时,第一次递增完全丢失。
外卖
- 一个变量可以在一个进程中使用,而信号的范围更广
- 变量赋值立即生效,而信号仅在进程暂停时更新
- 如果一个信号被多次分配而没有
wait
,最后一个作业“获胜”
转到下一个教程 »
VHDL