2014-06-07 63 views
1

寄存器时,为了实现一个过程之外的寄存器我用下面的方式when语句`else`声明:我必须写在实现VHDL

registered_sig <= (others => '0') when (RESET = '1') else 
        data_sig when (read_data = '1') and (rising_edge(CLK)) else 
        registered_sig; 

有什么区别之间这个和没有最后一个部分的相同陈述?

registered_sig <= (others => '0') when (RESET = '1') else 
        data_sig when (read_data = '1') and (rising_edge(CLK)); 
+1

您是否发现大多数综合工具都能正确解释此问题?我从来没有这样做过。 – fru1tbat

回答

2

推荐的HDL编码风格应该被用于使用合成 综合工具,如fru1tbat和布赖恩指出也。

对于Altera来说,这可以在"Quartus II Handbook - Recommended HDL Coding Styles"和 找到Xilinx的信息可以在"XST User Guide - Registers HDL Coding Techniques"找到。 Altera和Xilinx都使用process构造显示触发器代码,但是 我无法使用条件并发信号 assign找到任何描述。

如果(使用when)条件同时信号分配则还是使用,那么 它可能是值得考虑的等效代码:

registered_sig <= (others => '0') when (RESET = '1') else 
        data_sig when (read_data = '1') and (rising_edge(CLK)) else 
        registered_sig; 

其写为过程是:

process (RESET, data_sig, read_data, CLK, registered_sig) is 
begin 
    if RESET = '1' then 
    registered_sig <= (others => '0'); 
    elsif (read_data = '1') and (rising_edge(CLK)) then 
    registered_sig <= data_sig; 
    else 
    registered_sig <= registered_sig; 
    end if; 
end process; 

但是这与用于推断Altera和Xilinx中的触发器 的过程的建议VHDL代码不匹配,因为数据的重新分配使用了 使用进程推断触发器 时,不包括。

因此,为了使条件同时信号分配使用process时 匹配结构,如果用 条件同时信号分配为触发器的推断应该是在when没有else一部分。

此外,取出else部分,因为码具有而不, 相同的功能和去除else部分避免了在并行分配的表观环与

registered_sig <= ... else registered_sig; 

次要:它应该是(others => '0'),不(others <= '0')

相关问题