我正在学习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/