【VHDL】信号和变量

少女dtysky

世界Skill

时刻2014.05.12

关于VHDL中信号和变量的区别已经被讨论得很多,但很多描述并不清晰,此处将给出博主个人的调试经验。

信号

VHDL中用signal来定义一个信号,信号可以用在除了接口外的任何地方,具有全局性,但要注意它有以下几个特性:

1.赋值的单一性:

信号虽然是全局的,但是仍然不允许在多个进程、或者同时在进程内和进程外存在对同一信号的赋值语句,比如:

singal x:std_logic;

p1:process(clk)
begin
    if clk'event and clk='1' then
        x<='1';
    end if;
end process;

p1:process(clk)
begin
    if clk'event and clk='1' then
        x<='0';
    end if;
end process;

这样写是不被允许的,因为FPGA的每个线程是真正并行的,在不同线程内出现对同一信号的赋值隐含着冲突的风险。

2.赋值的延时性:

在线程内的信号赋值会有延时,并不能够在赋值结束后就立即改变,而是在进程结束后改变。
进程结束的时间取决于设计,也就是取决于一个进程内组合逻辑延时+布线延时,如果这个尺度把握不好,很可能造成下一次采集时信号还未变化或者处于亚稳态,进一步导致slack的存在。


变量

变量用variable定义,只能够在线程之内定义并使用,是作用于局部的,一般用其来构造计数器,实现一些分布执行的操作。

1.赋值的即时性:

变量和信号不同,它的赋值是即时的,也就是说,不必等到线程结束,赋值结束后值就立刻改变,并在之后使用到它的地方产生作用,比如:

p:process(clk)
variable a:integer range 0 to 3:=0;
   if clk'event and clk='1' then
        a:=a+1;
        a:=a+1;
    end if;
end process;

这一段代码实际是有问题的,但我们不考虑多次执行的越界问题,就说执行一次后,a的值应当是a=2
也就是说,a变量在同一个线程内执行了两次,第一次的赋值立即生效作用于第二次的赋值,这和信号是不同的。 但要注意,变量的赋值延时还是存在的,不过不用理会线程中其他操作的延时而已。

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。