为了在进程外部实现寄存器,我使用when
语句,方法如下:
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));
答案 0 :(得分:2)
推荐的HDL编码风格应该用于所使用的合成 合成工具,如fru1tbat和Brian所述。
对于Altera,可以在"Quartus II Handbook - Recommended HDL
Coding Styles"中找到它
对于Xilinx,可以在"XST User Guide - Registers HDL
Coding Techniques"中找到相关信息。
Altera和Xilinx都使用process
结构显示触发器代码,但是
我无法使用条件并发信号找到任何描述
分配
如果仍然使用条件并发信号分配(使用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;
但这与用于推断的过程的推荐VHDL代码不匹配
自从重新分配数据以来,Altera和Xilinx中的触发器
在推断触发器时不包括registered_sig <= registered_sig
有一个过程。
因此,使条件并发信号分配时的结构匹配
使用process
时,如果使用else
,则when
部分应该没有else
部分
用于推断触发器的条件并发信号分配。
此外,删除else
部分,因为代码具有相同的功能,没有,
并删除registered_sig <= ... else registered_sig;
部分避免了使用
(others => '0')
轻微:它应该是(others <= '0')
,而不是{{1}}。