我正在尝试创建从BCD到7段解码器的连接。
当我按下UP_ *或DOWN_ *按钮时,它应该向上计数或向下计数。但即使我按下UP或DOWN按钮,我的模拟也仅显示0000001。
BCD模块代码:
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
7段模块:
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
模拟图片:
Simulation Picture Result-Click Here
有任何建议吗?
答案 0 :(得分:0)
您使用的刺激与您设计模块的工作方式不一致。问题出在你的测试平台上。由于这是作业,我会让你从那里拿走它。
编辑:我将假设作业截止日期已过。为了未来读者的利益,请注意Verilog模块使用低电平有效Clear
信号,当信号处于逻辑0
时,它会重置所有信号。测试平台错误地假设为高电平有效Reset
信号,因此几乎整个测试平台都保持低Reset
(因此Clear
)。 Verilog模块无法做任何有用的事情......它会被不断清除。
答案 1 :(得分:0)
$display
添加调试消息。#0.1
等小延迟。这可能需要更改时间刻度的时间精度。//FIXED
)。运行模拟以验证修复。提示:
有一个设计错误和一个潜在的测试平台问题。
答案 2 :(得分:0)
实际上我已经实现了这种连接,您可以在我的github项目中看到它:https://github.com/MossbauerLab/RomChipReader它不仅适用于仿真,而且适用于硬件(我通过演示制作了简短的视频)。您可以在https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/address_display.v中看到我的输出为7段的印象 不要忘记也看到测试平台,如果您打算从按钮更改代码,请使用去抖动器(https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/debouncer.v)。