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