哈工程FPGA实验报告——16×16点阵.doc

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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点阵模块显示图像,,,,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 @(posedge clk_ms) //毫秒时钟计数产生秒级时钟,用于平移 begin if(PY_DIV = CLK_PY) PY_DIV = PY_DIV + 1; else begin PY_DIV = 0; clk_s = ~clk_s; end end always @(posedge clk_ms) //显示一行点

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档