2

我正在研究VHDL,我发现一件事情特别难以理解,因为VHDL是一种HDL,以我的拙见,它所描述的一切都应该能够转换成电路。但是这怎么会发生在变量和过程上呢?有没有可以实现变量处理的电路?你能给我举个例子吗?谢谢

4

2 回答 2

2

包含变量的过程当然可以转换为电路。

这里有几个简单的例子。

Process(clk)
Variable Q : std_logic_vector(7 downto 0);
begin
  if rising_edge(clk) then
     if En = '0' then
        Q := D;
     end if;
  end if;
  Output <= Q;
end process;

在每个时钟周期,如果En(使能)输入为低,则输入数据D存储在变量Q中;否则什么都不会发生(并且变量保持其旧值)。这是一个非常特殊的电路;一个带使能的 8 位寄存器;在旧数据手册中查找 74LS377 以查看 TTL 中的相同电路。

请注意,时钟“if”语句与 En 语句是分开的,并围绕着它。合成工具会寻找他们知道如何翻译的特定模式,这就是其中之一。如果您有任何软件经验,您可能会想将它们结合起来: if rising_edge(Clk) and En = '0' then ...- 在模拟中您会得到完全相同的行为。

然而,一些综合工具可能无法识别这种模式,并且可能会报告错误而不是生成硬件。(合成工具在不断改进,所以你现在可能很幸运)。该工具的文档(例如 Xilinx“综合和仿真设计指南”)应该描述什么是可能的,什么是不可能的。[编辑:] 不幸的是,它停留在 1995 年的实践中,并且包含一些真正可怕的 VHDL 示例。

Process(clk)
Variable Count : Integer range 0 .. 255 := 0;    -- set to 0 when process first starts
begin
  if rising_edge(clk) then
     Count := Count + 1 mod 256;
  end if;
  Output := Count;
end process;

请注意,变量和信号一样,不需要是逻辑类型。整数、数组和记录(有一些限制)是可合成的;浮动通常不是(尽管随着工具的改进,这种情况正在改变)。请注意,我限制了整数的范围,以获得一个 8 位计数器。

对于整数,您还需要明确指定它们溢出时会发生什么(就像我在这里所做的那样) - 否则您将在模拟中出错。但是,指定明显的行为(如这里)不应该花费任何额外的硬件。并且使用其他数字类型,如 numeric_std.unsigned,这些工具并不那么挑剔。

我已经简化了一点;通常在典型过程中有一个 Reset 子句可以让您控制启动行为,但是这些示例是真实的并且应该可以工作。

于 2013-01-29T23:22:45.440 回答
1

变量可以非常方便 - 它们会立即更改,但也可以保持其值从一个滴答到下一个滴答。当您想要访问以前计算的值(通常是您的流程的“输出”)时,这可以避免复制代码。

至于创建电路,变量和信号只是在设计中将值从一个地方转移到另一个地方。变量被限制在一个过程中,信号可以在整个设计中流动。无论哪种方式,合成器的工作都是找出您描述的行为并实现匹配的逻辑。如果您增加一个变量或一个信号,则会产生同一组“门”(或查找表等)。

于 2013-01-30T16:37:51.963 回答