关于FPGA中的顺序代码

时间:2013-03-24 16:29:03

标签: vhdl fpga

在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中实现呢?

1 个答案:

答案 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页