【VHDL】信号和变量
世界Skill
关于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变量在同一个线程内执行了两次,第一次的赋值立即生效作用于第二次的赋值,这和信号是不同的。
但要注意,变量的赋值延时还是存在的,不过不用理会线程中其他操作的延时而已。
点击查看评论