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

信号变量的区别与使用

信号与变量的区别:
(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是并行执行的。
这里写图片描述
这里写图片描述


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值