亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

信号与 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 价值。再次递增时,第一次递增完全丢失。

外卖

转到下一个教程 »


VHDL

  1. VHDL 中的有符号与无符号
  2. 变量 - VHDL 示例
  3. 云计算与传统计算有何不同?
  4. 如何在 VHDL 中创建字符串列表
  5. 如何在 VHDL 测试平台中停止仿真
  6. 如何在 VHDL 中创建 PWM 控制器
  7. 如何在 VHDL 中生成随机数
  8. 如何在 VHDL 中的进程中使用过程
  9. 如何在 VHDL 中使用不纯函数
  10. 如何在 VHDL 中使用函数
  11. 如何在 VHDL 中创建有限状态机
  12. 什么是北斗卫星导航系统?它与 GPS 有何不同?