信号与变量的区别与使用
信号与变量的区别:
(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 is
Port (
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;
begin
proc1: process(x,y,z) is
variable var_s1,var_s2 :std_logic;
begin
L1: 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 is
component sig_var
port(
x : in STD_LOGIC;
y : in STD_LOGIC;
z : in STD_LOGIC;
res1 : out STD_LOGIC;
res2 : out STD_LOGIC);
end component;
--inputs
signal x: std_logic := '0';
signal y: std_logic := '0';
signal z: std_logic := '0';
-- outputs
signal res1: std_logic :='X';
signal res2: std_logic :='X';
--clock period definitions
constant ClCk_P: time:= 20ns;
begin
uut: sig_var Port Map(
x => x,
y => y,
z => z,
res1 => res1,
res2 => res2);
x_process: process
begin
x <='0';
wait for 4*ClCk_P;
x <= '1';
wait for 4*ClCk_P;
end process x_process;
y_process: process
begin
y <='0';
wait for 2*ClCk_P;
y <= '1';
wait for 2*ClCk_P;
end process y_process;
z_process: process
begin
z <='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是并行执行的。
本文是经验之谈,为数字系统设计课程第二次实验的第二题探讨。在查阅相关资料时没有相应的实验仿真结果说明,对理解有些模糊,故做了仿真记录于此。如有不对的地方希望大家指出,一起学习进步!