资源描述
3.3 基于FPGA的数码管显示控制与LED点阵控制
1. 实验目的
(1)通过实验进一步学习Quartus II软件的使用方法。
(2)通过实验学习数码管显示控制的基本原理。
(3)通过实验学习LED点阵显示控制的基本原理。
2. 实验仪器设备
(1)FPGA开发实验箱。
(2)数字万用表。
(3)电脑。
3. 预习
(1)复习FPGA开发有关的流程。
(2)复习Verilog HDL语言语法。
(3)复习实验所用的相关原理。
(4)按要求编写实验中要求的硬件描述语言程序。
4. 实验原理
(1)数码管。数码管是多个LED灯的集合,显示译码器的输入是二进制数,输出是对应的十进制的字符,因此译码器的输出根据十进制数的字符显示效果来定义,显示译码器有配合共阴极和共阳极的区分,必须根据实际选用。
(2)数码管的动态显示。本实验为LED数码管动态显示控制实验。LED动态显示是将所有相同的段码线并接在一个I/O口上,共阴极端或共阳极端分别由相应的I/O口线控制(本实验箱为共阳极)。由于每一位的段选线都在一个I/O口上,所以每送一个段选码,所有的LED数码管都显示同一个字符,这种显示器是不能用的。解决此问题的方法是利用人的视觉滞留,从段选线I/O口上按位次分别送显示字符的段选码,在位选控制口也按相应的次序分别选通相应的显示位(共阴极送低电平,共阳极送高电平),选通位就显示相应字符,并保持几毫秒的延时,未选通位不显示字符(保持熄灭)。这样,对各位显示就是一个循环过程。从计算机的工作来看,在一个瞬时只有一位显示字符,而其它位都是熄灭的,但因为人的视觉滞留,这种动态变化是觉察不到的。从效果上看,各位显示器能连续而稳定地显示不同的字符,这就是动态显示。
(3)LED点阵。LED点阵显示字符的原理和数码管显示原理相似。数码管通过段选和位选来确定那个数码管亮,再通过各个数码管的不断循环点亮,实现动态显示。点阵的显示原理与之相近:点阵通过行选先确定哪一行可以被选通点亮,再通过列选确定所选行的哪几个led可以被点亮,最后在时钟电路的驱动下不断换行显示,从而实现点阵的动态显示。
5. 实验内容
(1)数码管驱动显示。
①新建工程,调试程序,分配引脚。
②将程序下载到实验箱,并调试成功。初始代码为数码管依次显示1到8
③修改实验代码,使数码管能够显示自己学号后8位。
参考的器件引脚图
参考电路图
参考程序:
module smg(
clk,duan,wei
);
input clk;
output [6:0]duan;//数码管段选
output [7:0]wei;//数码管位选
reg [6:0]duan;
reg [7:0]wei;
parameter seg0 = 7'h3f,//参数定义
seg1 = ~7'h06,
seg2 = ~7'h5b,
seg3 = ~7'h4f,
seg4 = ~7'h66,
seg5 = ~7'h6d,
seg6 = ~7'h7d,
seg7 = ~7'h07,
seg8 = ~7'h7f,
seg9 = ~7'h6f,
sega = ~7'h77,
segb = ~7'h7c,
segc = ~7'h39,
segd = ~7'h5e,
sege = ~7'h79,
segf = ~7'h71;
reg [2:0]cnt;//三位计数器
always@(posedge clk) begin //时钟每上升一次,计数器加一
cnt=cnt+1;
end
always@(posedge clk) begin
/*时钟每上升一次,数码管亮一个,且每次亮的数码管和显示
的数字都不同。当时钟频率快到一定程度时,由于人眼的视觉
滞留便出现了多个数码管同时点亮的现象*/
if(cnt==3'b000)
begin duan<=seg1;wei<=8'b11111110;end
else if(cnt==3'b001)
begin duan<=seg2;wei<=8'b11111101;end
else if(cnt==3'b010)
begin duan<=seg3;wei<=8'b11111011;end
else if(cnt==3'b011)
begin duan<=seg4;wei<=8'b11110111;end
else if(cnt==3'b100)
begin duan<=seg5;wei<=8'b11101111;end
else if(cnt==3'b101)
begin duan<=seg6;wei<=8'b11011111;end
else if(cnt==3'b110)
begin duan<=seg7;wei<=8'b10111111;end
else if(cnt==3'b111)
begin duan<=seg8;wei<=8'b01111111;end
else ;
end
endmodule
(2)LED点阵控制
①新建工程,调试程序,分配引脚;
②将程序下载到实验箱,并调试成功。点阵显示“光”字;
③修改参考程序,使点阵显示“电”字。
参考的有关电路连接图
本实验箱中,JX17和JX18的引脚对应H0~H15(即为1~16行),JX19和JX20对应的引脚为L0~L15(即1~16)列。同学们可以自己分配FPGA芯片引脚,建议分配在JP2、JP3、JP4、JP5。
参考程序:
module dianzhen(
clk,hang,lie
);
input clk; //时钟
output [15:0]hang;//16位行选,当为1时选通
output [15:0]lie;//16位列选,当为0时选通
reg [15:0]hang;//16位行寄存器
reg [15:0]lie;//16位列寄存器
reg [3:0]cnt;//4位计数器,可从1~16
always@(posedge clk)//时钟上升沿来临,计数器加一
cnt=cnt+1;
always@(posedge clk)//计数器每变化一次,行相应变化一次,使行顺序往下移
if(cnt==4'b0000) begin//选通第一行,由于没有亮点,所以列选全部为1
hang<=16'b0000000000000001;
lie<=16'b1111111111111111;end
else if(cnt==4'b0001) begin
hang<=16'b0000000000000010;
lie<=16'b1111111111111111;end
else if(cnt==4'b0010) begin
hang<=16'b0000000000000100;//选通第三行,从左往右第八个led点亮,故第8位为0
lie<=16'b1111111011111111;end
else if(cnt==4'b0011) begin
hang<=16'b0000000000001000;
lie<=16'b1110111011101111;end
else if(cnt==4'b0100) begin
hang<=16'b0000000000010000;
lie<=16'b1111011011011111;end
else if(cnt==4'b0101)begin
hang<=16'b0000000000100000;
lie<=16'b1111101010111111;end
else if(cnt==4'b0110)begin
hang<=16'b0000000001000000;
lie<=16'b1100000000000111;end
else if(cnt==4'b0111)begin
hang<=16'b0000000010000000;
lie<=16'b1111110101111111;end
else if(cnt==4'b1000)begin
hang<=16'b0000000100000000;
lie<=16'b1111110101111111;end
else if(cnt==4'b1001)begin
hang<=16'b0000001000000000;
lie<=16'b1111110101111111;end
else if(cnt==4'b1010)begin
hang<=16'b0000010000000000;
lie<=16'b1111110101111111;end
else if(cnt==4'b1011)begin
hang<=16'b0000100000000000;
lie<=16'b1111101101110111;end
else if(cnt==4'b1100)begin
hang<=16'b0001000000000000;
lie<=16'b1110011100000111;end
else if(cnt==4'b1101)begin
hang<=16'b0010000000000000;
lie<=16'b1111111111111111;end
else if(cnt==4'b1110)begin
hang<=16'b0100000000000000;
lie<=16'b1111111111111111;end
else if(cnt==4'b1111)begin
hang<=16'b1000000000000000;
lie<=16'b1111111111111111;end
else ;
endmodule
6.思考题
(1)数码管显示电路控制的核心思路是什么?
(2)LED点阵电路控制的核心思路是什么?
(3)总结本次实验的心得。
展开阅读全文