原创 信号和变量有什么不同

2007-3-3 13:54 4452 6 6 分类: FPGA/CPLD
信号和变量有什么不同?

在回答这个问题前,先来看一个简单的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 ;

上面程序的仿真如下图

jpg.gif此主题相关图片如下:
点击看大图

从上面的程序和仿真图中,可以看出信号与变量的一些不同处:
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条评论)

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