它不是按顺序“执行”,而是合成器顺序解释代码,并创建硬件设计以适应这种解释。
举例来说,如果你在一个时钟处理一个值赋给一个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
24页谢谢你这么多,但我认为信号就像连接不同的输出或输入线和变量像存储器元件...... .......这是我的观念是否真实??????? – 2013-03-25 13:51:31
信号可以被比作电线,是的。但是,当你在时钟过程指定一个值的信号时,合成器推断输入信号和输出信号之间的触发器。大多数工具应该有一个功能,你可以看到你的代码的生成RTL图 - 实验一下了,并且看看你的代码是如何实际上被合成后的样子。 – sonicwave 2013-03-25 14:24:21
非常感谢.... :) – 2013-03-25 15:19:10