当前位置: 代码迷 >> 综合 >> VHDL,process(进程) 中变量(variable)和信号(signal)的区别,仿真对比
  详细解决方案

VHDL,process(进程) 中变量(variable)和信号(signal)的区别,仿真对比

热度:99   发布时间:2023-11-21 14:09:15.0

信号变量的区别与使用

信号与变量的区别:
(1)、声明形式与赋值符号不同
变量声明使用variable,赋值符号位

:=

而信号声明用signal,赋值符号为

<=

(2)、有效域不同
信号的声明在结构体内部,进程、子程序及函数外部声明,而变量只能在进程,函数体,子程序内部进行声明。换句话说,信号的有效作用域为整个结构体,而变量只能在进程,函数体,子程序内部起作用,他们不能为多个进程所共用。
(3)、赋值操作及数据带入时刻不同
在进程中,信号赋值在进程结束时起作用(即整个进程执行到最后一条语句时进程接下来挂起时,数据才发生带入),而变量赋值是立即起作用的。如果在一个进程中多次为一个信号赋值时,只由最后一个值会起作用;而当为变量赋值时,变量值的改变是立即发生的。即变量将保持着当前值,直到被赋予新的值。顺序语句只存在于进程和子程序内部。
(4)、信号的赋值
进程外部信号的赋值;进程外部不能为同一信号多次赋值,即在进程的外部,我们不能够为同一信号多次赋值。

具体区别课参见另外很好的一篇博客

这里我们应用如下模块进行仿真:注意其中的两个进程的异同
环境:win10, 64位,Vivado v2017.4 (64-bit) 仿真时长500ns

sig_var.vhd 如下

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity sig_var isPort ( x : in STD_LOGIC;y : in STD_LOGIC;z : in STD_LOGIC;res1 : out STD_LOGIC;res2 : out STD_LOGIC);
end sig_var;
architecture Behavioral of sig_var is
signal sig_s1,sig_s2 :std_logic;
beginproc1: process(x,y,z) isvariable var_s1,var_s2 :std_logic;beginL1: var_s1 := x and y;L2: var_s2 := var_s1 xor z;L3: res1 <= var_s1 nand var_s2;      end process proc1;proc2: process(x,y,z) is--信号赋值在进程结束时起作用,begin    --如果把 sig_s2,sig_s1添加进process,会和上面有一样的结果L1: sig_s1 <= x and y;L2: sig_s2 <= sig_s1 xor z;L3: res2 <= sig_s1 nand sig_s2;end process proc2;
end Behavioral;

test bench 文件:tb_sig_var.vhd 如下
Apply signal x with a period of 80 ns, signal y with a period of 40 ns, and signal z
with a period of 20ns. All x, y, and z are 0 initially with duty cycle of 50%.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tb_sig_var is
-- Port ( );
end tb_sig_var;
architecture Behavioral of tb_sig_var iscomponent sig_varport(x : in STD_LOGIC;y : in STD_LOGIC;z : in STD_LOGIC;res1 : out STD_LOGIC;res2 : out STD_LOGIC);end component;--inputssignal x: std_logic := '0';signal y: std_logic := '0';signal z: std_logic := '0';-- outputssignal res1: std_logic :='X';signal res2: std_logic :='X';--clock period definitionsconstant ClCk_P: time:= 20ns;
beginuut: sig_var Port Map(x => x,y => y,z => z,res1 => res1,res2 => res2);x_process: processbeginx <='0';wait for 4*ClCk_P;x <= '1';wait for 4*ClCk_P;end process x_process;y_process: processbeginy <='0';wait for 2*ClCk_P;y <= '1';wait for 2*ClCk_P;end process y_process;z_process: processbeginz <='0';wait for ClCk_P;z <= '1';wait for ClCk_P;end process z_process;   
end Behavioral;

仿真结果对比

所有结果看黄线时刻的reg1&2值做对比,修改sig_var.vhd 的 process

1.

这里写图片描述

从结果我们可以看出,变量是立即赋值,最后的值影响最后的输出;对于reg1的值是跟随当前的变量(var_s1,var_s2)的值变化的,而reg2的值是信号(sig_s1 sig_s2)赋值,尽管sig_s1,sig_s2在process里是有改变的,但是他们的值还是保留为上一个process值,当前process的赋值需要在当前process挂起后有效。(真值表可推导)


2.
这里写图片描述
这里写图片描述

如图所示,敏感信号类似于变量


3. 其次,在一个process中,改变语句顺序顺序也会导致不同的结果。可以看出process中的语句是顺序执行的;两个process是并行执行的。
这里写图片描述
这里写图片描述


本文是经验之谈,为数字系统设计课程第二次实验的第二题探讨。在查阅相关资料时没有相应的实验仿真结果说明,对理解有些模糊,故做了仿真记录于此。如有不对的地方希望大家指出,一起学习进步!

  相关解决方案