在VHDL中实现寄存器时,是否必须编写`else`语句

时间:2014-06-07 11:11:36

标签: vhdl

为了在进程外部实现寄存器,我使用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));

1 个答案:

答案 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}}。