3. 数码管静态显示

数码管静态显示 学习卡片

任务目标

设计一个七段译码器,将4位二进制输入(0~15)转换为对应的一位共阳极数码管段码,并在FPGA开发板上通过拨码开关输入、数码管显示结果。核心学习点:真值表到组合逻辑的映射、case语句用法、段码与数码管硬件结构的关系。

硬件连接与段码规则

以共阳极数码管为例(低电平点亮段),段码与十六进制数字的对应关系如下表。若开发板为共阴极,将段码按位取反即可。

输入(hex)abcdefg段码(共阳)
011111108'hC0
101100008'hF9
211011018'hA4
311110018'hB0
401100118'h99
510110118'h92
610111118'h82
711100008'hF8
811111118'h80
911110118'h90
A11101118'h88
b00111118'h83
C10011108'hC6
d01111018'hA1
E10011118'h86
F10001118'h8E

完整Verilog代码

// seg7_static.v - 七段译码器(共阳极)
module seg7_static (
    input  wire [3:0] bin,   // 4位二进制输入(拨码开关)
    output reg  [7:0] seg    // 段码输出 {dp,g,f,e,d,c,b,a},低有效
);

always @(*) begin
    case (bin)
        4'h0:    seg = 8'hC0;
        4'h1:    seg = 8'hF9;
        4'h2:    seg = 8'hA4;
        4'h3:    seg = 8'hB0;
        4'h4:    seg = 8'h99;
        4'h5:    seg = 8'h92;
        4'h6:    seg = 8'h82;
        4'h7:    seg = 8'hF8;
        4'h8:    seg = 8'h80;
        4'h9:    seg = 8'h90;
        4'hA:    seg = 8'h88;
        4'hB:    seg = 8'h83;
        4'hC:    seg = 8'hC6;
        4'hD:    seg = 8'hA1;
        4'hE:    seg = 8'h86;
        4'hF:    seg = 8'h8E;
        default: seg = 8'hFF; // 全灭(不会发生)
    endcase
end

endmodule

引脚约束(示例)

以下为共阳极配置的XDC约束示例,实际引脚号需按开发板手册修改:

set_property PACKAGE_PIN P17 [get_ports {bin[0]}]
set_property PACKAGE_PIN P18 [get_ports {bin[1]}]
set_property PACKAGE_PIN P19 [get_ports {bin[2]}]
set_property PACKAGE_PIN P20 [get_ports {bin[3]}]
set_property PACKAGE_PIN T10 [get_ports {seg[0]}]
# ... 其余seg[1..7]和bin引脚按实际板卡补充

仿真验证

使用以下testbench验证全部16种输入组合的译码正确性:

`timescale 1ns/1ps
module tb_seg7;
reg  [3:0] bin;
wire [7:0] seg;

seg7_static dut(.bin(bin), .seg(seg));

initial begin
    for (integer i = 0; i < 16; i = i + 1) begin
        bin = i[3:0];
        #10;
        $display("bin=%h seg=%h", bin, seg);
    end
    $finish;
end
endmodule

预期输出(节选):
bin=0 seg=c0,bin=1 seg=f9,bin=2 seg=a4,…,bin=f seg=8e。仿真中观察波形,确认每个输入对应的段码与上表一致。

上板验证步骤

  1. 将4位拨码开关连接到bin[3:0],数码管8个段引脚(含小数点)连接到seg[7:0]。
  2. 综合、实现并生成比特流下载到FPGA。
  3. 拨动开关改变输入值,观察数码管显示对应十六进制字符(0~9、A~F)。

通过标准:所有16种开关组合均显示正确字符,无段错误或闪烁。若显示字符与输入不符,检查段码表是否与板卡共阳/共阴类型匹配。