VHDL,时钟进程可以引入锁存器吗?

时间:2013-11-22 12:50:37

标签: vhdl

例如,在非时钟处理中,必须在每种情况下设置所有信号以防止锁存器被实现。 但这也是时钟进程中的问题吗?我一直认为情况并非如此,但我的一位朋友告诉我,我必须在所有情况下设置所有信号,以防止合成在这里引入锁存器。

3 个答案:

答案 0 :(得分:1)

正确实现的时钟进程将创建寄存器,其中非时钟进程将创建锁存器。

寄存器与锁存器不同,尤其是我们预测其时序的能力;并且在FPGA中得到更好的支持,所以这通常是一件好事。

“正确实施”意味着只有时钟和(可能)重置)在灵敏度列表中。

答案 1 :(得分:1)

我最近感到很惊讶,因为以下代码会产生锁存器,即使只有时钟和复位位于灵敏度列表中:

library ieee;
use ieee.std_logic_1164.all;

entity unwanted_latches is
    port (
        clock: in std_logic;
        reset: in std_logic
    );
end;

architecture rtl of unwanted_latches is

    function update_vector(vector: std_logic_vector) return std_logic_vector is
        variable return_value: std_logic_vector(vector'range);
    begin
        return_value := vector;
        return_value(0) := not return_value(0);
        return return_value;
    end;

    signal my_vector: std_logic_vector(7 downto 0) := (others => '0');

begin

    update_my_vector: process (clock, reset) begin
        if reset then
            my_vector <= (others => '0');
        elsif rising_edge(clock) then
            my_vector <= update_vector( my_vector );
        end if;
    end process;

end;

Quartus 12.1输出的确切消息是:

  

警告(10631):VHDL流程声明警告   unwanted_latches.vhd(25):推断信号或变量的锁存器   “my_vector”,它在一个或多个路径中保存其先前的值   通过这个过程

所以,我对你的问题的严格回答必须是:是的,时钟进程可以引入锁存器。但我更倾向于同意@MartinThompson这是一个工具问题。

答案 2 :(得分:0)

听起来可能存在术语问题......

  • 触发器是边缘触发的存储元件
  • 锁存器是对电平敏感的存储元件

你不能在一个正确的时钟进程中得到一个锁存器 - 只是灵敏度列表中的时钟(如果复位是异步的,那也是如此)。任何根据该描述生成锁存器的工具都会被破坏。

(我想有可能的是,在过去,你可能会得到你不想要的触发器,如果​​你没有初始化那些不应该制作成触发器的信号,但是有很多古老而错误的围绕VHDL的地方“绝杀”)