1

请问以下两种编码风格有什么区别?对于我从 XILINX 示例代码中阅读的第一个。第二,我从一本教授 VHDL 的书中读到它。

1. signal: register std_logic;
   signal: output std_logic;
   process (clk)
   begin
    if rising_edge(clk) then
      register <= outside_signal ; 
    end if;
   end process;

   output <= register;

2. signal: register_reg    std_logic;
   signal: register_next   std_logic;
   signal: output std_logic;
   process (clk)
   begin
    if rising_edge(clk) then
      register_reg <= register_next; 
    end if;
   end process;
   register_next<=outside_signal;
   output <= register_reg;

非常感谢。

4

2 回答 2

0

两个看起来都很时髦的例子:第一个例子使用了一个保留字,第二个例子使用了很多中间信号(也许是有原因的)。

通常,诸如my_output <= my_register;在使用进程从设备中拉出之后(这就是为什么它被称为 my_output)一个内部信号(这就是为什么它被称为 my_register)之类的东西,您可以将其用作计数器或仅拉出一个位输入的 std_logic_vector。

有关几个简单的示例,请参见本文的第 161 页和第 162 页。

于 2013-05-20T16:14:59.147 回答
0

明显的区别是中间信号 register_next 是由 outside_signal 信号声明和驱动的,而不是在进程中直接使用 outside_signal。

简单的答案是没有功能差异。(复杂的答案是register_next<=outside_signal信号延迟了一个增量延迟(不是实际的时间延迟),但是这个增量延迟通常是不可见的,所以如果你不理解这个概念,不要担心。)

从编码风格的角度来看,register_next<=outside_signal应避免通过构造对信号进行“重命名”,因为在读取具有相同功能行为和相同来源的信号以不同名称调用的代码时会造成混淆。

此外,从编码风格的角度来看,我建议由时钟进程驱动的信号名称和输出名称具有一定的相似性。为此,我建议将输出称为例如 result_o,然后将由进程更新的内部信号称为结果。如果要在模块中读取结果,则 VHDL-2002 需要内部中间信号,然后为输出端口分配result_o <= result. 当阅读代码时,更容易理解result_o和result是相关的。因此代码:

process (clk)
begin
 if rising_edge(clk) then
   result <= outside_signal;
 end if;
end process;
result_o <= result;

顺便提一句。“寄存器”是保留的 VHDL 关键字,因此您不能将其用作信号标识符。

于 2013-05-18T16:27:23.820 回答