verilog中的4位S R锁存器

问题描述 投票:-1回答:1

我正在为4位S R锁存器编写verilog代码。我认为锁存器是异步的。所以我没有把时钟包括在内。首先,我编写了1位S R锁存器的代码,然后我将该代码用于4位S R锁存器。

 module srlatch (S, R, En, Q, Qc);
    input S, R;
    input En;
    output Q, Qc;
    reg Q,Qc;
  always@(*)
    begin
      if(En)
        begin
          Q  =  ~(R | Qc); 
          Qc =  ~(S | Q); 
        end
    end

endmodule



module srlatch4 (S, R, En, Q, Qc);
    input [3:0] S, R;
    input En;
    output [3:0] Q, Qc;


  srlatch s1(S[0], R[0], En, Q[0], Qc[0]);
  srlatch s2(S[1], R[1], En, Q[1], Qc[1]);
  srlatch s3(S[2], R[2], En, Q[2], Qc[2]);
  srlatch s4(S[3], R[3], En, Q[3], Qc[3]);


endmodule

问题是什么?它没有通过测试用例,即Q(t)= 0x0x,Qc(t)= 1010和S = 1100,R = 0000,En = 0,Q(t + 1)= 0x0x,Qc(t + 1)= 1010

verilog hdl iverilog
1个回答
0
投票

由于使用always @(En),只有在En信号值发生变化时才会执行程序块语句。

你可以用以下方式编码。

module srlatch ( input S,
                 input R,
                 input En,
                 output reg Q,
                 output reg Qc);

always @(*) begin
  if (En) begin
    Q  =  ~(R | Qc); 
    Qc =  ~(S | Q); 
  end
end

endmodule : srlatch

而且代码中的S-R锁存器实现也有不正确的表达式。

© www.soinside.com 2019 - 2024. All rights reserved.