在 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 中的语句仅在 generate
、always
或 inital
块内有效。由于这是 FF,因此您需要 always @(posedge clk)
或 always @(negedge clk)
- 如果使用始终块,请将
assign
语句替换为非阻塞赋值 (<=
)。我们在这里使用 NBA 而不是阻塞分配 (=
),因为它是边缘触发的块。
- 如果在 always 块中为
Q
赋值,请将 output Q
更改为 output reg Q
我正在尝试在 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 中的语句仅在generate
、always
或inital
块内有效。由于这是 FF,因此您需要always @(posedge clk)
或always @(negedge clk)
- 如果使用始终块,请将
assign
语句替换为非阻塞赋值 (<=
)。我们在这里使用 NBA 而不是阻塞分配 (=
),因为它是边缘触发的块。 - 如果在 always 块中为
Q
赋值,请将output Q
更改为output reg Q