关于FPGA中的顺序代码

Kar*_*hah 2 fpga vhdl

在VHDL中,process所有步骤都将按顺序执行,但我想知道FPGA如何按顺序执行步骤.我对FPGA中如何生成顺序赋值,函数和类似内容感到非常困惑,所以有人可以对这个主题有所了解吗?

process(d, clk)  
begin    
  if(rising_edge(clk)) then  
    q <= d;  
  else
    q <= q;  
  end if;    
end process;
Run Code Online (Sandbox Code Playgroud)

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

son*_*ave 5

它不是按顺序"执行" - 但是合成器顺序地解释代码,并创建硬件设计以适应这种解释.

例如,如果signal在时钟进程中将值赋值为两次,则第一次赋值将被忽略,而第二次赋值将生效(请记住,a 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;
Run Code Online (Sandbox Code Playgroud)

上面的过程总是递增a1.同样,如果你在一个if语句中有第二个赋值,那么合成器将简单地创建两个路径a- 当if语句未完全填充时的减量,以及何时填充的增量.

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

但这一切都归结为合成器完成process了以顺序方式解释你的所有"魔力" ,然后生成了你所描述的硬件.

您的示例基本上描述的d触发器(Xilinx的FPGA工具IIRC区分锁存器和在该触发器的触发器是边缘敏感的,并且锁存器是电平敏感),虽然以不同的方式比通常推荐的.

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

process(clk)
begin
  if(rising_edge(clk)) then
    q <= d;
  end if;
end process;
Run Code Online (Sandbox Code Playgroud)

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

您可以通过查看特定FPGA的数据表了解有关内部工作的更多信息.例如,对于Spartan3系列FPGA,请查看Xilinx Spartan3 FPGA系列数据手册的第24