不少人在编写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,coutut 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),信号在进程挂起时才发生代入。大家可以写几个变量与信号混合的程序仿真一下,理解变量和信号的区别。
待 |