亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL
信号与 VHDL 中的变量有何不同

在之前的教程中,我们学习了如何在流程中声明变量。变量有利于在流程中创建算法,但外部世界无法访问它们。如果变量的作用域仅在单个进程内,它如何与任何其他逻辑交互?对此的解决方案是信号 .

架构之间声明信号是 行和 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 添加到它的 价值。再次递增时,第一个递增完全丢失。

外卖

转到下一个教程»


VHDL

  1. 如何在 VHDL 中生成随机数
  2. 如何将 Quartus Prime IP 库链接到 VUnit
  3. 如何在 VHDL 中使用 Signed 和 Unsigned
  4. 如何在 VHDL 中创建环形缓冲区 FIFO
  5. 如何在 VHDL 中创建计时器
  6. 如何在 VHDL 中使用过程