在 Verilog 中实现 JK 触发器

Implementing JK Flipflop in Verilog

我正在尝试在 Verilog (Modelsim) 中实现简单的 JK Flipflop。但是我收到以下错误

The generate if condition must be a constant expression.

这是我正在使用的代码

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

谁能帮帮我

在 Verilog RTL 中有一个公式或模式用于表示触发器。对于上升沿触发的触发器,它是 always @(posedge clock) 对于下降沿触发的触发器,它总是 @(negedge clock)。

上升沿触发块的示例。

 reg [7:0] a;
 always @(posedge clock) begin
   a <= b;
 end

通常您也需要重置,同步重置为:

 reg [7:0] a;
 always @(posedge clock) begin
   if ( reset == 1'b1 ) begin
     a <= 'b0; 
   end
   else begin
     a <= b;
   end
 end

更常见的是 ASIC 设计需要低电平有效 异步 :

 reg [7:0] a;
 always @(posedge clock, negedge reset_n) begin
   if ( reset_n == 1'b0 ) begin
     a <= 'b0; 
   end
   else begin
     a <= b;
   end
 end

请注意,异步重置已在敏感列表中重置,这使得模块响应信号的变化。

您使用(重用)assign 的方式不正确。

使用以上信息,您的模块将变成:

module jkfflop(
  input  J,
  input  K,
  input  clk,
  output Q );
  always @(posedge clk) begin
    if(J==1'b0 && K==1'b1) begin
      Q <= 'b0;
    end
    else if(J==1'b1 && K==1'b0) begin
      Q <= 1'b1;
    end
    else if(J==1'b1 & K==1'b1) begin
      Q <= ~Q;
    end
  end
endmodule

但可以用 case 语句来写:

  always @(posedge clk) begin
    case({J,K})
      2'b0_0 : Q <= Q   ;
      2'b0_1 : Q <= 1'b0;
      2'b1_0 : Q <= 1'b1;
      2'b1_1 : Q <= ~Q  ;
    endcase
  end