我想设计一个简单的Verilog代码,它包含两个始终的块,交替执行,如握手。我想使用两个标志do_A和do_B来控制两个块,block_A和block_B。预期的结果必须是ABABAB ...有没有办法纠正以下代码?谢谢你的帮助。
module tb;
reg clock, reset, do_A, do_B;
initial begin clock = 0; reset = 0; #50; reset = 150; #50; reset = 0; end
always #50 clock = ~clock;
always @(posedge clock) begin: block_A
if (reset) do_B <= 0;
else if (do_A) begin
do_B <= 0;
$display("A");
end
end
always @(posedge clock) begin:block_B
if (reset) do_A <= 1;
else if (do_B) begin
do_A <= 0;
$display("B");
end
end
endmodule
感谢Vesiliy,以下代码适用于所需的结果。
always @(posedge clock) begin: Block_A
if (reset) do_B = 0;
else if (do_A) begin
do_B = 0;
$display("A");
end
else do_B <= 1;
end
always @(posedge clock) begin:Block_B
if (reset) do_A = 1;
else if (do_B) begin
do_A = 1;
$display("B");
end
else do_A <= 0;
这似乎很奇怪,但运作良好。
答案 0 :(得分:2)
首先reset = 150;
看起来很奇怪(错字?)。但是它在这种情况下起作用。
你在第一个连续always
中还有另一个拼写错误 - 你(看似)写的是:
else if (do_A) begin
do_B <= 1;
$display("A");
end
但是,我认为您的主要问题是您的顺序else
块中没有always
(默认)子句。
看看这个区块(例如):
always @(posedge clock) begin:block_B
if (reset) do_A <= 1;
else if (do_B) begin
do_A <= 0;
$display("B");
end
end
重置后取消断言do_A = 1
;然后,假设您修复了上一个拼写错误,do_B
将变为1,这将导致do_A
变为0.达到此状态后,do_A
将停留在0,直到您重置所有内容
以下添加应解决此问题(第一个always
块的相同内容):
always @(posedge clock) begin:block_B
if (reset) do_A <= 1;
else if (do_B) begin
do_A <= 0;
$display("B");
end
else do_A <= 1;
end
我相信使用上述修复程序的代码将起作用,但是,描述此功能的正确方法是实现具有2个状态的(简单)状态机。谷歌吧。