Verilog 如何交替两个街区?
我想设计一个简单的Verilog代码,它包含两个始终块,交替执行,就像握手一样。我想使用两个标志,do_A和do_B来控制两个块,block_A和block_B。预期结果必须是ABABAB。。。有没有办法更正以下代码?谢谢你帮助我Verilog 如何交替两个街区?,verilog,system-verilog,Verilog,System Verilog,我想设计一个简单的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 al
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
模块tb;
注册时钟、复位、执行A、执行B;
初始开始时钟=0;重置=0#50; 重置=150#50; 重置=0;结束
总是#50钟=~钟;
始终@(posedge时钟)开始:块A
if(reset)do_B首先reset=150代码>看起来很奇怪(打字错误?)。不过,它在这种情况下起作用
您在第一个连续的始终中有另一个打字错误-您(似乎)想写的是:
else if (do_A) begin
do_B <= 1;
$display("A");
end
重置后解除评估执行A=1
;然后,假设您修复了前面的打字错误,do_B
将变为1,这将导致do_A
变为0。达到此状态后,do_A
将一直保持在0,直到您重置所有内容
以下添加操作应解决此问题(对于第一个始终块也是如此):
始终@(posedge时钟)开始:块B
如果(重置)执行以下操作:
else if (do_A) begin
do_B <= 1;
$display("A");
end
always @(posedge clock) begin:block_B
if (reset) do_A <= 1;
else if (do_B) begin
do_A <= 0;
$display("B");
end
end
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