原创 VHDL中,变量(Variable)与信号(Signal)的区别

2009-2-12 14:30 11657 8 9 分类: FPGA/CPLD

关于变量(Variable)和信号(Signal),很多书都有介绍,基本上都是说信号会有延时,而变量是立即赋值的,但是对于两者到底有什么区别,说的不是很透彻。以至于我对两者的理解也一直很模糊,只能在实践中慢慢体会。下面介绍个例子,希望可以给朋友们一点启发:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


1.信号


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity xor_sig is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           C : in  STD_LOGIC;
           X : out  STD_LOGIC;
           Y : out  STD_LOGIC);
end xor_sig;

architecture Behavioral of xor_sig is
signal D: STD_LOGIC;
begin
    SIG:process (A,B,C)
    begin
        D <= A;        -- ignored !!
        X <= C xor D;
        D <= B;        -- overrides !!
        Y <= C xor D;
    end process;
end Behavioral;

这段程序的本意是:X <= A xor C; Y <= B xor C。事实上,在利用ISE 10.1综合以后得到的结果如下图:


点击开大图



等效的逻辑图是这样的:
点击开大图

显然,综合器将信号A给忽略了,这跟我们希望的是不一致的。仔细观察综合过程发现,在综合时会产生一条WARNING:

Input
is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

大意是说输入从未使用,如果是顶层程序或者属于一个子模块并且该子模块有这个端口时,会被保留,其余情况下端口[url=]会被忽略掉。

2.
变量


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity xor_sig is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           C : in  STD_LOGIC;
           X : out  STD_LOGIC;
           Y : out  STD_LOGIC);
end xor_sig;

architecture Behavioral of xor_sig is
begin
    VAR:process (A,B,C)
        variable D: STD_LOGIC;     
    begin
        D := A;
        X <= C xor D;
        D := B;
        Y <= C xor D;
    end process;
end Behavioral;

这段程序的本意与上面是一样的:X <= A xor C; Y <= B xor C在利用ISE 10.1综合以后得到的结果如下图
点击开大图

等效的逻辑图是这样的:

点击开大图
可以看出,采用变量时,程序综合的结果与我们希望的是一致的。

3.
总结


在一个进程中,如果对一个信号多次赋值,那么,只有最后一个值才是有效的。如果对变量多次赋值,那么每次赋值都是有效的,并且,变量的值在再次赋值之前一直保持不变。


信号跟硬件有点类似,并且是在进程结束的时候才更新;变量是立即更新的,因此可以影响程序的功能,但变量的好处是仿真速度更快。


因此,通常情况下,推荐使用信号,可以保证程序的正确性。


 

文章评论1条评论)

登录后参与讨论

用户435905 2013-10-11 18:57

在VHDL中定义的Variable为什么是不能在Object中找到,并且观察它的波形呢?? 这个东西一改就是一个辅助的作用,是不会综合到实际电路中的,你怎么看??
相关推荐阅读
用户1366067 2010-04-13 10:10
理解Avalon总线的静态地址对齐与动态地址对齐
尽管看了不少资料,但是一直对 Avalon slave 的动态地址对齐和静态地址对齐的理解不是很透彻。前两天自己做了一个SOPC的自定义组件,通过Deprecated这个选项的不同选取,一下子就理解了...
用户1366067 2010-03-31 15:00
国内IC公司,还缺点啥?
俺并不算是IC业内人士,但俺用IC、可算是IC业内人士的客户,就从一个应用IC的工程师的角度来简单说说国内IC公司,还欠缺点啥!前两天拿到EDN杂志,看到了无锡芯朋微电子有限公司的广告,在广告中,极力...
用户1366067 2010-03-27 14:51
俺的FPGA接口学习板
    一直以来,都坚定的认为自己是一个硬件爱好者;也一直想把一个硬件工程师必须掌握的几种常用接口,整个明白。今年,终于下定决心,搞一块自己的FPGA接口学习板,系统学习USB接口、网络接口、SD卡读...
用户1366067 2010-03-25 20:22
Firefox 试用
昨天闲得慌,在IT168看到了年度最流行的开源软件的介绍,其中就有Firefox这款浏览器。挺好奇的,就下载了一个。使用两天咯,感觉超棒,HOHO,比以前用的360安全浏览器速度快,功能还多。可惜就是...
用户1366067 2009-11-08 16:10
嵌套式状态机的描述
     在上周,就有写这个日志的打算咯,今天终于完工。    附件中,用一个简单的例子,描述了嵌套状态机的描述方法,一段式、三段式描述方法(1)和(2),其中包含了所有的源代码(所有源代码用VHDL...
用户1366067 2009-10-30 16:49
USB2.0 描述符小结
描述符(descriptor)是一个数据结构,使主机了解设备的格式化信息。每一个描述符可能包含整个设备的信息,或是设备中的一个组件。所有的USB外围设备,都必须对标准的USB描述符作出响应。<?...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条