为什么结果 Q 是 X?
Why result Q is X?
- 我正在使用 Xilinx 14.7 进行测试模拟。
- 此代码是我的日语 Verilog 书中的自定义代码。
Verilog 代码
module Q41(clk,q1,reset,q2);
input clk,reset;
output [7:0] q1,q2;
reg [7:0] q1,q2;
reg a;
always @(posedge clk or posedge reset)
begin
if(reset)
begin
a <= 0 ;
q1 <= 8'h0;
q2 <= 8'h0;
end
else if(a<=0)
begin
if(q1>=8'h14)
begin q1 <= 8'h14; a <= 1; end
else
q1 <= q1+1;
end
else
begin
if(q1<=8'h0)
begin q1 <= 8'h0; a <= 0; end
else
q1 <= q1-1;
end
if(a<=0)
q2 <=q2+q1;
else
q2 <=q2-q1;
end
endmodule
测试台
`timescale 1ps/1ps
module Q41TestBench;
reg clk;
reg reset;
wire [7:0] q1;
wire [7:0] q2;
parameter step = 10000; // 10ns
Q41 uut (clk, q1, reset, q2);
always begin
clk = 0; #(step/2);
clk = 1; #(step/2);
end
initial begin
reset = 1;
#step reset = 0;
#step clk = 0;
#(step*100) $finish;
end
initial $monitor($stime,
" clk = %d reset = %d Q = %d",clk,reset,q2);
endmodule
结果
查看结果图片
您的问题是您将 Q2 置于两个不同的结构中。您在传统的 IF(重置)中重置了 Q2,然后您有一个单独的 IF 来管理 Q2 的分配。我将推荐以下重新编码,其中 q2 在相同的 IF 结构中。
if(reset)
begin
a <= 0 ;
q1 <= 8'h0;
q2 <= 8'h0;
end
else if(a<=0)
begin
q2 <= q2+q1
if(q1>=8'h14)
begin
q1 <= 8'h14;
a <= 1;
end
else
begin
q1 <= q1+1;
a <= a; // I like to make sure that everything is always assigned
end
end
else
begin
q2 <=q2-q1;
if(q1<=8'h0)
begin
q1 <= 8'h0;
a <= 0;
end
else
begin
q1 <= q1-1;
a <= a;
end
end
- 我正在使用 Xilinx 14.7 进行测试模拟。
- 此代码是我的日语 Verilog 书中的自定义代码。
Verilog 代码
module Q41(clk,q1,reset,q2);
input clk,reset;
output [7:0] q1,q2;
reg [7:0] q1,q2;
reg a;
always @(posedge clk or posedge reset)
begin
if(reset)
begin
a <= 0 ;
q1 <= 8'h0;
q2 <= 8'h0;
end
else if(a<=0)
begin
if(q1>=8'h14)
begin q1 <= 8'h14; a <= 1; end
else
q1 <= q1+1;
end
else
begin
if(q1<=8'h0)
begin q1 <= 8'h0; a <= 0; end
else
q1 <= q1-1;
end
if(a<=0)
q2 <=q2+q1;
else
q2 <=q2-q1;
end
endmodule
测试台
`timescale 1ps/1ps
module Q41TestBench;
reg clk;
reg reset;
wire [7:0] q1;
wire [7:0] q2;
parameter step = 10000; // 10ns
Q41 uut (clk, q1, reset, q2);
always begin
clk = 0; #(step/2);
clk = 1; #(step/2);
end
initial begin
reset = 1;
#step reset = 0;
#step clk = 0;
#(step*100) $finish;
end
initial $monitor($stime,
" clk = %d reset = %d Q = %d",clk,reset,q2);
endmodule
结果
查看结果图片
您的问题是您将 Q2 置于两个不同的结构中。您在传统的 IF(重置)中重置了 Q2,然后您有一个单独的 IF 来管理 Q2 的分配。我将推荐以下重新编码,其中 q2 在相同的 IF 结构中。
if(reset)
begin
a <= 0 ;
q1 <= 8'h0;
q2 <= 8'h0;
end
else if(a<=0)
begin
q2 <= q2+q1
if(q1>=8'h14)
begin
q1 <= 8'h14;
a <= 1;
end
else
begin
q1 <= q1+1;
a <= a; // I like to make sure that everything is always assigned
end
end
else
begin
q2 <=q2-q1;
if(q1<=8'h0)
begin
q1 <= 8'h0;
a <= 0;
end
else
begin
q1 <= q1-1;
a <= a;
end
end