avrwoo 发表于 2014-3-14 21:20:07

请教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:35:44

本帖最后由 sky5566 于 2014-3-14 21:37 编辑

你搜一下 VHDL中,變數(Variable)與信號(Signal)的區別 .....{:smile:}

3.總結
在一個進程中,如果對一個信號(signal)多次賦值,那麼,只有最後一個值才是有效的。
如果對變數(variable)多次賦值,那麼每次賦值都是有效的,並且,變數的值在再次賦值之前一直保持不變。

avrwoo 发表于 2014-3-14 21:45:37

sky5566 发表于 2014-3-14 21:35
你搜一下 VHDL中,變數(Variable)與信號(Signal)的區別 .....

3.總結


你说的总结里我这里都了解。问题是在第二个程序中。我先给端口赋值。即信号赋值,可以综合出一个触发器,但是第二句变量赋值,也综合出触发器。我就不理解了。变量赋值不是立即生效的吗。怎么也出来个触发器?
和第一段程序就是一个信号赋值和变量赋值的顺序。综合的电路怎么会多一个触发器呢?

sky5566 发表于 2014-3-14 21:57:53

本帖最后由 sky5566 于 2014-3-14 22:04 编辑

avrwoo 发表于 2014-3-14 21:45
你说的总结里我这里都了解。问题是在第二个程序中。我先给端口赋值。即信号赋值,可以综合出一个触发器, ...

if clk'event and clk='1' then
c<=b;<<---"b"何處來?只有 Signal 才能這樣寫吧!{:smile:}
....變數的值在再次賦值之前一直保持不變...

avrwoo 发表于 2014-3-14 22:34:26

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

avrwoo 发表于 2014-3-15 08:59:28

自己顶一下
页: [1]
查看完整版本: 请教VHDL中信号赋值和变量赋值的区别。