2013-03-18 59 views
25

我一直在阅读关于VHDL编程的文章(不要在前面,所以不能给出标题)。从文本中我很难理解的一个问题是何时使用变量与信号。我认为我对何时使用信号(内部信号是)有清晰的了解,但对变量没有那么多。VHDL变量比。 Signal

我注意到文本通常在定义一个进程之前声明和初始化信号,而在一个进程中声明一个变量(我猜从未初始化..)。

无论如何,要明确这一点,无论是通过定义还是通过示例将是伟大的!

回答

34

变量用于创建序列化代码,与通常的并行代码不同。 (序列化意味着命令按顺序执行,一个接一个地执行,而不是一起执行)。一个变量只能存在于一个进程内部,并且值的赋值不是平行的。例如,请考虑下面的代码:

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; 

将投入ba价值的过程中运行之前,并没有'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'到两个ab

坦率地说,根据我的经验,大多数时间你不需要使用变量,我使用它的唯一地方是在一个循环中,我需要检查是否有任何一个信号是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

谢谢你们两位!我选择了LLya的答案,因为答案明确指出只有变量**存在于序列化代码的进程中。看起来你们都说同样的事情,但对我来说,'唯一'这个关键词使得它更加清晰。 – doddy 2013-03-25 17:55:54

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; 

这是因为更新获得计划,但并没有真正暂未改变。 <=包括时间元素。

7

变量:临时位置;它们用于在“过程”中存储中间值。

信号:更新信号值。运行过程由信号变化激活。当过程运行时,系统中的所有信号保持不变。

差异:

变量:他们是局部的,没有延迟;过程中声明

信号:他们是全球性的(之前开始);由于电线延迟;在关键字开始之前声明

+0

这很有帮助,谢谢。 – doddy 2015-04-17 17:01:34

-1

变量 - 他们是当地的一个过程,作为变量得到一个新值其价值就更新。

共享变量 - 就像变量,但它们可以从不同的进程访问。

信号 - 它们的范围越大,每一个过程可以访问体系结构或特定的块中声明的信号(如果有的话)。在进程暂停或遇到等待语句后,值会更新。

+0

随着VHDL-2000/2002更新,共享变量不允许与常规类型一起使用。相反,它们只能用于受保护的类型。受保护的类型不允许分配。因此,共享变量更像是对象的句柄,而不是变量。 – 2017-05-12 17:03:55