16X16点阵显示实验.docx
《16X16点阵显示实验.docx》由会员分享,可在线阅读,更多相关《16X16点阵显示实验.docx(15页珍藏版)》请在冰豆网上搜索。
16X16点阵显示实验
实验报告
实验名称:
[16X16点阵显示实验]
姓名:
学号:
指导教师:
实验时间:
[2013年6月15日]
信息与通信工程学院
16X16点阵显示实验
1、实验要求:
理解并掌握点阵显示符号的原理,理解原有程序,会使用动态扫描的方式使点阵显示汉字,明白点阵滚动显示的原理。
根据原有程序,掌握LPM_ROM的应用,会应用LPM_ROM存储需要显示的内容。
参照液晶显示程序,编写16*16点阵显示程序。
任务一:
实现点阵列扫描。
点亮点阵的一列,并让其不断的向右移动。
任务二:
在点阵上循环滚动显示“嵌入式系统设计”。
2、实验原理:
2.1点阵基本原理
本实验对点阵的扫描使用列扫描的方式。
就是将要显示的数据分成16列,在某一时刻只选中一列,并向点阵传送该列需要显示的数据,那么如果从左往右依次循环选中所有列,并且循环的速度足够快,因为视觉停留效应,我们就能看到完整的显示了。
如果要显示大于16列的信息,比如要显示多个汉字,由于只能同时显示16列,那么就需要在一个比较慢的时钟的指挥下,不断更新要显示的连续的16列数据,使用这样的方法就能实现滚动显示。
2.2任务原理
8*8LED点阵共由64个发光二极管组成,每个发光二极管放置在行线和列线的交叉点上,当对应的某一行高电平(置1),且某一列低电平(置0),则相应的发光二极管就亮;因此要用8*8LED点阵来显示一个字符或汉字,只需要根据字符或汉字图形中的线条或笔画,通过点亮多个发光二极管来勾勒出字符或汉字的线条或笔画就行了。
当要比较完美的显示一般的汉字,单个8*8LED点阵模块很难做到,因为LED的点数(也称为像素点)不够多,因此要显示汉字的话,需要多个8*8LED点阵拼合成一个显示屏。
假如用4个8*8LED点阵模块拼成16*16的点阵,即能满足一般汉字的显示。
16×16扫描LED点阵的工作原理同8位扫描数码管类似。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。
通过时钟的每列扫描显示完整汉字。
2.3、实验设计流程:
任务一系统结构图如图1所示。
图1任务一系统结构图
任务二系统结构图如图2所示。
图2任务二系统结构图
3.管脚分配:
choose[3]
PIN_139
choose[2]
PIN_137
choose[1]
PIN_134
choose[0]
PIN_127
clk_50M
PIN_23
data[15]
PIN_46
data[14]
PIN_44
data[13]
PIN_41
data[12]
PIN_39
data[11]
PIN_35
data[10]
PIN_33
data[9]
PIN_30
data[8]
PIN_15
data[7]
PIN_13
data[6]
PIN_11
data[5]
PIN_10
data[4]
PIN_8
data[3]
PIN_6
data[2]
PIN_5
data[1]
PIN_4
data[0]
PIN_3
l5
PIN_142
rst
PIN_56
sel[2]
PIN_146
sel[1]
PIN_145
sel[0]
PIN_144
4、实验结果:
使用QuartusII软件将实验工程分别下载到实验箱中,能够看到预期的现象:
将任务一的工程下载到实验箱后,可以看到一竖条向右移动,移动速度为1s每列。
将任务二的工程下载到实验箱后,点阵上滚动显示汉字“嵌入式系统设计”,字体移动速度为0.34秒每列。
实验现象表明实验程序符合要求,能够完成实验要求任务。
5实验心得
通过这次实验,我学到了一个有时序功能的器件如何用verilog语言实现其功能。
学会了8*8LED点阵共由64个发光原理,要用8*8LED点阵来显示一个字符或汉字,只需要根据字符或汉字图形中的线条或笔画,通过点亮多个发光二极管来勾勒出字符或汉字的线条或笔画就行了。
如何用点阵拼合成一个显示屏假如用4个8*8LED点阵模块拼成16*16的点阵,即能满足一般汉字的显示。
而16×16扫描LED点阵的工作原理同8位扫描数码管类似。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。
通过时钟的每列扫描显示完整汉字。
并通过模块和模块的嵌套或者连接实现相应功能。
通过这次实验,学到了很多东西,同时也认识到了自己只是FPGA道路上的新手,还有很多未知的知识需要学习。
真正学习的历程需要在课下多努力,希望通过这学期的学习自己能熟练掌握一些编程的技术,培养良好的思维模式。
6参考文献
[1]王金明.《数字系统设计与VerilogHDL》第3版、第2版,电子工业出版社,2009、2005.TP271/W24.
[2]夏宇闻.《Verilog数字系统设计教程》,北京航空航天大学出版社,第1、2版,2008.TP312VH/X31.
[3]蒋璇,臧春华.《数字系统设计与PLD应用技术》,电子工业出版社,TP271/J63.
[4]侯伯亨,顾新.《VHDL硬件描述语言与数字逻辑电路设计》(修订版),西安电子科技大学出版社.TP312/H490.
[5](美)John威廉斯著;李林,陈亦欧,郭志勇译.《Verilog数字VLSI设计教程》,电子工业出版社.2010.7.
[6]潘松,黄继业.《EDA技术实用教程》,科学出版社,2006.TN702/P18.
附录:
程序清单
任务一:
modulescan(clk_50M,rst,choose,data,sel,l5);
inputclk_50M;
inputrst;
outputreg[3:
0]choose;
outputreg[15:
0]data;
outputwire[2:
0]sel;
outputwirel5;
assignsel=3'b010;
assignl5=1'b0;
//+++++++++++++++++++++++++++++++++++++
//分频模块开始
//+++++++++++++++++++++++++++++++++++++
regscan_clk;
reg[40:
0]count_div;
always@(posedgeclk_50M)
begin
if(count_div==24'd49999999999)
begin
scan_clk<=~scan_clk;
count_div<=24'b000000000000000000000000;
end
else
begin
count_div<=count_div+1;
end
end
//-------------------------------------
//分频模块结束
//------------------------------------
always@(posedgescan_clk,negedgerst)
begin
if(!
rst)
choose<=0;
else
choose<=choose+1'b1;
end
alwaysdata=16'hffff;
endmodule
任务二:
`defineBETA_TIME8'h02
modulescan(clk_50M,rst,choose,data,sel,l5,rom_addr,romdata);
inputclk_50M;
inputrst;
outputreg[3:
0]choose;
outputreg[15:
0]data;
outputwire[2:
0]sel;
outputwirel5;
reg[15:
0]disp_memery[0:
15];
reg[15:
0]rom[0:
128];
assignsel=3'b010;
assignl5=1'b0;
//+++++++++++++++++++++++++++++++++++++
//分频模块开始
//分频得到的时钟用于改变显示内容
//+++++++++++++++++++++++++++++++++++++
regdisp_change_clk;
reg[40:
0]count_div;
//
always@(posedgeclk_50M)
begin
if(count_div==24'd49999999999)
begin
disp_change_clk<=~disp_change_clk;
count_div<=24'b000000000000000000000000;
end
else
begin
count_div<=count_div+1;
end
end
//-------------------------------------
//分频模块结束
//------------------------------------
//+++++++++++++++++++++++++++++++++++++
//分频得到的时钟用于改变屏幕扫描
//+++++++++++++++++++++++++++++++++++++
regdisp_scan_clk;
reg[40:
0]count_div1;
always@(posedgeclk_50M)
begin
if(count_div1==24'd4999)
begin
disp_scan_clk<=~disp_scan_clk;
count_div1<=24'b000000000000000000000000;
end
else
begin
count_div1<=count_div1+1;
end
end
//-------------------------------------
//分频模块结束
//------------------------------------
reg[6:
0]rom_addr;
//wire[15:
0]romdata;
output[6:
0]rom_addr;
output[15:
0]romdata;
always@(posedgeclk_50Mornegedgerst)
begin
if(!
rst)
rom_addr<=7'h0;
else
if(rom_addr==7'b000_1111)
rom_addr<=0;
else
rom_addr<=rom_addr+7'b000_0001;
end
always@(posedgedisp_scan_clkornegedgerst)
begin
if(!
rst)
choose<=4'hf;
else
choose<=choose+1'b1;
end
reg[6:
0]disp_count;
always@(posedgedisp_change_clkornegedgerst)
begin
if(!
rst)
disp_count<=7'h00;
else
disp_count<=disp_count+1'b1;
end
always@(posedgeclk_50M)
begin
disp_memery[rom_addr]<=rom[rom_addr+disp_count];
end
alwaysdata=disp_memery[4'hf-choose];
always@(*)
begin
rom[7'h00]=16'h0000;
rom[7'h01]=16'h0200;
rom[7'h02]=16'h6FFE;
rom[7'h03]=16'h2248;
rom[7'h04]=16'h2248;
rom[7'h05]=16'h2FFE;
rom[7'h06]=16'h2201;
rom[7'h07]=16'hE082;
rom[7'h08]=16'h2104;
rom[7'h09]=16'h2E18;
rom[7'h0a]=16'h22E0;
rom[7'h0b]=16'h2210;
rom[7'h0c]=16'h628C;
rom[7'h0d]=16'h0306;
rom[7'h0e]=16'h0004;
rom[7'h0f]=16'h0000;
rom[7'h10]=16'h0002;
rom[7'h11]=16'h0004;
rom[7'h12]=16'h0008;
rom[7'h13]=16'h0010;
rom[7'h14]=16'h8060;
rom[7'h15]=16'hC180;
rom[7'h16]=16'h6E00;
rom[7'h17]=16'h1800;
rom[7'h18]=16'h0600;
rom[7'h19]=16'h0100;
rom[7'h1a]=16'h00C0;
rom[7'h1b]=16'h0020;
rom[7'h1c]=16'h0018;
rom[7'h1d]=16'h000C;
rom[7'h1e]=16'h0008;
rom[7'h1f]=16'h0000;
rom[7'h20]=16'h0000;
rom[7'h21]=16'h1004;
rom[7'h22]=16'h1106;
rom[7'h23]=16'h110C;
rom[7'h24]=16'h11F8;
rom[7'h25]=16'h1108;
rom[7'h26]=16'h1110;
rom[7'h27]=16'h1010;
rom[7'h28]=16'hFF00;
rom[7'h29]=16'h10E0;
rom[7'h2a]=16'h9018;
rom[7'h2b]=16'h7004;
rom[7'h2c]=16'h5002;
rom[7'h2d]=16'h1001;
rom[7'h2e]=16'h000E;
rom[7'h2f]=16'h0000;
rom[7'h30]=16'h0000;
rom[7'h31]=16'h0002;
rom[7'h32]=16'h4084;
rom[7'h33]=16'h44C8;
rom[7'h34]=16'h4D90;
rom[7'h35]=16'h55A0;
rom[7'h36]=16'h6682;
rom[7'h37]=16'h4681;
rom[7'h38]=16'h44FE;
rom[7'h39]=16'h8880;
rom[7'h3a]=16'hB2A0;
rom[7'h3b]=16'h8190;
rom[7'h3c]=16'h80C8;
rom[7'h3d]=16'h8046;
rom[7'h3e]=16'h0000;
rom[7'h3f]=16'h0000;
rom[7'h40]=16'h0404;
rom[7'h41]=16'h0C44;
rom[7'h42]=16'h34C4;
rom[7'h43]=16'hC548;
rom[7'h44]=16'h0648;
rom[7'h45]=16'h0849;
rom[7'h46]=16'h2102;
rom[7'h47]=16'h230C;
rom[7'h48]=16'h25F0;
rom[7'h49]=16'hB900;
rom[7'h4A]=16'h6100;
rom[7'h4B]=16'h21FC;
rom[7'h4C]=16'h2502;
rom[7'h4D]=16'h2382;
rom[7'h4E]=16'h210E;
rom[7'h4F]=16'h0000;
rom[7'h50]=16'h0200;
rom[7'h51]=16'h8200;
rom[7'h52]=16'h73FE;
rom[7'h53]=16'h2004;
rom[7'h54]=16'h0009;
rom[7'h55]=16'h0101;
rom[7'h56]=16'h0202;
rom[7'h57]=16'h7DC2;
rom[7'h58]=16'h4134;
rom[7'h59]=16'h4108;
rom[7'h5A]=16'h4108;
rom[7'h5B]=16'h7D34;
rom[7'h5C]=16'h03C2;
rom[7'h5D]=16'h0203;
rom[7'h5E]=16'h0202;
rom[7'h5F]=16'h0000;
rom[7'h60]=16'h0400;
rom[7'h61]=16'h8400;
rom[7'h62]=16'h7400;
rom[7'h63]=16'h27FE;
rom[7'h64]=16'h0004;
rom[7'h65]=16'h0008;
rom[7'h66]=16'h0410;
rom[7'h67]=16'h0400;
rom[7'h68]=16'h0400;
rom[7'h69]=16'h0400;
rom[7'h6A]=16'hFFFF;
rom[7'h6B]=16'h0400;
rom[7'h6C]=16'h0400;
rom[7'h6D]=16'h0400;
rom[7'h6E]=16'h0400;
rom[7'h6F]=16'h0000;
rom[7'h70]=16'h0000;
rom[7'h71]=16'h0000;
rom[7'h72]=16'h0000;
rom[7'h73]=16'h0000;
rom[7'h74]=16'h0000;
rom[7'h75]=16'h0000;
rom[7'h76]=16'h0000;
rom[7'h77]=16'h0000;
rom[7'h78]=16'h0000;
rom[7'h79]=16'h0000;
rom[7'h7A]=16'h0000;
rom[7'h7B]=16'h0000;
rom[7'h7C]=16'h0000;
rom[7'h7D]=16'h0000;
rom[7'h7E]=16'h0000;
rom[7'h7F]=16'h0000;
end
Endmodule