一、变量
1.变量是对暂时数据进行局部存储的。
2.变量的说明和赋值只能在顺序部分进行,即只能在进程、过程或函数中进行。
3.变量的赋值具有立即性,不包含延时信息,更像高级语言。
4.如果需要将变量的值用于进程之外,只要将变量的值赋予相同类型的信号即可。
二、信号
1.有一定的延时性。
2.进程只对信号敏感,不对变量敏感。
三、具体例子。
写一个JK触发器,看看变量与信号之间的区别。JK触发器的特性方程:
Qn+1 = JQn + KQn
真值表如下:
我特意利用特征方程来写JK触发器,当然也可以用结构的行为描述来写!
错误做法,使用了信号,原码如下:
-- jkff1.vhd
library ieee;
use ieee.std_logic_1164.all;
entity jkff1 is
port( clk : in std_logic;
j : in std_logic;
k : in std_logic;
reset: in std_logic;
q,qn : out std_logic);
end jkff1;
architecture a of jkff1 is
signal state : std_logic;
signal tmp_a, tmp_b : std_logic;
begin
process(clk,reset)
begin
if(reset = '1') then
state <= '0';
elsif (clk'event and clk = '1') then
tmp_a <= j and (not state); //由于信号赋值延时,导致计算错误!
tmp_b <= (not k) and state;
state <= tmp_a or tmp_b;
end if;
q <= state;
qn <= not state;
end process;
end a;
仿真结果:可以看出有些地方输出是红色,表示不确定。
使用了变量后,源码如下:
-- jkff.vhd
library ieee;
use ieee.std_logic_1164.all;
entity jkff is
port( clk : in std_logic;
j : in std_logic;
k : in std_logic;
reset: in std_logic;
q,qn : out std_logic);
end jkff;
architecture a of jkff is
begin
process(clk,reset)
variable state : std_logic;
variable tmp_a, tmp_b : std_logic;
begin
if(reset = '1') then
state := '0';
elsif (clk'event and clk = '1') then
tmp_a := j and (not state);
tmp_b := (not k) and state;
state := tmp_a or tmp_b;
end if;
q <= state;
qn <= not state;
end process;
end a;