当前位置:文档之家› 16乘16点阵显示实验报告剖析

16乘16点阵显示实验报告剖析

实验报告实验名称: [16×16点阵显示实验] 姓名: []学号: [201]指导教师: [解*]实验时间: [2013年4月25日]信息与通信工程学院16×16点阵显示实验1实验要求任务1:将所给程序改正使结果为正显示;任务2:使显示四个字、八个字。

2实验原理2.1 LED显示器结构和原理1>8*8LED点阵的结构图1 8*8LED点阵结构图从图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。

图2 8*8LED点阵实物图图3 8*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.2 LPM_ROM的应用该模块为逻辑宏模块存储器。

其应用过程如下。

1选择模块2点击ok后,得到3属性编辑:可以根据实际需要选择数据宽度和内存的容量,默认是8bit,32个字空间。

修改空间和数据属性,Cyclone系列支持最大存储深度4k。

该界面可以选择输出引脚的属性,需要把hex文件或者mif其中mif文件或者hex文件可以由多种形式生成。

或由多种工具获得,如Quartus 的Text File编辑器、Matlab 等。

完成设置:放置该模块:按照基本操作步骤添加引脚,并进行编译,排除错误。

注意总线形式的引脚设置方法。

双击引脚标识,修改对话框中的内容,获得总线连接方式。

3 实验结果通过对程序及原理图的修改,逐步完成了老师的要求,最后使显示器显示“面朝大海,春暖花开。

”4 实验心得这次实验比之前更加深入一点,通过这次实验,我了解了16*16点阵的基本工作原理,学习了用Verilog HDL语言编写点阵扫描的程序。

虽然在实验中遇到了一些问题,尤其是四个字变八个字的过程,只因为一个小小的接线问题,始终看不到“春暖花开”。

但是自己看着问题一步一步的解决,知识一点一点的积累,确实很有成就感,这又增加了我对FPGA学习的热情。

虽然还不能完全读懂本实验上的所有程序,但是能够通过修改部分程序来完成老师要求的任务,也是有意义的。

附录:实验程序清单module dianzhen (clk50mhz,row,sel0,sel1,sel2,sel3,line);input clk50mhz; //实验箱提供50MHz时钟信号output sel0,sel1,sel2,sel3; //设置引脚选通点阵output reg [15:0] row; //列output reg [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计数子assign sel0=1'b0;assign sel1=1'b1;assign sel2=1'b0;assign sel3=1'b0;always@(posedge clk50mhz)beginif(cnt>=25'd5*******)begincnt<=25'b0; //1Hz计时器cnt1<=cnt1+1; //16s计时器endelsecnt<=cnt+1;endhangsaomiaou1(.clk50mhz(clk50mhz),.row(row1),.line(line1)); liesaomiaou2(.clk50mhz(clk50mhz),.row(row2),.line(line2)); always@(*)if(cnt1<=5'd31)beginrow<=row1; //行扫描line<=line1;endelsebeginrow<=row2; //列扫描line<=line2;endEndmodule行扫描module hangsaomiao(clk50mhz,line,row);input clk50mhz; //实验箱输入50MHz时钟信号output reg [15:0] row; //列output reg [3:0] line; //行reg [24:0] cnt1,cnt2; //计数子reg clkrow,clkline; //列脉冲、行脉冲always@(posedge clk50mhz)beginif(cnt1>=25'd5*******)begincnt1<=25'b0;clkrow=~clkrow; //1s列脉冲endelsecnt1<=cnt1+1;endalways@(posedge clk50mhz)beginif(cnt2>=25'd500)begincnt2<=25'b0;clkline=~clkline;//100KHz行脉冲endelsecnt2<=cnt2+1;endalways@(posedge clkline)begincase(line)4'd0:line<=4'd1; //高速行扫描4'd1:line<=4'd2;4'd2:line<=4'd3;4'd3:line<=4'd4;4'd4:line<=4'd5;4'd5:line<=4'd6;4'd6:line<=4'd7;4'd7:line<=4'd8;4'd8:line<=4'd9;4'd9:line<=4'd10;4'd10:line<=4'd11;4'd11:line<=4'd12;4'd12:line<=4'd13;4'd13:line<=4'd14;4'd14:line<=4'd15;4'd15:line<=4'd0;default:line<=4'd0;endcaseendalways@(posedge clkrow) //时间间隔为1s的列扫描begincase(row)16'b0000000000000001:row<=16'b0000000000000010;16'b0000000000000010:row<=16'b0000000000000100;16'b0000000000000100:row<=16'b0000000000001000;16'b0000000000001000:row<=16'b0000000000010000;16'b0000000000010000:row<=16'b0000000000100000;16'b0000000000100000:row<=16'b0000000001000000;16'b0000000001000000:row<=16'b0000000010000000;16'b0000000010000000:row<=16'b0000000100000000;16'b0000000100000000:row<=16'b0000001000000000;16'b0000001000000000:row<=16'b0000010000000000;16'b0000010000000000:row<=16'b0000100000000000;16'b0000100000000000: row<=16'b0001000000000000;16'b0001000000000000:row<=16'b0010000000000000;16'b0010000000000000:row<=16'b0100000000000000;16'b0100000000000000:row<=16'b1000000000000000;16'b1000000000000000:row<=16'b0000000000000001;default :row<=16'b0000000000000001;endcaseendendmodule列扫描module liesaomiao(clk50mhz,row,line);input clk50mhz; //实验箱输入50MHz时钟信号output reg [15:0] row; //行output reg [3:0] line; //列reg [24:0] cnt; //计数子reg clk;always@(posedge clk50mhz)beginif(cnt>=25'd5*******)begincnt<=25'b0;clk=~clk; //1sendelsecnt<=cnt+1;endalways @ (posedge clk) //列扫描begincase(line)4'h0:beginrow=16'b1111111111111111;line<=4'h1;end4'h1:beginrow=16'b1111111111111111;line<=4'h2;end4'h2:beginrow=16'b1111111111111111;line<=4'h3;end4'h3:beginrow=16'b1111111111111111;line<=4'h4;end 4'h4:beginrow=16'b1111111111111111;line<=4'h5;end 4'h5:beginrow=16'b1111111111111111;line<=4'h6;end 4'h6:beginrow=16'b1111111111111111;line<=4'h7;end 4'h7:beginrow=16'b1111111111111111;line<=4'h8;end 4'h8:beginrow=16'b1111111111111111;line<=4'h9;end 4'h9:beginrow=16'b1111111111111111;line<=4'ha;end 4'ha:beginrow=16'b1111111111111111;line<=4'hb;end 4'hb:beginrow=16'b1111111111111111;line<=4'hc;end 4'hc:beginrow=16'b1111111111111111;line<=4'hd;end 4'hd:beginrow=16'b1111111111111111;line<=4'he;end 4'he:beginrow=16'b1111111111111111;line<=4'hf;end 4'hf:beginrow=16'b1111111111111111;line<=4'h0;enddefault:line<=4'h0;endcaseendendmodule。

相关主题