我一直在阅读有关VHDL编程的文本(不要在前面,所以不能给出标题)。我从文本中很难理解的一个问题是何时使用变量与信号。我想我已经清楚地了解何时使用信号(内部信号),而不是变量。
我注意到文本通常在定义一个进程之前声明并初始化信号,而一个变量在一个进程内被声明(我猜它从未初始化..)。
无论如何要清除它,无论是定义还是示例都会很棒!
答案 0 :(得分:39)
当您想要创建序列化代码时,会使用变量,这与普通的并行代码不同。 (序列化意味着命令按顺序执行,一个接一个而不是一起执行)。变量只能存在于进程内部,并且值的赋值不是并行的。例如,请考虑以下代码:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
begin
if (rising_edge(clk)) then
a <= '11111';
b <= a;
end if;
end process;
会在流程运行之前将b
的值加入a
,而不是'11111
'。另一方面,代码:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
variable var : std_logic_vector(0 to 4);
begin
if (rising_edge(clk)) then
var := '11111';
a <= var;
b <= var;
end if;
end process;
会将值'11111'
放入a
和b
。
坦率地说,根据我的经验,大多数时候你不需要使用变量,我使用它的唯一地方是在一个循环中,我需要检查是否有任何一个信号是1:
type BitArray is array (natural range <>) of std_logic;
--...
entity CAU_FARM is
port
(
-- IN --
REQUEST : in BitArray(0 to (FLOW_num -1));
--..
);
end CAU_FARM;
--...
farm_proc: process(CLK_FARM, RESET)
variable request_was_made_var : std_logic;
begin
if RESET = C_INIT then
-- ...
elsif rising_edge(CLK_FARM) then
-- read state machine --
case read_state is
when st_read_idle =>
request_was_made_var := '0';
for i in 0 to (FLOW_num -1) loop
if (REQUEST(i) = '1') then
request_was_made_var := '1';
end if;
end loop;
if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then
read_state <= st_read_stage_1;
for i in 0 to (FLOW_num -1) loop
if (i = choice_out_sig) then
ACKNOWLEDGE(i) <= '1';
end if;
end loop;
else
read_state <= st_read_idle;
end if;
------------------------
when st_read_stage_1 =>
--...
答案 1 :(得分:12)
变量旨在用于在进程中存储值。因此它的范围是有限的。与合成硬件的关系往往不那么直接。
变量也会立即获得值,而信号则不会。以下两个过程具有相同的效果:
signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
process (CLK)
Variable TEMP : STD_LOGIC_VECTOR(0 to 5);
begin
if (rising_edge(clk)) then
TEMP := IP;
IP <= NEXTP;
NEXTP <= TEMP(5) & TEMP(0 to 4);
end if;
end process;
signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
process (CLK)
begin
if (rising_edge(clk)) then
IP <= NEXTP;
NEXTP <= IP(5) & IP(0 to 4);
end if;
end process;
这是因为更新已安排,但尚未实际更改。 <=
包含时间元素。
答案 2 :(得分:7)
变量:临时位置;它们用于在&#34; process&#34;。
中存储中间值信号:更新信号值。通过信号变化激活运行过程。当过程运行时,系统中的所有信号保持不变。
<强>差异:强>
变量:它们是本地的;没有延迟;在流程中声明
信号:它们是全局的(开始之前);由于电线延迟;在关键词开始之前宣布
答案 3 :(得分:1)
另一方面,变量不仅可以存在于进程中(还可以存在于过程中),而且它们可以是可从多个进程访问的共享变量(请参阅:http://www.ics.uci.edu/~jmoorkan/vhdlref/var_dec.html)。
答案 4 :(得分:-1)
变量 - 它们是进程的本地变量,只要变量获得新值,它们的值就会更新。
共享变量 - 就像变量一样,但可以从不同的进程访问它们。
信号 - 它们的范围更大,每个进程都可以访问体系结构或特定块(如果有)中声明的信号。进程暂停或遇到等待语句后会有值更新。