variables - VHDL:变量和过程

标签 variables process vhdl

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

最佳答案

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

这里有几个简单的例子。

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“synthesis and simulation design guide”)应该描述什么是可能的,什么是不可能的。 [编辑:]不幸的是,它停留在 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;

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

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

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

关于variables - VHDL:变量和过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592511/

相关文章:

mysql - 如何将查询结果赋值给变量?

python - 如何将列表的每个元素分配给单独的变量?

c - 如何使用 C 将具有 2 个变量的 IF 语句转换为 switch 函数?

c# - 将程序集作为进程运行

concurrency - 使用并发语句实现触发器

vhdl - 如何使用 numeric_std 添加 std_logic

使用变量的 jQuery 动画

.net - 列出进程中的 AppDomain

process - 处理来自 KEXT 的进程信息

VHDL 算术 shift_left