Verilog BCD和7段解码器显示奇怪的结果
我正在尝试创建从BCD到7段解码器的连接。当我按下向上或向下按钮时,它应该向上或向下计数。但我的模拟只显示0000001,即使我按下按钮向上或向下 BCD模块代码: 我的测试台: 模拟图片:Verilog BCD和7段解码器显示奇怪的结果,verilog,xilinx,system-verilog,bcd,Verilog,Xilinx,System Verilog,Bcd,我正在尝试创建从BCD到7段解码器的连接。当我按下向上或向下按钮时,它应该向上或向下计数。但我的模拟只显示0000001,即使我按下按钮向上或向下 BCD模块代码: 我的测试台: 模拟图片: 有什么建议吗?您使用的刺激与您设计模块的工作方式不一致。问题出在你的测试台上。既然这是家庭作业,我就让你从那里开始做 编辑:我假设作业期限已经过了。为了方便将来的读者,请注意,Verilog模块使用一个有效的低清晰信号,当其处于逻辑0时,该信号将重置所有内容。测试台错误地假设一个激活的高复位信号,因此几乎
有什么建议吗?您使用的刺激与您设计模块的工作方式不一致。问题出在你的测试台上。既然这是家庭作业,我就让你从那里开始做 编辑:我假设作业期限已经过了。为了方便将来的读者,请注意,Verilog模块使用一个有效的低清晰信号,当其处于逻辑0时,该信号将重置所有内容。测试台错误地假设一个激活的高复位信号,因此几乎整个测试台的复位和清除都保持在低状态。Verilog模块无法做任何有用的事情……它正在被不断清除。常规入门级调试过程 在将代码加载到FPGA之前,始终在模拟中运行代码。 确定哪个模块存在错误: 确保模块的刺激符合您的意图。 确保模块的输出对其输入有意义。 逐行进行: 确保每个分支都可以访问并按预期执行。 将调试范围内的所有内容转储到波形中。 使用$display添加调试消息。 在设计中添加诸如0.1之类的小延迟。这可能需要更改时间刻度的时间精度。 发现潜在错误后: 更正它,并在同一行添加注释,其中包含可搜索关键字ex://FIXED。运行模拟以验证修复。 如果该错误似乎已解决。注释掉不删除调试消息和注入延迟。再次运行模拟。 重复步骤4,直到解决所有错误。 现在可以安全地删除注释掉的消息和延迟。 再次运行模拟! 提示: 存在一个设计缺陷和一个潜在的测试台问题
事实上,我已经实现了这样的连接,你们可以在我的github项目中看到:它不仅可以在模拟中工作,而且可以在硬件中工作,我用demo制作了一段短视频。您可以在中看到我将输出导入7段
不要忘记查看测试台,如果您计划更改按钮的代码,使用debouncer也很重要。如果BCD1==4'b1001,为什么要将BCD0==4'b1001包装在内部如果BCD0==4'b1001???@portforwardpodcast,因为限制是99。它将使用两个7段显示器来显示A和两个7段显示器来显示B。解决方案是查看模块内的信号并调试代码。通过检查对代码进行调试并不能使您取得任何进展,您的模拟只是查看顶级信号。顺便问一下,你的时间表在哪里?看起来你的时间单位是皮秒而不是纳秒。@JoeHass,我已经尝试过修改测试台,但是没有一个有效。我已经将timespec设置为1ns/1ns,但也没有发生任何事情。你能不能给我一些线索…我已经尝试过修改测试台,但是没有一个有效。我已经将timespec设置为1ns/1ns,但也没有发生任何事情。请你再给我一些线索……还有什么建议吗?@Greg,我已经在修复设计缺陷了。但是找不到测试台问题。我正在尝试更改timespec,但没有一个有效。我对这东西完全陌生。你指的是什么样的测试台问题?@Greg,还有什么提示吗?@user3110542,在你展示了你的尝试之后,你可以得到另一个提示。设计中的错误是什么?您将$display消息放置在何处。这个信息有意义吗?
module BCDcountmod(
input Clock, Clear, up, down,
output reg [3:0] BCD1,
output reg [3:0] BCD0);
//reg [3:0] BCD1_1, BCD0_0;
always @(posedge Clock or negedge Clear) begin
//---- IS IT CLEAR? --------------
if (~Clear) begin
BCD1 <= 'b0;
BCD0 <= 'b0;
end
//---- IS IT UP? --------------
else if (up == 1'b1) begin
if (BCD0 == 4'b1001) begin
BCD0 <= 0;
if (BCD1 == 4'b1001)
BCD1 <= 0;
else
BCD1 <= BCD1 + 1;
end
end
//---- IS IT DOWN? --------------
else if (down==1'b1) begin
if (BCD0 == 4'b0000) begin
BCD0 <= 4'b1001;
if (BCD1 == 4'b0000)
BCD1 <= 4'b1001;
else
BCD1 <= BCD1 - 1;
end
else
BCD0 <= BCD0 - 1;
end
end
endmodule
module segment7dec (output reg [6:0] display, input [3:0] bcd);
always @* begin
case(bcd)
4'b0000: display = 7'b1111110;
4'b0001: display = 7'b0110000;
4'b0010: display = 7'b1101101;
4'b0011: display = 7'b1111001;
4'b0100: display = 7'b0110011;
4'b0101: display = 7'b1011011;
4'b0110: display = 7'b1011111;
4'b0111: display = 7'b1110000;
4'b1000: display = 7'b1111111;
4'b1001: display = 7'b1111011;
default: display = 7'b0000000;
endcase
display = ~display;
end
endmodule
module scoreboard_testbench;
// Inputs
reg UP_A;
reg DOWN_A;
reg UP_B;
reg DOWN_B;
reg Reset;
reg CLK;
// Outputs
wire [6:0] disp1A;
wire [6:0] disp0A;
wire [6:0] disp1B;
wire [6:0] disp0B;
// Instantiate the Unit Under Test (UUT)
socreboard_top uut (
.UP_A(UP_A),
.DOWN_A(DOWN_A),
.UP_B(UP_B),
.DOWN_B(DOWN_B),
.Reset(Reset),
.CLK(CLK),
.disp1A(disp1A),
.disp0A(disp0A),
.disp1B(disp1B),
.disp0B(disp0B)
);
initial begin
// Initialize Inputs
UP_A = 0;
DOWN_A = 0;
UP_B = 0;
DOWN_B = 0;
Reset = 1;
CLK = 0;
// Wait 100 ns for global reset to finish
#100;
Reset = 0;
UP_A = 1'b1;
#500
UP_A='b0;
#500
UP_A=1'b1;
#500
DOWN_A=1'b1;
#4000 $finish;
// Add stimulus here
end
always #5 CLK=!CLK;
endmodule