在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中实现呢?
答案 0 :(得分:5)
它不是按顺序“执行” - 但是合成器按顺序解释代码,并创建硬件设计以适应这种解释。
例如,如果在时钟进程中将值分配给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
语句未完全填充时,以及何时填充。
如果你使用变量,这个想法是一样的 - 尽管使用了中间值,因为变量会立即采用它们的新值。
但这一切都归结为合成器完成了以顺序方式解释你的process
的所有“魔力”,然后生成了你所描述的硬件。
您的示例基本上描述了一个d触发器(Xilinx FPGA工具iirc区分锁存器和触发器,因为触发器是边缘敏感的,锁存器是电平敏感的),尽管与通常不同推荐使用。
您基本上可以编写相同的代码:
process(clk)
begin
if(rising_edge(clk)) then
q <= d;
end if;
end process;
在其他情况下,它会自动保留其值。这将作为FPGA内部的触发器实现。大多数FPGA由查找表和触发器块组成,可以映射很多不同的硬件。上面的代码只是绕过查找表,只使用其中一个块的触发器。
通过查看特定FPGA的数据表,您可以了解有关内部工作的更多信息。例如,对于Spartan3系列FPGA,请查看Xilinx Spartan3 FPGA Family Data Sheet的第24页