在 Verilog 中实现时序电路

Implementing Sequential Circuit in Verilog

我正在尝试在 Verilog (Modelsim 10.4a)

中实现以下 Sequential Circuit

这是我正在使用的代码

seq_circuit1.v

module seq_circuit1(x, clk, Q0, Q1);
 input x, clk;
 output Q0, Q1;
 reg J0,K0,J1,K1;
always @(negedge clk)
begin
 //Blocking and Non Blocking both will work
 J0 = Q1 & ~x;
 K0 = Q1 & x;
 J1 = x;
 K1 = (Q0 & x) || (~Q0 & ~x);
 jkfflop JKff0 (J0,K0,Q0);
 jkfflop JKff1 (J1,K1,Q1);
end
endmodule

jkfflop.v

module jkfflop(J,K,clk,Q);
input J,K,clk;
output Q;
 if(J==0 & K==1)
  begin
   assign Q = 0;
  end
 else if(J==1 & K==0)
  begin
   assign Q = 1;
  end
 else if(J==1 & K==1)
  begin
   assign Q = ~Q;
  end
endmodule

我遇到了一些错误,但我无法找出原因。谁能告诉我哪里做错了..

seq_circuit1

  • 您不能在 always 块中实例化子模块(您的 FF)。 将它们移到外面,之前或之后。
  • 您对 jkfflop 的实例化缺少 clk 输入信号。
  • 根据您的图表,您对 FF 的输入应该是组合逻辑,而不是顺序逻辑,因此应该使用 always @(*) 块,而不是时钟块。

jkfflop

  • if verilog 中的语句仅在 generatealwaysinital 块内有效。由于这是 FF,因此您需要 always @(posedge clk)always @(negedge clk)
  • 如果使用始终块,请将 assign 语句替换为非阻塞赋值 (<=)。我们在这里使用 NBA 而不是阻塞分配 (=),因为它是边缘触发的块。
  • 如果在 always 块中为 Q 赋值,请将 output Q 更改为 output reg Q