请教VHDL中信号赋值和变量赋值的区别。
本帖最后由 avrwoo 于 2014-3-14 21:23 编辑偶然间碰到了这么一个问题,请哪位帮助解释一下。
library ieee;
use ieee.std_logic_1164.all;
entity test1 is
port(
clk,a:in std_logic;
c:out std_logic
);
end test1;
architecture bh of test1 is
--signal b,c:std_logic;
begin
process(clk)
variable b:std_logic;
begin
if clk'event and clk='1' then
b:=a;
c<=b;
end if;
end process;
end bh;
在QUARTUS7.2中。上面程序的RTL Viewer中生成的电路图是图1显示的
而把上面程序中进程的两个赋值语句颠倒一下,即
library ieee;
use ieee.std_logic_1164.all;
entity test1 is
port(
clk,a:in std_logic;
c:out std_logic
);
end test1;
architecture bh of test1 is
--signal b,c:std_logic;
begin
process(clk)
variable b:std_logic;
begin
if clk'event and clk='1' then
c<=b;
b:=a;
end if;
end process;
end bh;
在RTL viewer中生成的电路中就多了一个寄存器,如图2显示的,搜了一下信号赋值和变量赋值的特点,但是上面的原因没找到合理的解释。不知道哪位帮助给解释一下。谢谢。
本帖最后由 sky5566 于 2014-3-14 21:37 编辑
你搜一下 VHDL中,變數(Variable)與信號(Signal)的區別 .....{:smile:}
3.總結
在一個進程中,如果對一個信號(signal)多次賦值,那麼,只有最後一個值才是有效的。
如果對變數(variable)多次賦值,那麼每次賦值都是有效的,並且,變數的值在再次賦值之前一直保持不變。
sky5566 发表于 2014-3-14 21:35
你搜一下 VHDL中,變數(Variable)與信號(Signal)的區別 .....
3.總結
你说的总结里我这里都了解。问题是在第二个程序中。我先给端口赋值。即信号赋值,可以综合出一个触发器,但是第二句变量赋值,也综合出触发器。我就不理解了。变量赋值不是立即生效的吗。怎么也出来个触发器?
和第一段程序就是一个信号赋值和变量赋值的顺序。综合的电路怎么会多一个触发器呢? 本帖最后由 sky5566 于 2014-3-14 22:04 编辑
avrwoo 发表于 2014-3-14 21:45
你说的总结里我这里都了解。问题是在第二个程序中。我先给端口赋值。即信号赋值,可以综合出一个触发器, ...
if clk'event and clk='1' then
c<=b;<<---"b"何處來?只有 Signal 才能這樣寫吧!{:smile:}
....變數的值在再次賦值之前一直保持不變... sky5566 发表于 2014-3-14 21:57
if clk'event and clk='1' then
c
也就是说。在c<=b,这句话之前。变量b的值是不定的,因为确定的给bf赋值,尽管在其后有b:=a,也要有寄存器保持b的值。但是信号赋值不是在进程结束之后才更新吗。也就是说虽然c<=b;在前,其值也是晚于变量赋值的。两个程序都应生成一个寄存器啊。还请给解释下。谢谢。
process(clk)
variable b:std_logic;
begin
if clk'event and clk='1' then
c<=b;
b:=a;
end if;
end process
自己顶一下
页:
[1]