2013-03-24 91 views
2

在VHDL中,在process中,所有步骤将按顺序执行,但我不知道FPGA如何按顺序执行步骤。我对FPGA中如何产生顺序分配,功能和类似问题感到非常困惑,所以任何人都可以对这个主题有所了解?关于FPGA中的连续代码

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

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

回答

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; 

上述过程将始终1.增加a同样,如果你有一个if语句内的第二次分配,合成器将只为a创建两条路径 - 为当if语句减量不是fullfille d,以及它的增量。

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

但是,这一切都归结为合成器完成所有“连续性”解释您的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

+0

24页谢谢你这么多,但我认为信号就像连接不同的输出或输入线和变量像存储器元件...... .......这是我的观念是否真实??????? – 2013-03-25 13:51:31

+0

信号可以被比作电线,是的。但是,当你在时钟过程指定一个值的信号时,合成器推断输入信号和输出信号之间的触发器。大多数工具应该有一个功能,你可以看到你的代码的生成RTL图 - 实验一下了,并且看看你的代码是如何实际上被合成后的样子。 – sonicwave 2013-03-25 14:24:21

+0

非常感谢.... :) – 2013-03-25 15:19:10