带 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 进行仿真。你能稍微扩展一下吗?谢谢
您好,有任何人对 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 进行仿真。你能稍微扩展一下吗?谢谢