原创 VHDL中信号量与变量的区别

2008-9-25 18:46 5337 11 11 分类: FPGA/CPLD

一、            变量<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


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


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


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


二、            信号


1.有一定的延时性。


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


三、            具体例子。


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


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />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;


仿真结果:


点击开大图

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条