- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈工程FPGA实验报告16×16点阵
FPGA实验报告
姓名:
学号:
指导教师:
2013.6.10
实验六 点阵扫描显示实验
一、实验原理
根据硬件电路可知,点阵的控制端口由行端口和列端口组成,分别为16个,相当于256个LED灯。要是某一个灯亮,只需使对应位置上一端为高,一端为低。该16*16的点阵的列端口由一个74154 四位译码器控制。由其资料可知,要使74154正常工作,其12脚、18脚与19脚必须接低。20、21、22、23脚是数据输入端。24脚为VCC,其他为数据输出端口。
16×16扫描LED点阵的工作原理同8位扫描数码管类似。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。 通过时钟的每列扫描显示完整汉字。
点阵LED一般采用扫描式显示,实际运用分为??种方式:
(1)点扫描
(2)行扫描
(3)列扫描
若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
汉字显示使用的是16×16的点阵,FPGA实验箱上有其接口电路,列选信号为SEL0,SEL1,SEL2,SEL3,经4线16线译码器输出16列,从左起为第一列,列选信号是由一个4位向量SEL[3..0]控制;行选信号为H0~H15,是由16个行信号组成的,每一行由一个单独的位来控制,高电平有效。例如“0000”表示第0列,“0000000000000001”表示第一行的点亮。由于列是由一个向量决定,而每一时刻的值只能有一个固定的值,因而只能使某一列的若干个点亮,因此就决定了只能用逐列扫描的方法。例如要使第一列的2,4,6,8,行亮,则列为“0001”、行为“0000000010101010”就可以实现了
用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。第一步是获得数据并保存,即在存贮器中建立汉字数据库。第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以32×16的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。
二、实验框图及原理图
实验原理图
实验框图
三、实验程序详解
1)行扫描
使行扫描端口依次拉低,同时较高频率进行列扫秒
module D_Z(clk,lie,hang,sel0,sel1,sel2);
input clk; //时钟输入
output [4:0]lie; //点阵引脚
output [15:0]hang;
output sel0; //扩张功能选择引脚
output sel1;
output sel2;
reg clk_s;
reg clk_ms;
reg [4:0]lie;
reg [15:0]hang;
reg [3:0] XS_data; //显示状态
reg [3:0] PY_data; //平移状态
reg [31:0] XS_DIV; //显示计数
reg [31:0] PY_DIV; //平移计数
wire sel0;
wire sel1;
wire sel2;
parameter CLK_XS = D25_000;
parameter CLK_PY = D1_000;
assign sel0 = 1b0; //扩展功能选择点阵
assign sel1 = 1b1;
assign sel2 = 1b0;
always @(posedge clk) //时钟分频产生毫秒时钟,用于点阵动态显示
begin
if(XS_DIV CLK_XS)
XS_DIV = XS_DIV+1b1;
else
begin
XS_DIV = 0;
clk_ms = ~clk_ms;
end
end
always @(po
文档评论(0)