我刚刚开始使用 Verilog。我的第一个项目是一个用 16 位输入控制 4 个 7 段显示器的模块。我的
BCDtoSSeg
模块如下:
module BCDtoSSeg (BCD, SSeg);
input [3:0] BCD;
output reg [0:6] SSeg;
always @ ( * ) begin
case (BCD)
4'b0000: SSeg = 7'b0000001; // "0"
4'b0001: SSeg = 7'b1001111; // "1"
4'b0010: SSeg = 7'b0010010; // "2"
4'b0011: SSeg = 7'b0000110; // "3"
4'b0100: SSeg = 7'b1001100; // "4"
4'b0101: SSeg = 7'b0100100; // "5"
4'b0110: SSeg = 7'b0100000; // "6"
4'b0111: SSeg = 7'b0001111; // "7"
4'b1000: SSeg = 7'b0000000; // "8"
4'b1001: SSeg = 7'b0000100; // "9"
4'ha: SSeg = 7'b0001000;
4'hb: SSeg = 7'b1100000;
4'hc: SSeg = 7'b0110001;
4'hd: SSeg = 7'b1000010;
4'he: SSeg = 7'b0110000;
4'hf: SSeg = 7'b0111000;
default:
SSeg = 0;
endcase
end
endmodule
默认情况下 SSeg = 0。我的模块根据 4 位阳极的当前值控制显示
an
如下所示:
`timescale 1ns / 1ps
module display(
input [15:0] num,
input clk,
output [0:6] sseg,
output reg [3:0] an,
input rst,
output led
);
reg [3:0] bcd = 0;
BCDtoSSeg bcdtosseg(.BCD(bcd), .SSeg(sseg));
reg [26:0] cfreq = 0;
wire enable;
// Divisor de frecuecia
assign enable = cfreq[2];
assign led = enable;
always @(posedge clk) begin
if(rst==1) begin
cfreq <= 0;
end else begin
cfreq <= cfreq+1;
end
end
reg [1:0] count = 0;
always @(posedge enable) begin
if(rst==1) begin
count <= 0;
an <= 4'b1111;
end else begin
count <= count+1;
case (count)
2'h0: begin bcd <= num[3:0]; an <= 4'b1110; end
2'h1: begin bcd <= num[7:4]; an <= 4'b1101; end
2'h2: begin bcd <= num[11:8]; an <= 4'b1011; end
2'h3: begin bcd <= num[15:12]; an <= 4'b0111; end
endcase
end
end
endmodule
问题是,每当我尝试使用测试平台模拟它时,当计数器启动时,
SSeg
的值会直接变为默认值(0)。我尝试将 bcd <= num[#:#]
替换为随机 4 位值,例如 bcd <= b´####
,并且模拟运行良好。 SSeg
的值会随着阳极的值而相应变化,但每当我使用任何包含 num
的表达式时,它都会变为默认值。我如何定义变量或输入可能是一个错误,但老实说我不知道。这是测试台,以防有任何用处:
`timescale 1ns / 1ps
module testbench;
// Inputs
reg [15:0] num;
reg clk2;
reg rst;
// Outputs
wire [0:6] sseg;
wire [3:0] an;
// Instantiate the Unit Under Test (UUT)
display uut (
// .num(num),
.clk(clk2),
.sseg(sseg),
.an(an),
.rst(rst)
);
initial begin
// Initialize Inputs
clk2= 0;
rst = 1;
#10 rst =0;
num = 16'h4321;
end
always #1 clk2 = ~clk2;
endmodule
非常感谢任何帮助。
当我运行仿真并查看
BCDtoSSeg
模块中的波形时,我看到 BCD
输入信号在 17ns 时从 0 转换到 z
,并且在仿真的其余部分中保持该值。由于 z
与 case 语句中的任何一项都不匹配,因此执行 case default,并将 SSeg
赋值为 0。
我使用的模拟器显示了这个编译警告,它确定了问题:
display uut (
|
xmelab: *W,CUVWSI : 1 input port was not connected:
xmelab: num
也许您的模拟会生成类似的消息。查看模拟日志文件等
解决方案是在测试台中驱动
num
输入。变化:
// .num(num),
至:
.num(num),
修复后,
SSeg
采用其他值。