在回答这个问题前,先来看一个简单的VHDL程序:
library ieee;
use ieee.std_logic_1164.all;
entity testsignal is
port(reset,clock:in std_logic;
numa,numb:out integer range 0 to 255);
end;
architecture test of testsignal is
signal a,b:integer range 0 to 255; --声明信号a,b,注意其位置
begin
process(reset,clock)
variable c:integer range 0 to 255; --声明变量c,注意其位置
begin
if reset='1' then --系统复位时对a,b,c赋初值
a<=0; --对信号赋值用"<="
b<=2;
c:=0; --对变量赋值用":="
elsif rising_edge(clock) then
c:=c+1;
a<=c+1;
b<=a+2;
end if;
end process;
numa<=a; --信号可以在process外使用,变量不行
numb<=b;
end ;
上面程序的仿真如下图
此主题相关图片如下:
从上面的程序和仿真图中,可以看出信号与变量的一些不同处:
1>声明形式与赋值符号不同,变量声明为variable,赋值符号为":=",而信号声明为signal,
代入语句采用"<="代入符。
2>信号在结构体(architecture)内、进程外定义(process);而变量在进程(process)内定义。 换句话说,信号的“有效域”为整个结构,可在不同进程间传递数值;变量的“有效域”只是定 义该变量的进程,不能为多个进程所用。
3>操作过程不同。观察第二个时钟上升沿,可以看出,当执行C:=C+1后C的值立即变成1,A<=C+1
也就相应地变成了A<=1+1(=2);但是B<=A+2却没有相应地变成(2+2)=4,而是保持着原来的(0+2)=2。 这说明,在进程中,变量赋值语句一旦被执行,目标变量立即被赋予新值,在执行下一条语句时, 该变量的值为上一句新赋的值;而信号的赋值语句即使被执行也不会使信号立即发生代入,下一 条语句执行时,仍使用原来的信号值(信号是在进程挂起时才发生代入的).
除了上面说的几个不同点外,变量还有一个作用,那就是:
4>变量可以作数组的索引(index)而信号不行,见下面的例子:
---简单的并串转换(PISO--Parall in serial out)
library ieee;
use ieee.std_logic_1164.all;
entity PISO is
port(reset,clock:in std_logic;
Parallelnum:in std_logic_vector(31 downto 0)
serialout:out std_logic);
end;
architecture convert of PISO is
begin
process(clock)
variable i:integer range 0 to 31;
begin
if reset='1' then
i:=0;
elsif rising_edge(clock) then
serialout<=Parallelnum(i);----变量i作数组parallelnum的index
--i如果为信号,编译时会报错
if i<31 then
i:=i+1;
else
NULL;
end if;
end if;
end process;
end;
文章评论(0条评论)
登录后参与讨论