VHDL或verilog SR锁存器

VHDL或verilog SR锁存器,vhdl,verilog,Vhdl,Verilog,我正试图用带有启用信号C的与非门的SR锁存器对我的NEXYS2板进行编程。我的输入是(S,R,C),而输出是(Q,Qbar)。下面是一些VHDL代码,我尝试过,但不断出错。如果有助于任何人理解我的问题,示意图如下。如果你在verilog中知道,也没关系。 先谢谢你 process(S,R,C,Q,Qbar) begin if (C = '1') then Q <= (R nand Qbar); Qbar <= (S nand Q); e

我正试图用带有启用信号C的与非门的SR锁存器对我的NEXYS2板进行编程。我的输入是(S,R,C),而输出是(Q,Qbar)。下面是一些VHDL代码,我尝试过,但不断出错。如果有助于任何人理解我的问题,示意图如下。如果你在verilog中知道,也没关系。 先谢谢你

process(S,R,C,Q,Qbar)
begin
    if (C = '1') then
        Q <= (R nand Qbar);
        Qbar <= (S nand Q);
    end if;
end process;
过程(S、R、C、Q、Qbar)
开始
如果(C='1'),则

首先,您对原理图的实现是不正确的:R应该是 ~S,S应该是~R。请尝试在S或R等于1的情况下跟踪逻辑 当C为1时,输出应设置为高

更正了Verilog(我这里只有Altera和Verilog):

以及来自正时分析仪的警告,表明其分析了两个组合 环作为闩锁。技术观点看起来似乎有道理,但你有一个 此编码样式存在问题,可能会导致问题

问题在于,您只显式地编写了反馈路径的代码,但是您还需要 让合成器推断闩锁。您的代码包括
if(C='1')
,因此 当C不是1时,合成器推断内存行为-锁存器。但是, 是没有意义的,因为您还明确地告诉它闩锁的位置 您的反馈路径。不要两者都做;认为任何 合成器足够聪明,可以理解你们真正的意思。这里有一个 对您想要的内容毫无疑问的版本:

module top(
           input wire S, R, C,
           output wire Q, Qbar);

   wire   S2   = ~(C & S);
   wire   R2   = ~(C & R);
   assign Q    = ~(S2 & Qbar);
   assign Qbar = ~(R2 & Q);
endmodule 
相反,这会给出两个“发现2个节点的组合循环”警告,如下所示: 你会想到的。这也综合了Ok,RTL/技术视图看起来不错, 乍一看

标准免责声明:计时分析器不擅长使用 组合循环。如果你只是在玩,这一切可能都会起作用 但如果这是一个真正的设计,你需要认真考虑你的设计 约束,以及分析器是否实际跟踪了 反馈路径(可能没有)。你需要用sdf做一个定时sim卡
返回注释以确认其实际工作。

首先,您的原理图实现不正确:R应该是 ~S,S应该是~R。请尝试在S或R等于1的情况下跟踪逻辑 当C为1时,输出应设置为高

更正了Verilog(我这里只有Altera和Verilog):

以及来自正时分析仪的警告,表明其分析了两个组合 环作为闩锁。技术观点看起来似乎有道理,但你有一个 此编码样式存在问题,可能会导致问题

问题在于,您只显式地编写了反馈路径的代码,但是您还需要 让合成器推断闩锁。您的代码包括
if(C='1')
,因此 当C不是1时,合成器推断内存行为-锁存器。但是, 是没有意义的,因为您还明确地告诉它闩锁的位置 您的反馈路径。不要两者都做;认为任何 合成器足够聪明,可以理解你们真正的意思。这里有一个 对您想要的内容毫无疑问的版本:

module top(
           input wire S, R, C,
           output wire Q, Qbar);

   wire   S2   = ~(C & S);
   wire   R2   = ~(C & R);
   assign Q    = ~(S2 & Qbar);
   assign Qbar = ~(R2 & Q);
endmodule 
相反,这会给出两个“发现2个节点的组合循环”警告,如下所示: 你会想到的。这也综合了Ok,RTL/技术视图看起来不错, 乍一看

标准免责声明:计时分析器不擅长使用 组合循环。如果你只是在玩,这一切可能都会起作用 但如果这是一个真正的设计,你需要认真考虑你的设计 约束,以及分析器是否实际跟踪了 反馈路径(可能没有)。你需要用sdf做一个定时sim卡
返回注释以确认其实际工作。

首先,您的原理图实现不正确:R应该是 ~S,S应该是~R。请尝试在S或R等于1的情况下跟踪逻辑 当C为1时,输出应设置为高

更正了Verilog(我这里只有Altera和Verilog):

以及来自正时分析仪的警告,表明其分析了两个组合 环作为闩锁。技术观点看起来似乎有道理,但你有一个 此编码样式存在问题,可能会导致问题

问题在于,您只显式地编写了反馈路径的代码,但是您还需要 让合成器推断闩锁。您的代码包括
if(C='1')
,因此 当C不是1时,合成器推断内存行为-锁存器。但是, 是没有意义的,因为您还明确地告诉它闩锁的位置 您的反馈路径。不要两者都做;认为任何 合成器足够聪明,可以理解你们真正的意思。这里有一个 对您想要的内容毫无疑问的版本:

module top(
           input wire S, R, C,
           output wire Q, Qbar);

   wire   S2   = ~(C & S);
   wire   R2   = ~(C & R);
   assign Q    = ~(S2 & Qbar);
   assign Qbar = ~(R2 & Q);
endmodule 
相反,这会给出两个“发现2个节点的组合循环”警告,如下所示: 你会想到的。这也综合了Ok,RTL/技术视图看起来不错, 乍一看

标准免责声明:计时分析器不擅长使用 组合循环。如果你只是在玩,这一切可能都会起作用 但如果这是一个真正的设计,你需要认真考虑你的设计 约束,以及分析器是否实际跟踪了 反馈路径(可能没有)。你需要用sdf做一个定时sim卡
返回注释以确认其实际工作。

首先,您的原理图实现不正确:R应该是 ~S,S应该是~R。请尝试在S或R等于1的情况下跟踪逻辑 当C为1时,输出应设置为高

更正了Verilog(我这里只有Altera和Verilog):

以及来自正时分析仪的警告,表明其分析了两个组合 环作为闩锁。技术观点看起来似乎有道理,但你有一个 此编码样式存在问题,可能会导致问题

问题在于,您只显式地编写了反馈路径的代码,但是您还需要 让合成器推断闩锁。
entity sr_latch is
  port ( 
    s, r, c: in bit;
    q, qbar: buffer bit);
end entity;

architecture sr_latch of sr_latch is 
begin 
  q <= (s nand c) nand qbar;
  qbar <= (r nand c) nand q;
end architecture