请问以下两种编码风格有什么区别?对于第一个问题,我从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;
明显的区别是中间信号register_next是由outside_signal信号声明和驱动的,而不是直接在进程中使用outside_signal。
简单的答案是没有功能差异。(复杂的答案是register_next<=outside_signal
通过增量延迟(不是实际的时间延迟)延迟信号,但这个增量延迟通常是不可见的,所以如果你不理解这个概念也不用担心。)
从编码风格的角度来看,应该避免通过register_next<=outside_signal
结构对信号进行"重命名",因为当具有相同功能行为和相同来源的信号被不同的名称调用时,读取代码会令人困惑。
此外,从编码风格的角度来看,我建议由时钟进程驱动的信号的名称和输出的名称具有一些定义的相似性。为此,我建议将输出称为result_o,然后将进程更新的内部信号称为result。如果要在模块中读取结果,则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;
顺便说一句。"register"是保留的VHDL关键字,所以你不能使用它作为信号标识符。
这两个例子看起来都很奇怪:第一个例子使用了一个保留词,第二个例子使用了大量的中间信号(也许有原因)。
通常像my_output <= my_register;
这样的东西在一个进程被用来拉出设备(这就是为什么它被称为my_output)一个内部信号(这就是为什么它被称为my_register),你可能用作计数器,或者可能只拉出输入的std_logic_vector的一位。
见第161和162页的几个简单例子