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