带 R & S 的 VHDL 行为 D 触发器

VHDL behavioural D Flip-Flop with R & S

您好,有任何人对 VHDL Quartus II 有更多经验吗,请让我明白这一点。 我有以下用于设置和重置的 D 触发器的实体和行为架构。

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY Q1 IS
PORT (D,R,S,CLK :   IN      std_logic;
        Q               :   OUT std_logic
        );
END ENTITY Q1;

ARCHITECTURE behavioural OF Q1 IS
BEGIN
D_FF    :   PROCESS (CLK,R,S)
BEGIN
    IF          R = '0' THEN Q <= '0';
    ELSIF       S = '0' THEN Q <=   '1';
    ELSIF   (rising_edge(CLK)) THEN Q <= D;
    END IF;
END PROCESS D_FF;
END ARCHITECTURE behavioural;

当我使用 Quartus II 编译代码时,出现以下错误消息:

警告 (335093):TimeQuest 时序分析器正在分析 1 个组合循环作为锁存器。

我认为这是对R&S输入的不完整输出分配的警告,但是当我用仅SET输入制作D触发器锁存器时,编译时不会出现此错误消息。这让我想也许我在编写架构时犯了错误?如果有人有任何答案或有用的信息,将不胜感激。

您描述了一个 clock-edge 触发的 flip-flop (FF) 同时具有异步重置和异步设置。同时只支持其中一个,因为 AFAIK,Altera FPGA 上的所有 FF 只有异步复位。

通过反转 FF 数据输入和输出,然后将其重置为低而不是将其设置为高,在 Altera FPGA 上模拟异步集。它看起来像这样:

不要忽视 FF D 输入端的反相器。如果 S 为低电平,则 FF 本身 被异步复位,但由于之后 Q 输出的否定,它表现为一组异步输出 Q 您的实体 Q1。如果 S 为高电平,FF 将取反的输入存储在上升 clock-edge 处,在输出端再次取反。如您所见,FF 的异步重置端口已被使用,因此不能用于实体 Q1.

的额外异步重置

我建议使用 flip-flops 进行同步设置和重置:

ARCHITECTURE sync_rs OF Q1 IS
BEGIN
D_FF    :   PROCESS (CLK)
BEGIN
    IF (rising_edge(CLK)) THEN
        IF          R = '0' THEN Q <= '0';
        ELSIF       S = '0' THEN Q <= '1';
        ELSE                     Q <= D;
        END IF;
    END IF;
END PROCESS D_FF;
END ARCHITECTURE sync_rs;

FPGA 设备中的触发器通常具有异步设置或复位功能,但不能同时具有这两种功能,因此 Altera Quartus 尝试使用锁存器而不是专用硬件来制作所请求的电路。

但是,在大多数情况下,这不是您想要的,因此请改用具有异步复位或设置的触发器,或者按照 Martin Zabel 在他的回答中建议的那样使用同步设置和复位。

请注意,异步复位在高速设计中优于同步复位,因为异步复位不会在主同步数据路径中添加任何登录,这通常是 high-speed 设计的关键路径。

最后,对于异步复位,使用两个 if 单独的语句是一个好习惯,reset 最后,因此计时不依赖于复位断言。对于单位触发器来说这不是问题,但是如果在同一过程中控制更多信号,并且复位不适用于所有信号,那么时钟不应该依赖于那些没有复位的信号的复位,因为这将推断闩锁。代码如下:

D_FF : PROCESS (CLK, R)
BEGIN
  IF rising_edge(CLK) THEN
    Q <= D;
  END IF;
  IF R = '0' THEN
    Q <= '0';
  END IF;
END PROCESS D_FF;

感谢您的回复,我是故意让 R & S 输入异步的。我一直在研究 VHDL 教科书 "Free Range VHDL",并在练习中遇到以下问题:

该问题要求两个输入都是异步的。你说这可以通过反转输入和输出并将其重置为低而不是高来用 Altera 进行仿真。你能稍微扩展一下吗?谢谢