我正在为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
答案 0 :(得分:0)
由于始终使用@(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锁存器实现也有不正确的表达式。