【问题标题】:VHDL or verilog SR latchVHDL 或 verilog SR 锁存器
【发布时间】:2013-11-28 02:17:28
【问题描述】:

我正在尝试使用带有启用信号 C 的 NAND 门的 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;

【问题讨论】:

  • 能否将您看到的错误消息添加到问题中?
  • if 给了我一个时钟错误,但我不知道为什么,因为我试图通过仅使用控制输入在没有时钟的情况下异步执行此操作
  • C 输入可能被综合工具处理为“时钟”,因为C 可以用作实现中推断锁存器的启用。综合工具并非用于处理具有此类循环的设计,并且可能会尝试通过推断锁存器来打破循环。我假设您的设计只是某种测试的一部分,因为这样的设计无法扩展到大型系统。

标签: vhdl verilog


【解决方案1】:

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

更正的 Verilog(我这里只有 Altera 和 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,并带有 2 个警告

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/技术视图看起来Ok, 一见钟情。

标准免责声明:时序分析器不擅长时序设计 组合循环。如果您只是在玩,这可能一切都会奏效 周围,​​但如果这是一个真正的设计,你需要认真考虑你的 约束,以及分析器是否实际跟踪了您的 反馈路径(它可能没有)。您需要使用 sdf 进行计时模拟 反向注释以确认它确实有效。

【讨论】:

  • 非常感谢您的帮助,但原理图是正确的。我肯定知道,你建议的陈述不会给我正确的输出。
  • 我没有说原理图不正确 - 我说你的你的原理图的实现不正确。您的代码与您的原理图不匹配。不过,这几乎是无关紧要的。阅读我的其余帖子。
【解决方案2】:

您的原理图是正确的。

问题出在您的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2012-09-27
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多