VHDL中信号量与变量的区别

一、变量

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;

永不止步步 发表于04-11 11:09 浏览65220次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:305067个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号