小泡泡 发表于 2010-4-23 11:37:52

VHDL常见问题解惑

不少人在编写VHDL时常常分不清信号与变量有什么不同。正确使用信号与变量是完成设计的必要环节,这里有一个程序大家看一下。

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;


---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;


entity sig_vari is

port

(reset,clk:in std_logic;

aout,bout,cout:out integer range 0 to 127

);

end sig_vari;


architecture Behavioral of sig_vari is

signal a,b:integer range 0 to 127;

begin

process(reset,clk)

variable c:integer range 0 to 127;

begin

if reset='1' then

    a<=1;

    b<=4;

    c:=1;

elsif rising_edge(clk) then

    c:=c+1;

    a<=c+1;

    b<=a+2;

end if;

cout<=c;

end process;

aout<=a;

bout<=b;





从源代码和波形图中,我们可以看出信号与变量的一些不同。

首先,声明信号用signal,赋值符号为”<=”,而变量声明为variable,赋值符号为”:=”。

其次,信号在architecture内,process外定义;而变量在process内定义。也就是说信号可以在整个结构体内有效,可以在不同进程间传递数值;变量只是在定义该变量的进程中有效,不能被别的进程所用。

   最后,请大家仔细观察reset为0时的第一个时钟上升沿,执行变量运算c:=c+1后c的值立即变成2(可以通过cout监测c的信号),a<=c+1所以a也相应变为3,但是b<=a+2却没有变成5(3+2),而是变成3(1+2)。从这个实例我们可以看出,进程中变量赋值语句一执行,目标变量马上被赋予新值,在执行下一条语句(本例中a<=c+1)该变量值为上一句新赋的值;而信号的赋值不会是信号立即发生改变,下一条语句执行时若用到被赋值变量仍使用原来的信号值(a=1,因此b的值为1+2=3),信号在进程挂起时才发生代入。大家可以写几个变量与信号混合的程序仿真一下,理解变量和信号的区别。

   待

wjfpga 发表于 2010-11-28 16:15:54

为啥没图呢

FPGAgj 发表于 2010-11-29 23:17:01

很好嘛!!

weibode01 发表于 2010-12-1 13:25:16

都是要记的

mhrh 发表于 2010-12-10 15:56:05

:)很好嘛!!
页: [1]
查看完整版本: VHDL常见问题解惑