在之前的教程中,我们学习了如何在流程中声明变量。变量有利于在流程中创建算法,但外部世界无法访问它们。如果变量的作用域仅在单个进程内,它如何与任何其他逻辑交互?对此的解决方案是信号 .
在架构
行和 begin
VHDL 文件中的语句。这称为架构的声明部分。
这篇博文是基本 VHDL 教程系列的一部分。
声明信号的语法是:signal
可以选择使用初始值声明信号:signal
锻炼
在本视频教程中,我们学习如何声明信号。我们还将了解变量和信号之间的主要区别:
我们在本教程中创建的最终代码:
entity T06_SignalTb isend entity;T06_SignalTb 的架构模拟是信号 MySignal :integer :=0; begin process 是变量 MyVariable :integer :=0;开始报告“***进程开始***”;我的变量 :=我的变量 + 1;我的信号 <=我的信号 + 1;报告 "MyVariable=" &integer'image(MyVariable) &", MySignal=" &integer'image(MySignal);我的变量 :=我的变量 + 1;我的信号 <=我的信号 + 1;报告 "MyVariable=" &integer'image(MyVariable) &", MySignal=" &integer'image(MySignal);等待 10 ns;报告 "MyVariable=" &integer'image(MyVariable) &", MySignal=" &integer'image(MySignal);结束流程;结束架构;
当我们在 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实例:/t06_signaltb# ** 注意:*** 进程开始 ***# 时间:10 ns 迭代:0 实例:/t06_signaltb# ** 注意:MyVariable=3,MySignal=1# 时间:10 ns 迭代:0 实例:/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 信号赋值使用 <=
操作员。
我的变量
行为就像人们期望变量的行为一样。在循环的第一次迭代中,它增加到 1,然后增加到 2。第一次迭代的最后打印输出显示它的值仍然是 2,正如我们所期望的。
我的信号
行为略有不同。第一个 +1 增量似乎没有任何效果。打印输出显示其值仍为 0,即初始值。在第二次 +1 增量之后也是如此。现在 MyVariable
的值 是 2,但是 MySignal
的值 仍然是 0。等待 10 ns;
第三个打印输出显示 MySignal
的值 现在是 1。后续的打印输出也遵循此模式。
这是什么法宝?我给你一个提示,wait for 10 ns;
有关系。信号仅在进程暂停时更新。我们的进程只暂停一处,在 wait for 10 ns;
.因此,信号值仅在每次命中该线时发生变化。 10 纳秒是一个任意值,它可以是任何值,甚至是 0 纳秒。试试吧!
另一个重要的观察是事件虽然信号在 wait
之前增加了两次 ,它的值只增加一次。这是因为在进程中分配信号时,最后一个分配“获胜”。 <=
运算符只在信号上调度一个新值,直到 wait
之前它不会改变 .因此,在 MySignal
的第二个增量处 , 1 添加到它的旧 价值。再次递增时,第一个递增完全丢失。
外卖
- 变量可以在一个进程中使用,而信号的范围更广
- 变量赋值立即生效,而信号仅在进程暂停时更新
- 如果一个信号被多次分配而没有
wait
, 最后一个任务“获胜”
转到下一个教程»
VHDL