3. 数码管静态显示
任务目标
设计一个七段译码器,将4位二进制输入(0~15)转换为对应的一位共阳极数码管段码,并在FPGA开发板上通过拨码开关输入、数码管显示结果。核心学习点:真值表到组合逻辑的映射、case语句用法、段码与数码管硬件结构的关系。
硬件连接与段码规则
以共阳极数码管为例(低电平点亮段),段码与十六进制数字的对应关系如下表。若开发板为共阴极,将段码按位取反即可。
| 输入(hex) | abcdefg | 段码(共阳) |
|---|---|---|
| 0 | 1111110 | 8'hC0 |
| 1 | 0110000 | 8'hF9 |
| 2 | 1101101 | 8'hA4 |
| 3 | 1111001 | 8'hB0 |
| 4 | 0110011 | 8'h99 |
| 5 | 1011011 | 8'h92 |
| 6 | 1011111 | 8'h82 |
| 7 | 1110000 | 8'hF8 |
| 8 | 1111111 | 8'h80 |
| 9 | 1111011 | 8'h90 |
| A | 1110111 | 8'h88 |
| b | 0011111 | 8'h83 |
| C | 1001110 | 8'hC6 |
| d | 0111101 | 8'hA1 |
| E | 1001111 | 8'h86 |
| F | 1000111 | 8'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。仿真中观察波形,确认每个输入对应的段码与上表一致。
上板验证步骤
- 将4位拨码开关连接到
bin[3:0],数码管8个段引脚(含小数点)连接到seg[7:0]。 - 综合、实现并生成比特流下载到FPGA。
- 拨动开关改变输入值,观察数码管显示对应十六进制字符(0~9、A~F)。
通过标准:所有16种开关组合均显示正确字符,无段错误或闪烁。若显示字符与输入不符,检查段码表是否与板卡共阳/共阴类型匹配。