[英]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 触发器锁存器时,编译时不会出现此错误消息。 这让我想也许我在编写架构时犯了错误? 如果有人有任何答案或有用的信息,我们将不胜感激。
您已经描述了具有异步复位和异步设置的时钟边沿触发触发器 (FF)。 同时只支持其中一个,因为 AFAIK,Altera FPGA 上的所有 FF 只有异步复位。
通过反转 FF 数据输入和输出,然后将其重置为低而不是将其设置为高,在 Altera FPGA 上仿真异步集。 它看起来像这样:
不要忽视 FF 的D
输入上的反相器。 如果S
很低,则 FF本身被异步重置,但由于事后Q
输出的否定,它表现为实体Q1
的一组异步输出Q
如果S
为高电平,FF 会在时钟上升沿存储取反的输入,并在输出端再次取反。 如您所见, FF的异步重置端口已被使用,因此不能用于实体Q1
的额外异步重置。
我建议改用同步设置和重置的触发器:
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 在他的回答中建议的那样使用同步设置和复位。
请注意,异步复位在高速设计中优于同步复位,因为异步复位不会在主同步数据路径中添加任何登录,而主同步数据路径通常是高速设计的关键路径。
最后,对于异步复位,使用两个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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.