4. 数码管静态显示
任务目标
使用Verilog HDL驱动一位共阴极数码管,通过case语句将4位二进制输入译码为七段码,实现0~9数字的静态显示。本案例聚焦于译码逻辑本身,不涉及动态扫描与时序控制。
硬件连接与依赖
- FPGA开发板(如Altera Cyclone IV或Xilinx Spartan系列)
- 一位共阴极数码管,段选信号a~g分别连接FPGA的7个I/O引脚,公共阴极接地
- 4位拨码开关或按键作为数字输入(0~9),连接至FPGA输入引脚
核心代码
module seg7_static(
input wire [3:0] num, // 4位二进制输入,范围0~9
output reg [6:0] seg // 七段码输出 {a,b,c,d,e,f,g},1=点亮
);
// 共阴极数码管七段码译码表(0~9)
always @(*) begin
case (num)
4'd0: seg = 7'b111_1110; // 0: a~f亮,g灭
4'd1: seg = 7'b011_0000; // 1: b,c亮
4'd2: seg = 7'b110_1101; // 2: a,b,d,e,g亮
4'd3: seg = 7'b111_1001; // 3: a,b,c,d,g亮
4'd4: seg = 7'b011_0011; // 4: b,c,f,g亮
4'd5: seg = 7'b101_1011; // 5: a,c,d,f,g亮
4'd6: seg = 7'b101_1111; // 6: a,c,d,e,f,g亮
4'd7: seg = 7'b111_0000; // 7: a,b,c亮
4'd8: seg = 7'b111_1111; // 8: 全部点亮
4'd9: seg = 7'b111_1011; // 9: a,b,c,d,f,g亮
default: seg = 7'b000_0000; // 10~15:全部熄灭
endcase
end
endmodule
引脚约束(示例,以Altera Quartus为例)
set_location_assignment PIN_M2 -to num[0]
set_location_assignment PIN_M1 -to num[1]
set_location_assignment PIN_L2 -to num[2]
set_location_assignment PIN_L1 -to num[3]
set_location_assignment PIN_E1 -to seg[0] // a
set_location_assignment PIN_F1 -to seg[1] // b
set_location_assignment PIN_G1 -to seg[2] // c
set_location_assignment PIN_H1 -to seg[3] // d
set_location_assignment PIN_J1 -to seg[4] // e
set_location_assignment PIN_K1 -to seg[5] // f
set_location_assignment PIN_L3 -to seg[6] // g
实际引脚编号需根据开发板原理图修改,此处仅为格式示例。
运行与验证
- 在Quartus/Vivado中新建工程,将上述模块设为顶层实体,添加引脚约束文件。
- 编译综合并下载比特流至FPGA开发板。
- 将4位拨码开关依次设为二进制0000~1001(对应十进制0~9)。
- 通过标准:数码管依次稳定显示0、1、2、3、4、5、6、7、8、9,且每个数字的笔画完整无缺段、无闪烁。当输入为1010~1111时,数码管全部熄灭。
仿真验证(可选)
module tb_seg7;
reg [3:0] num;
wire [6:0] seg;
seg7_static uut(.num(num), .seg(seg));
initial begin
for (num = 0; num < 16; num = num + 1) begin
#10;
// 检查0~9的译码结果
if (num < 10) begin
if (seg === 7'b000_0000) $error("num=%0d 译码错误", num);
end else begin
if (seg !== 7'b000_0000) $error("num=%0d 应全灭", num);
end
end
$display("测试完成");
$finish;
end
endmodule
在ModelSim/Vivado Simulator中运行仿真,观察seg波形是否与七段码真值表一致。仿真通过条件:0~9均有非零输出且与译码表逐位匹配,10~15输出全零。