VHDL或verilog SR锁存器

时间:2013-11-28 02:17:29

标签: vhdl verilog

我尝试使用带有NAND门的 SR锁存器编程我的 NEXYS2 电路板并启用信号C.我的输入(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;

Schematic

2 个答案:

答案 0 :(得分:2)

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

更正了Verilog(我这里只有Altera&amp; Verilog):

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

   always @(S, R, C, Q, Qbar)
      if(C) begin
         Q    <= (~R & Q) | S;
         Qbar <= (~S & Q) | R;
      end
endmodule

这在Altera上合成了Ok,并且有两条警告

Warning (10240): Verilog HDL Always Construct warning at test.v(5): inferring latch(es) for variable "Q", which holds its previous value in one or more paths through the always construct

并且时间分析仪发出警告,它分析了两个组合 循环作为锁存器。技术观点看似合理,但你有一个 这种编码风格的问题,可能导致问题。

问题是你明确地编写了唯一的反馈路径,但你也是 离开合成器推断闩锁。您的代码包含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进行计时模拟 反向注释以确认它确实有效。

答案 1 :(得分:0)

您的原理图是正确的。

问题出在您的VHDL代码中,因为您没有完全指定电路的功能(请注意,未定义c ='0'的输出值),这会导致锁存器的推断(仅注册电路可以是设计的规格不完整,因为无论如何,产生的信号都存储在D型触发器中。

您可以执行以下操作(以及其他替代方法):

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