我知道如何在VHDL中使用变量以及我可以用它做些什么,但我不确切知道硬件中的变量是什么?
硬件中的信号和变量之间有什么区别?变量存储的值在哪里? 它是电线还是取决于我的代码?
根据" QuantumRipple"评论我延伸了这个问题:
我使用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;
感谢您的评论和回答...
答案 0 :(得分:1)
变量可以以多种功能不同的方式使用。因此,合成器可以通过多种方式实现它们。
以下内容适用于时钟进程:
如果在读取之前在过程中独立设置变量,它将纯粹合成为[一组] LUT。 (复杂的逻辑函数或向量变量即使对于单个赋值也需要多个LUT)
如果多次更新变量并在更新之间读取它,它将合成为几个[组] LUT。这种情况与为每个更新读取对创建不同的命名变量没有什么不同。
如果在变量设置之前读取变量的值并在所有读取之后分配它,它将合成到触发器中。此配置中的变量与信号等效。
如果你在独立设置之前根据自身和另一个值的组合设置变量,它将合成一个(未命名的)触发器和一组挂起的LUT。
这些也可以在一定程度上结合起来。例如,如果你在一个进程的开始读取一个变量并在结尾分配它,而且还在中间更新并读取变量,它将生成一个触发器,其输出用于第一次读取,还有一些输出用于第二次读取的LUT。
没有中间读取的多个分配也会折叠成一组LUT(没有任何东西从中间值中删除)。
理解VHDL如何合成的另一个重要事项是信号和变量并没有真正转化为特定的东西。信号指的是设计中的特定导线(不是像LUT和触发器之间的东西)。在时钟进程中分配的信号通常是指来自某个触发器的Dout线,并且在组合进程或并发语句中分配的信号通常是指从LUT出来的线,尽管它可能指的是相同的如果赋值中没有逻辑(简单的a <= b
),则将其作为另一个信号(包括时钟信号!)。
赋值语句描述了连线之间的关系。
变量不是指固定电线,而只是描述行为。 在再次分配之前用于分配其他内容的每个变量赋值会创建对不同线路的引用(尽管这些线路通常不会像信号线那样明确命名 - 这是变量的点。)
合成器采用该行为并尝试确定使硬件执行此操作所需的LUT和触发器集。请注意,虽然信号指的是某些固定电线,但它们并不是指所有电线。合成器创建许多未命名的(合成器生成任意名称)导线,以在每个明确命名的导线之间连接生成的组件(LUT和触发器)。这是因为变量在描述(不是固定的导线)中是如此灵活,以至于它们可能导致生成基本组件的这么多不同组合,具体取决于它们的使用方式。
对于您的特定代码,是的,变量var
将导致触发器被合成。
如果'var'是一个信号并且output <= var;
赋值在进程之外,它也会做同样的事情。
在你的代码中,var是基于唯一赋值来设置的,用于引用具有input
的Din的时钟元素(触发器)的Dout线,然后分配输出以指代相同的wire as var。
事实上,它与完成
完全相同 IF clk'event and clk = '1' THEN
output <= input;
END IF;
在这种情况下,直接指定输出以引用具有input
Din的时钟元素的Dout线,而不是使用var
作为代理。