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

实际引脚编号需根据开发板原理图修改,此处仅为格式示例。

运行与验证

  1. 在Quartus/Vivado中新建工程,将上述模块设为顶层实体,添加引脚约束文件。
  2. 编译综合并下载比特流至FPGA开发板。
  3. 将4位拨码开关依次设为二进制0000~1001(对应十进制0~9)。
  4. 通过标准:数码管依次稳定显示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输出全零。