在Verilog中实现时序电路

时间:2015-09-06 07:59:00

标签: verilog

我正在尝试在Sequential Circuit中实现以下Verilog(Modelsim 10.4a)

enter image description here

这是我正在使用的代码

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

我遇到了一些错误,我无法弄清楚原因。任何人都可以告诉我,我做错了什么..

1 个答案:

答案 0 :(得分:1)

<强> seq_circuit1

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

<强> jkfflop

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