gpt4 book ai didi

vhdl - 关于 FPGA 中的顺序代码

转载 作者:行者123 更新时间:2023-12-02 05:10:12 25 4
gpt4 key购买 nike

在VHDL中,在一个process中,所有的步骤都会按顺序执行,但我想知道FPGA是如何按顺序执行步骤的。我对如何在 FPGA 中生成顺序分配、函数等感到非常困惑,所以任何人都可以对这个主题有所了解吗?

process(d, clk)  
begin
if(rising_edge(clk)) then
q <= d;
else
q <= q;
end if;
end process;

这只是一个简单的 D-Latch 的代码,但如何在 FPGA 中实现它?

最佳答案

它并不是按顺序“执行”的,而是合成器按顺序解释代码,并创建硬件设计以适应这种解释。

例如,如果您在一个时钟进程中为一个signal赋值两次,第一次赋值会被简单地忽略,而第二次赋值会生效(记住signal 仅在 process 语句的末尾赋值,而不是立即赋值):

signal a : UNSIGNED(3 downto 0) := (others => '0');

(...)

process(clk)
begin
if(rising_edge(clk)) then
a <= a - 1;
a <= a + 1;
end if;
end process;

上述过程总是将 a 加 1。类似地,如果您在 if 语句中进行第二个赋值,合成器将简单地为 创建两条路径>a - 当 if 语句未完成时递减,当完成时递增。

如果您使用变量,想法是相同的 - 尽管使用了中间值,因为变量会立即采用它们的新值。

但这一切都归结为合成器以顺序方式执行解释您的进程的所有“魔法”,然后生成执行您所描述的操作的硬件。

您的示例基本上描述了一个 d 触发器(Xilinx FPGA 工具 iirc 区分锁存器和触发器,因为触发器是边沿敏感的,而锁存器是电平敏感的),尽管与通常的方式不同推荐。

您基本上可以编写与以下相同的代码:

process(clk)
begin
if(rising_edge(clk)) then
q <= d;
end if;
end process;

在其他情况下它会自动保持它的值。这将作为 FPGA 内部的触发器来实现。大多数 FPGA 由查找表和触发器 block 组成,可以将相当多的不同硬件映射到这些 block 。上面的代码将简单地绕过查找表,只使用其中一个 block 的触发器。

您可以查看特定 FPGA 的数据表,了解有关内部工作原理的更多信息。例如,对于 Spartan3 系列 FPGA,请查看 Xilinx Spartan3 FPGA Family Data Sheet 的第 24 页

关于vhdl - 关于 FPGA 中的顺序代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15601001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com