VHDL中信号量与变量的区别

来源:互联网 发布:数据库to date 编辑:程序博客网 时间:2024/05/03 10:47

一、            变量

1.变量是对暂时数据进行局部存储的。

2.变量的说明和赋值只能在顺序部分进行,即只能在进程、过程或函数中进行。

3.变量的赋值具有立即性,不包含延时信息,更像高级语言。

4.如果需要将变量的值用于进程之外,只要将变量的值赋予相同类型的信号即可。

二、            信号

1.有一定的延时性。

2.进程只对信号敏感,不对变量敏感。

三、            具体例子。

写一个JK触发器,看看变量与信号之间的区别。JK触发器的特性方程:

Qn+1 = JQn + KQn

真值表如下:

J

K

Qn

Qn+1

功能说明

0

0

0

1

0

1

保持原态

0

1

0

1

0

0

次态从J

1

0

0

1

1

1

次态从J

1

1

0

1

1

0

与原态相反

 

我特意利用特征方程来写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;

 

 


   
原创粉丝点击