一、 变量 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;
| |||||||||||||||||||||||||
VHDL中信号量与变量的区别
最新推荐文章于 2023-06-19 20:03:05 发布