在 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
我正在尝试在 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