2014-01-25 65 views

回答

1

是的,在VHDL过程中使用的变量是可合成的。

+0

但是,这将如何纳入综合网表。或者等效硬件如何看起来像 – Maximus

+1

这取决于你使用变量的方式。它可以表示组合逻辑(门)或寄存器,取决于在时钟进程中使用它之前还是之后分配它。 –

3

正如Brian Drummond所写,您可以合成具有变量的流程,网表结果取决于变量是在分配之前还是之后读取的。

如果变量被读之前分配,则变量将来自先前时间到当前时间的值 ,和存储(通常触发器 或锁存器)是必需的,以保持状态随着时间的推移。示例代码,其中两个 sigvar将导致触发器,由于可变var分配之前被读取 :

process (clk_i) is 
    variable var : std_logic; 
begin 
    if rising_edge(clk_i) then 
    sig <= var; 
    var := arg; 
    end if; 
end process; 

如果变量之后分配读取,那么任何一个变量值是 未使用,所以没有存储在网表中实现。因此该变量仅用于产生中间值,例如以便于编写代码。 实施例的代码,其中仅sig将导致触发器,由于可变 var分配后读取:

process (clk_i) is 
    variable var : std_logic; 
begin 
    if rising_edge(clk_i) then 
    var := arg; 
    sig <= var; 
    end if; 
end process; 

在更复杂的(现实的)代码,它可能难以确保变量 仅分配后读取,因此不会推断意外存储 (触发器或锁存器)。一种有用的编码风格是在代码的开头为所有变量分配 未知('X')。如果在 指定之前读取变量,则通常会在模拟和调试时发现该错误。 示例代码:

process (clk_i) is 
    variable var : std_logic; 
begin 
    if rising_edge(clk_i) then 
    var := `X`; -- Ensure variable assign before any use to avoid storage 
    var := arg; 
    sig <= var; 
    end if; 
end process; 

注意,在模拟它通常需要额外的努力包括在波形 变量; ModelSim例如在 单独的“本地”视图中显示过程变量。如果保持状态的变量不在 波形中,则调试要困难得多,因为波形然后是 只显示了一半的故事。

因此,一种实用的编码风格是在变量中只使用变量中的中间值,因此在分配后总是进行读取。

+1

+1为了很好的解释。如果“如果变量在*之前/之后被读取”,你会考虑重写“如果变量被使用*之前/之后”吗?我认为,在这种情况下具体说明会使你的观点更有效。 – rick

+0

文字相应更新;好点子。 –