2014-12-05 86 views
3

我知道如何使用VHDL中的变量以及我可以用它做什么,但是我不知道它在硬件中究竟是什么?VHDL中的变量究竟是什么?

硬件中的信号和变量以及变量存储的值在哪里有什么区别? 它是一根线还是取决于我的代码?

据“QuantumRipple”注释I延伸这样的问题:

我合成了ISE(Xilinx的综合工具)和变量(VAR)下面简单的代码合成为d触发器??

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 

ENTITY test IS 
    port(
     clk : in std_logic; 
     input : in std_logic; 
     output : out std_logic 
    ); 
END test; 

ARCHITECTURE Behavioral OF test IS 
BEGIN 
    PROCESS(clk) 
     VARIABLE var : std_logic; 
    BEGIN 
     IF clk'event AND clk = '1' THEN 
      var := input; 
     END IF; 
     output <= var; 
    END PROCESS; 
END Behavioral; 

感谢意见和答案...

+1

当描述同步逻辑时,大多数信号往往来自FF的输出。变量可以被认为是来自组合逻辑的抽头,这些组合逻辑输入到这些FF的输入中。分配给一个变量增加了组合逻辑的另一个阶段以及变量名指向的网表中的节点被移动。 – 2014-12-05 14:43:24

+0

好的,但有时变量实现,如D触发器,我们没有任何组合元素。你能给我一个一般的答案吗? – Amir 2014-12-05 15:12:57

回答

1

变量可以在几个功能不同的方式使用。结果,合成器可以以几种方式实现它们。

以下适用于计时进程:

如果独立地设置变量在一个过程中,你读它之前,它会纯粹合成为[一组]的LUT。 (复杂的逻辑函数或矢量变量即使对于单个赋值也需要多个LUT)

如果多次更新变量并在更新之间读取它,它将合成多个[LUT组]。这种情况与为每个更新创建一个不同的命名变量没有区别。

如果在过程中设置该变量之前读取该变量的值,并在所有读取之后将其赋值,则它将合成一个触发器。这种配置中的变量的行为等同于信号。

如果在独立设置变量之前根据自身和另一个值的组合设置变量,它将合成一个(未命名的)触发器和一组挂起的LUT。

这些也可以在一定程度上组合。例如,如果您在进程开始时读取一个变量并在最后分配变量,但在中间更新并读取该变量,则会生成一个触发器,其输出用于第一次读取,还有一些LUT的输出用于第二次读取。

没有中间读取的多个分配也被折叠成一组LUT(没有中间值的抽头)。


了解VHDL是如何合成的另一个重要的事情是信号和变量并不真正转化为特定的东西。信号指的是设计中的特定导线(而不是诸如LUT和触发器之间的东西)。在时钟控制的进程中分配的信号通常指的是来自某个触发器的Dout线,并且在组合进程或并发语句中分配的信号通常指的是从LUT出来的线,尽管它可能指的是相同的如果分配中没有逻辑(简单的a <= b),则将其作为另一个信号(包括时钟信号!)。

赋值语句描述了导线之间的关系。

变量不是指固定线,而只是描述行为。 在再次赋值之前用于分配别的东西的每个变量赋值会创建对不同导线的引用(尽管这些导线通常不会像信号线那样明确命名 - 这就是变量的要点)。

合成器采取了这种行为,并试图确定需要哪些LUT和触发器才能使硬件达到此目的。请注意,尽管信号指的是一些固定线,但它们并不涉及全部线。合成器创建许多未命名(合成器生成任意名称)连线,以在每个明确命名的连线之间连接生成的组件(LUT和触发器)。这是因为变量在描述(非固定线)时非常灵活,以至于它们可能会导致生成如此多种不同的基本组件,具体取决于它们的使用方式。


针对您的特殊代码,是的,可变var将导致合成一个触发器。

如果'var'是一个信号并且output <= var;分配超出了过程,它也会做同样的事情。

在您的代码中,var基于唯一赋值来设置,指的是Din为input的时钟元件(触发器)的Dout导线,则输出被指定为指向与var相同的导线。

事实上,它完全一样的东西只是做

IF clk'event and clk = '1' THEN 
     output <= input; 
    END IF; 

在这种情况下,输出只是直接分配给指具有的input嘈杂的时钟元素的DOUT的电线代替使用var作为代理。

+0

非常感谢Quantum。在一个钟控过程中,首先我使用输入参数设置变量,并在过程结束时将相同的变量放入输出参数中,然后将其合成为D触发器。你同意吗? – Amir 2014-12-05 16:18:01

+0

我将不得不看代码说肯定。如果始终从相同的输入设置并始终分配给相同的输出,则实际上将完全优化。如果它从几个输入中选择一个,它将变成一个MUX(通常由LUT构成)。如果您在过程的前面总是设置变量(只要该变量不取决于变量的前一个值),那么它就不会成为触发器。 – QuantumRipple 2014-12-05 16:23:13

+0

感谢“QuantumRipple”,你帮了我很多... – Amir 2014-12-05 19:28:27