16乘16点阵显示实验报告Word格式文档下载.docx
《16乘16点阵显示实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《16乘16点阵显示实验报告Word格式文档下载.docx(15页珍藏版)》请在冰点文库上搜索。
从图1中可以看出,8*8LED点阵共由64个发光二极管组成,每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1高电平,且某一列置0低电平,则相应的发光二极管就亮;
因此要用8*8LED点阵来显示一个字符或汉字,只需要根据字符或汉字图形中的线条或笔画,通过点亮多个发光二极管来勾勒出字符或汉字的线条或笔画就行了。
当要比较完美的显示一般的汉字,单个8*8LED点阵模块很难做到,因为LED的点数(也称为像素点)不够多,因此要显示汉字的话,需要多个8*8LED点阵拼合成一个显示屏。
假如用4个8*8LED点阵模块拼成16*16的点阵,即能满足一般汉字的显示。
但要显示信息量大的图形,则需要n个多个8*8LED点阵,拼装成一个大屏幕才行。
LED点阵显示器最大的特点是亮度高、功耗较低、寿命长、容易控制等,因此它的应用很广,常用在广场、车站、商业广告等室外的显示。
2>
8*8LED点阵的封装和引脚规律
64个发光二极管按照行共阳、列共阴4个一组的方式封装成一个模块,这样8*8LED点阵模块就有8行、8列共16个引脚。
其实物图如图2,电路模块符号图如图3。
图28*8LED点阵实物图图38*8LED点阵符号图
但8*8LED点阵的16个引脚并不是很有规律,千万不要想象成1~8个引脚是行,9~16个引脚是列。
而且不同产品的点阵外部引脚排列规律还可能不一样。
以下是NLB1388SRA和LDM1388SRA两个型号点阵引脚对应行、列的关系表:
行号
H0
H1
H2
H3
H4
H5
H6
H7
引脚号
9
14
8
12
1
7
2
5
列号
L0
L1
L2
L3
L4
L5
L6
L7
13
3
4
10
6
11
15
16
假如你买到一块新的8*8LED点阵,又没有关于它的相关资料,那你只有自己用万用表或通过VCC电源串接一个510欧姆的电阻来检测了。
2.2LPM_ROM的应用
该模块为逻辑宏模块存储器。
其应用过程如下。
1选择模块
2点击ok后,得到
3属性编辑:
可以根据实际需要选择数据宽度和内存的容量,默认是8bit,32个字空间。
修改空间和数据属性,Cyclone系列支持最大存储深度4k。
该界面可以选择输出引脚的属性,
需要把hex文件或者mif
其中mif文件或者hex文件可以由多种形式生成。
或由多种工具获得,如Quartus的TextFile编辑器、Matlab等。
完成设置:
放置该模块:
按照基本操作步骤添加引脚,并进行编译,排除错误。
注意总线形式的引脚设置方法。
双击引脚标识,修改对话框中的内容,获得总线连接方式。
3实验结果
通过对程序及原理图的修改,逐步完成了老师的要求,最后使显示器显示“面朝大海,春暖花开。
”
4实验心得
这次实验比之前更加深入一点,通过这次实验,我了解了16*16点阵的基本工作原理,学习了用VerilogHDL语言编写点阵扫描的程序。
虽然在实验中遇到了一些问题,尤其是四个字变八个字的过程,只因为一个小小的接线问题,始终看不到“春暖花开”。
但是自己看着问题一步一步的解决,知识一点一点的积累,确实很有成就感,这又增加了我对FPGA学习的热情。
虽然还不能完全读懂本实验上的所有程序,但是能够通过修改部分程序来完成老师要求的任务,也是有意义的。
附录:
实验程序清单
moduledianzhen(clk50mhz,row,sel0,sel1,sel2,sel3,line);
inputclk50mhz;
//实验箱提供50MHz时钟信号
outputsel0,sel1,sel2,sel3;
//设置引脚选通点阵
outputreg[15:
0]row;
//列
outputreg[3:
0]line;
//行
wire[15:
0]row1,row2;
wire[3:
0]line1,line2;
reg[24:
0]cnt=0;
//1Hz计数子
reg[5:
0]cnt1=0;
//16s计数子
assignsel0=1'
b0;
assignsel1=1'
b1;
assignsel2=1'
assignsel3=1'
always@(posedgeclk50mhz)
begin
if(cnt>
=25'
d50000000)
begin
cnt<
//1Hz计时器
cnt1<
=cnt1+1;
//16s计时器
end
else
cnt<
=cnt+1;
end
hangsaomiaou1(.clk50mhz(clk50mhz),.row(row1),.line(line1));
liesaomiaou2(.clk50mhz(clk50mhz),.row(row2),.line(line2));
always@(*)
if(cnt1<
=5'
d31)
begin
row<
=row1;
//行扫描
line<
=line1;
end
else
=row2;
//列扫描
=line2;
Endmodule
行扫描
modulehangsaomiao(clk50mhz,line,row);
//实验箱输入50MHz时钟信号
0]cnt1,cnt2;
//计数子
regclkrow,clkline;
//列脉冲、行脉冲
if(cnt1>
clkrow=~clkrow;
//1s列脉冲
cnt1<
if(cnt2>
d500)
cnt2<
clkline=~clkline;
//100KHz行脉冲
=cnt2+1;
always@(posedgeclkline)
case(line)
4'
d0:
line<
=4'
d1;
//高速行扫描
d1:
d2;
d2:
d3;
d3:
d4;
d4:
d5;
d5:
d6;
d6:
d7;
d7:
d8;
d8:
d9;
d9:
d10;
d10:
d11;
d11:
d12;
d12:
d13;
d13:
d14;
d14:
d15;
d15:
d0;
default:
endcase
always@(posedgeclkrow)//时间间隔为1s的列扫描
case(row)
16'
b0000000000000001:
row<
=16'
b0000000000000010;
b0000000000000010:
b0000000000000100;
b0000000000000100:
b0000000000001000;
b0000000000001000:
b0000000000010000;
b0000000000010000:
b0000000000100000;
b0000000000100000:
b0000000001000000;
b0000000001000000:
b0000000010000000;
b0000000010000000:
b0000000100000000;
b0000000100000000:
b0000001000000000;
default:
b0000000000000001;
endcase
endmodule
列扫描
moduleliesaomiao(clk50mhz,row,line);
0]cnt;
regclk;
clk=~clk;
//1s
end
always@(posedgeclk)//列扫描
case(line)
h0;
end