FPGA学习系列:18. 数码管的设计.doc
FPGA学习系列:18. 数码管的设计设计背景: 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管在我们的许多设计中都又用到,数码管的显示原理简单和显示效果清晰在我们的工业中的到了广泛的应用。 数码管的应用很广泛,涉及众多领域,我们就拿数显仪表这个领域来讲,数显仪表是数字式显示仪表的简称,显示器常用的有LED、LCD为显示元件。 设计原理: 本次的设计是设计一个数码管的显示模,其设计原理图如下: 数码管显示分为的动态和静态显示,为了让人眼可以看清数码管的显示,我们一般驱动数码管的频率为1K - 10K 之间。 顾名思义,七段数码管就是使用七段点亮的线段来拼成常见的数字和某些字母,这种显示方式我们在数字电路中非常容易见到。再加上右下角显示的小数点,实际上一个显示单元包括了8根信号线。根据电路设计的不同,这些信号线可能高有效也可能低有效。我们通过FPGA控制这些线段的亮灭,达到显示效果。 对于多个数码管的显示模块,将每一个都连接到FPGA的管脚会耗用大量FPGA的管脚资源。因此我们同样引入一种类似矩阵键盘的扫描方式。任何时刻我们只使用8根信号点亮一个数码管,但是8个数码管是随着时钟步调交替点亮的,只要时钟的速度够快,我们观察到数码管就好像几个同时点亮一样。 我们的开发板使用的动态显示来循环扫描显示。其原理图如下所示: 如图所示,我们的开发板使用的是六位共阳极数码管,六个PNP型三极管分别作为六组数码管电源的输入开关,也就是我们常说的位选信号,PNP三极管为低电平导通,所以我们的位选信号低有效。在这里,为了节约FPGA的IO资源,我们把六个位选信号连接到了三八译码器74HC138D。 从我们的板子硬件原理图上我们可以看清,我们的数码管是红阳极,就是是给一个低电平就是点亮数码管的一个段,那么8段全部给8b0000000那么数码管显示的就是8这个数字了,我们用的是循环显示,是通过sel引脚来选择哪一个数码管亮,也就是说我们的sel的三位为3b000的时候也就是选择第一个数码亮,3b001第二个数码管亮依次类推。 设计架构图: 设计代码:顶层模块0 module seg_x(clk,rst_n,sel,seg7); /顶层端口1 input clk; /输入2 input rst_n;3 output 2:0 sel; /输出4 output 7:0 seg7;5 6 wire 23:0 num;7 8 num_in num_in( /例化输入模块9 .clk(clk),10 .rst_n(rst_n),11 .num(num)12 );1314 seg seg( /例化数码管模块15 .clk(clk),16 .rst_n(rst_n),17 .sel(sel),18 .seg7(seg7),19 .data_in(num)20 );21 endmodule 设计模块0 module seg(clk,rst_n,sel,seg7,data_in); /端口定义1 2 input clk;3 input rst_n;4 input 23:0 data_in; /输入6个灯的数据5 6 output reg 2:0 sel; 7 output reg 7:0 seg7;8 9 parameter s0 = 3b000;10 parameter s1 = 3b001;11 parameter s2 = 3b010;12 parameter s3 = 3b011;13 parameter s4 = 3b100;14 parameter s5 = 3b101;15 16 define T1ms 50_000 /定义1k的计数值17 /define T1ms 518 reg 15:0 count;19 wire flag;20 always (posedge clk or negedge rst_n)21 if(!rst_n)22 begin23 count 测试模块0 timescale 1ns/1ps /时间精度1 2 module seg_tb;3 reg clk; /端口定义4 reg rst_n;5 6 7 wire 2:0 sel;8 wire 7:0 seg7;9 10 initial begin11 clk = 1b1;12 rst_n = 1b0;1314 #100.1 rst_n = 1b1;1516 #200000 17 $stop;1819 end20 always #10 clk = clk; /模拟时钟2122 seg_x seg_x_dut( /例化顶层模块23 .clk(clk),24 .rst_n(rst_n),25 .sel(sel),26 .seg7(seg7)27 );28 endmodule 仿真图: 在仿真中我们可以看到我们的设计是正确的,第一个灯亮的是f9,也就是也就是对应数码管显示的是1,a4就是2,和我们的输入是正确的。