2013-05-18 39 views
1

请问以下两种编码风格有什么区别?对于第一个从XILINX示例代码读取的内容。第二,我从一本教VHDL的书中读到它。下面以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; 

非常感谢。

回答

0

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

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

从编码风格的角度来看,应该避免通过register_next<=outside_signal构造对信号进行“重命名”,因为读取具有相同功能行为和相同原点的信号被不同名称调用的代码是令人困惑的。另外,从编码风格的角度来看,我会建议钟控进程驱动的信号的名称和输出的名称有一些定义的相似性。为此,我建议将输出称为例如result_o,并将由进程更新的内部信号称为结果。如果要在模块中读取结果,则VHDL-2002需要内部中间信号,然后将输出端口分配为result_o <= result。当代码被读取时,从而更容易理解result_o和结果是相关的。因此代码:

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

Btw。 “register”是保留的VHDL关键字,所以你不能用它作为信号标识符。

+0

我不确定您是否正确。在ETHZ,IC研究小组推荐第二种方法。 – richieqianle

+0

“第二条路”是什么意思? ETHZ是否有公共的VHDL风格指南;如果对此有其他想法,我想阅读它。 –

0

这两个看起来很时髦的例子:第一个例子使用reserved word,第二个例子使用大量的中间信号(也许有一个原因,但)。

一般的东西,如my_output <= my_register;之后,一个进程被用来拉出设备(这就是为什么它被称为my_output)一个内部信号(这就是为什么它被称为my_register),你可能用作计数器或可能拉只输出输入的std_logic_vector的一个位。

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