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

VHDL,时钟进程可以引入锁存吗?,vhdl,Vhdl,例如,在未锁定的过程中,必须在每种情况下设置所有信号,以防止执行锁存。 但这也是一个循序渐进的过程吗?我一直认为情况并非如此,但我的一位朋友告诉我,我必须在所有情况下设置所有信号,以防止合成在这里引入锁存。正确实现的时钟进程将创建寄存器,其中未锁存的进程将创建锁存 寄存器不同于锁存器,特别是在我们预测其计时的能力方面;以及更好地支持FPGA,所以这通常是一件好事 “正确实施”意味着只有时钟和(可能)重置)在灵敏度列表中。听起来可能有术语问题 触发器是边缘触发的存储元件 闩锁是对电平敏感的存储元

例如,在未锁定的过程中,必须在每种情况下设置所有信号,以防止执行锁存。
但这也是一个循序渐进的过程吗?我一直认为情况并非如此,但我的一位朋友告诉我,我必须在所有情况下设置所有信号,以防止合成在这里引入锁存。

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

寄存器不同于锁存器,特别是在我们预测其计时的能力方面;以及更好地支持FPGA,所以这通常是一件好事


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

听起来可能有术语问题

  • 触发器是边缘触发的存储元件
  • 闩锁是对电平敏感的存储元件
你不能在一个时钟进程中得到一个正确的锁存器——只有灵敏度列表中的时钟(如果重置是异步的,也可以)。根据该描述产生闩锁的任何工具都会损坏


(我想,在古代,如果你不初始化不应该制作成触发器的信号,你可能会得到你不想要的触发器,但VHDL有很多古老但错误的“知识”)

我最近很惊讶,因为下面的代码会产生锁存,即使灵敏度列表上只有时钟和复位:

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;
ieee库;
使用ieee.std_logic_1164.all;
实体不需要的锁定是
港口(
时钟:标准逻辑;
复位:在标准逻辑中
);
结束;
不需要的_锁存器的体系结构rtl是
函数更新向量(向量:标准逻辑向量)返回标准逻辑向量
变量返回值:标准逻辑向量(向量范围);
开始
返回值:=向量;
返回值(0):=不返回值(0);
返回_值;
结束;
信号my_向量:标准逻辑_向量(7到0):=(其他=>'0');
开始
更新我的向量:进程(时钟、重置)开始
如果重置,则
我的_向量“0”);
elsif上升沿(时钟),然后

我的向量试着问@CraigGraham:没关系,这里也有足够多的硬件类型:)Brian的答案很准确,我只想提到“闩锁”、“触发器”和“寄存器”经常互换使用。对我来说,“锁存器”是电平敏感的,“触发器”是边缘敏感的,“寄存器”可以是任意一个。如果您有一个时钟进程,那么推断的存储元素将使用该时钟规范。有趣的是,我一直理解“寄存器”是指“n宽触发器”,其中n通常大于1。但TTL数据手册确实使用了“寄存器”来涵盖触发器和锁存器。(74LS374 vs 74LS373)也许是因为使用率有所下降?如今,在板级和FPGA级上使用电平敏感寄存器的情况不太常见,但锁存器仍然比触发器小(如果你正在计算晶体管),具有多相非重叠时钟的高性能IC设计可以很好地利用它们(例如).当然,如果你在一家支持多相时钟的技术公司工作,那么是的,锁存器仍然是一个可行的选择。我想我相当震惊了一个刚毕业的学生,因为我建议使用它们……一个寄存器文件可以由D锁存器组成。该术语具有计算机体系结构的含义,意味着“存储”。IEEE Std 1076.6-2004将存储分类为“边缘敏感存储”和“电平敏感存储”。请注意,我们通常给出比链接引用更广泛的寄存器含义,特殊用途或I/O寄存器可以与指令大小解耦。OK。所以它至少把警告弄糟了。你查过网络列表了吗?那里真的有门闩吗?这是一个错误,您应该报告它。这是一个简化的示例,它在网络列表查看器上显示没有闩锁。然而,我的实际项目更大,在那里我看到了真正的闩锁。Altera意识到了这个问题——当进程进行异步重置,并且某些位保持不变时,就会发生这种情况。问题是:由于Quartus®II软件中存在问题,如果您的代码使用异步重置实现递增或递减,其中一些位保持不变,则可能会看到此警告。[…]在这种情况下,忽略警告是安全的,因为没有实现闩锁。感谢您提供Altera链接进行警告(10631)。“在这种情况下,忽略警告是安全的,因为没有实现闩锁。”Jim试图关注的重点。听起来你正在获得所需的硬件。我把这个放在合成工具幽默下。我最喜欢的(可能是历史性的)与案例陈述有关:“警告:忽略其他人,因为所有条件都已指定”。看到这个警告,人们可能会想,如果我不理会其他警告,他们会怎么做:“错误:用case语句遗漏其他警告”。)