数字系统设计任务书汉字的LED点阵动态显示 2.docx
《数字系统设计任务书汉字的LED点阵动态显示 2.docx》由会员分享,可在线阅读,更多相关《数字系统设计任务书汉字的LED点阵动态显示 2.docx(16页珍藏版)》请在冰豆网上搜索。
数字系统设计任务书汉字的LED点阵动态显示2
数字系统设计报告
学院(部):
电气与信息工程学院
专业:
自动化
学生姓名:
肖春元
指导老师:
班级:
1004
学号10401700519
2013年11月
数字系统设计任务及要求
学院:
电气与信息工程学院班级:
自动化1004班姓名:
肖春元学号:
10401700519
课题
汉字的LED点阵动态显示
系
统
功
能
要
求
通过用QuartusⅡ设计、调试16×16点阵动态显示,熟悉QuartusⅡ的设计输入、设计编译、仿真验证、时序分析、器件编程等基本操作。
本设计要求掌握汉字的点阵显示原理、LED点阵的组成及驱动原理、字模软件的使用和汉字动态显示的编程方法。
具体要求:
1.用一个16×16的LED点阵显示“班级,姓名,2013年11月18日”
2.至少用以下一种方法实现上面的显示。
显示方式:
a.按钮k0一次就显示下一个字符;b.左移显示;c.右移显示d.上移显示;e.下移显示;其中a方式可以用按键按下显示下一个字,用单次脉冲开关进行切换,即按一次单次脉冲开关显示一个汉字或数字;也可用软件控制,每隔一定时间显示一个字。
汉字字模数据:
16×16,宋体。
字模提取方法:
从第一个开始向下每取8个点作为一个字节,如果最后不足8个点就补满8位。
取模顺序:
从高到低,即第一个点作为最高位。
如*-------取为10000000。
3.电路原理图:
使用visio或protel或proteus绘制
4.编程思路,用visio画程序设计流程图或用文字描述
5.详细的程序清单(QuartusⅡ工程文件夹)
6.仿真过程及结果(截图,视频),RTL图等
工
具
EL-EDA-V+试验箱
1.FPGA型号芯片EP1K30TC144-3
2.16×16LED点阵
进
度
安
排
第1周:
理解设计内容,查阅资料,确定设计思路并撰写计划,完成方案设计以及电路原理图设计,并开始软件设计。
第2周:
主要做程序设计,用实验箱调试程序(验收),撰写实验报告,用A4打印。
汉字的LED点阵动态显示
1、系统设计要求;
通过用QuartusⅡ设计、调试16×16点阵动态显示,熟悉QuartusⅡ的设计输入、设计编译、仿真验证、时序分析、器件编程等基本操作。
本设计要求掌握汉字的点阵显示原理、LED点阵的组成及驱动原理、字模软件的使用和汉字动态显示的编程方法。
具体要求:
1.用一个16×16的LED点阵显示“班级,姓名,2013年11月18日”。
2.至少用以下一种方法实现上面的显示。
显示方式:
a.按钮k0一次就显示下一个字符;b.左移显示;c.右移显示d.上移显示;e.下移显示;其中a方式可以用按键按下显示下一个字,用单次脉冲开关进行切换,即按一次单次脉冲开关显示一个汉字或数字;也可用软件控制,每隔一定时间显示一个字。
汉字字模数据:
16×16,宋体。
字模提取方法:
从第一个开始向下每取8个点作为一个字节,如果最后不足8个点就补满8位。
取模顺序:
从高到低,即第一个点作为最高位。
如*-------取为10000000。
3.电路原理图:
使用visio或protel或proteus绘制。
4.编程思路,用visio画程序设计流程图或用文字描述。
5.详细的程序清单(QuartusⅡ工程文件夹)。
6.仿真过程及结果(截图,视频),RTL图等。
2、系统设计原理;
2.1、LED的显示原理;
16×16扫描LED点阵的工作原理同8位扫描数码管类似。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。
通过时钟的每列扫描显示完整汉字。
图2-1LED灯红绿信号图2-216×16点阵LED等效电路
点阵LED一般采用扫描式显示,实际运用分为三种方式:
(1)点扫描
(2)行扫描
(3)列扫描
若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。
若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。
此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
2.2、汉字的储存;
用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。
第一步是获得数据并保存,即在存贮器中建立汉字数据库。
第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。
获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以32×16的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。
以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。
2.3、设计方案;
16×16扫描LED点阵只要其对应的X、Y轴顺向偏压,即可使LED发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
应用时限流电阻可以放在X轴或Y轴。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯。
本实验就是要通过CPLD芯片产生读时序,将字形从寄存器中读出,然后产生写时序,写入16×16的点阵,使其扫描显示输出。
为了显示整个汉字,首先分布好汉字的排列,以列给出汉字信息(从16个Y轴线输入字模信息);然后以128HZ的时序逐个点亮每一行(行扫描),即每行逐一加高电平,根据人眼的视觉残留特性,使之形成整个汉字的显示。
LED点阵每个点都有一个红色的发光二极管。
点阵内的二极管间的连接都是行共阳,列共阴(要点亮的二极管给出低电平字模信息)。
本实验采用共阴,当二极管的共阳极为高电平,共阴极为低电平时,所接点发光;反之处于截止状态,不放光。
本实验采取列扫描方式,用列给文字信息,利用周期为1s的脉冲来控制所显示的字。
图2-3点阵原理图
图2-4取字模
三、VHDL源程序;
3.1、延时消抖程序
--延时消抖程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYBUTTONIS
PORT(CLK:
INSTD_LOGIC;
KEY:
INSTD_LOGIC;
BUTTON:
OUTSTD_LOGIC);
ENDENTITYBUTTON;
ARCHITECTUREARTOFBUTTONIS
SIGNALCOUNT:
INTEGER:
=0;
BEGIN
PROCESS(CLK,KEY)IS
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFKEY='0'THEN
IFCOUNT=10000THENCOUNT<=COUNT;--按键消抖10ms默认输入CLK:
1MHz
ELSECOUNT<=COUNT+1;
ENDIF;
IFCOUNT=10000-1THENBUTTON<='0';--按下及长按都只出现一个低电平
ELSEBUTTON<='1';
ENDIF;
ELSECOUNT<=0;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
3.2、汉字显示程序
--汉字显示程序,带按键切换
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYLATTICEIS
PORT(CLK:
INSTD_LOGIC;
BUTTON:
INSTD_LOGIC;
LEDD:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
LEDW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDENTITYLATTICE;
ARCHITECTUREARTOFLATTICEIS
SIGNALM:
INTEGER:
=0;
SIGNALCOUNT:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
BEGIN
PROCESS(CLK,BUTTON)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
COUNT<=COUNT+1;
IF(M=0)THEN
CASECOUNTIS
--{0x00,0x00,0x7F,0xFF,0x44,0x40,0x4A,0x20,0x71,0xC4,0x00,0x08,0x23,0x30,0x2D,0x02,},
--{0x31,0x01,0xE7,0xFE,0x21,0x00,0x21,0x40,0x21,0x20,0x21,0x18,0x20,0x0C,0x00,0x00,},/*"肖",0*/
WHEN"0000"=>LEDD<="0000000000000000";
WHEN"0001"=>LEDD<="0111111111111111";
WHEN"0010"=>LEDD<="0100010001000000";
WHEN"0011"=>LEDD<="0100101000100000";
WHEN"0100"=>LEDD<="0111000111000100";
WHEN"0101"=>LEDD<="0000000000001000";
WHEN"0110"=>LEDD<="0010001100110000";
WHEN"0111"=>LEDD<="0010110100000010";
WHEN"1000"=>LEDD<="0011000100000001";
WHEN"1001"=>LEDD<="1110011111110111";
WHEN"1010"=>LEDD<="0010000100000000";
WHEN"1011"=>LEDD<="0010000101000000";
WHEN"1100"=>LEDD<="0010000100100000";
WHEN"1101"=>LEDD<="0010000100011000";
WHEN"1110"=>LEDD<="0010000000001100";
WHEN"1111"=>LEDD<="0000000000000000";
WHENOTHERS=>COUNT<="0000";
ENDCASE;
ENDIF;
IF(M=1)THEN
CASECOUNTIS
--{0x00,0x02,0x42,0xC4,0x46,0x28,0x5A,0x10,0x63,0xE8,0x08,0x14,0x2A,0x94,0x2A,0x92},
--{0x2A,0x92,0xFF,0xFE,0x2A,0x92,0x2A,0x92,0x3E,0x92,0x08,0x92,0x08,0x02,0x00,0x00},/*"春",1*/
WHEN"0000"=>LEDD<="0000000000000010";
WHEN"0001"=>LEDD<="0100001011000100";
WHEN"0010"=>LEDD<="0100011000101000";
WHEN"0011"=>LEDD<="0101101000010000";
WHEN"0100"=>LEDD<="0110001111101000";
WHEN"0101"=>LEDD<="0000100000010010";
WHEN"0110"=>LEDD<="0010101010010100";
WHEN"0111"=>LEDD<="0010101010010010";
WHEN"1000"=>LEDD<="0010101010010010";
WHEN"1001"=>LEDD<="1111111111111110";
WHEN"1010"=>LEDD<="0010101010010010";
WHEN"1011"=>LEDD<="0010101010010010";
WHEN"1100"=>LEDD<="0011111010010010";
WHEN"1101"=>LEDD<="0000100010010010";
WHEN"1110"=>LEDD<="0000100000000010";
WHEN"1111"=>LEDD<="0000000000000000";
WHENOTHERS=>COUNT<="0000";
ENDCASE;
ENDIF;
IF(M=2)THEN
CASECOUNTIS
--{0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x04,0x0E,0x08,0x34,0x30,0xC7,0xC0,0x04,0x00},
--{0x04,0x00,0x07,0xFC,0x04,0x02,0x14,0x02,0x0E,0x02,0x04,0x02,0x00,0x0E,0x00,0x00},/*"元",2*/
WHEN"0000"=>LEDD<="0000000000000000";
WHEN"0001"=>LEDD<="0000000000000001";
WHEN"0010"=>LEDD<="0000000000000010";
WHEN"0011"=>LEDD<="0000010000000100";
WHEN"0100"=>LEDD<="0000111000001000";
WHEN"0101"=>LEDD<="0011010000110000";
WHEN"0110"=>LEDD<="1100011111000000";
WHEN"0111"=>LEDD<="0000010000000000";
WHEN"1000"=>LEDD<="0000010000000000";
WHEN"1001"=>LEDD<="0000011111111100";
WHEN"1010"=>LEDD<="0000010000000010";
WHEN"1011"=>LEDD<="0001010000000010";
WHEN"1100"=>LEDD<="0000111000000010";
WHEN"1101"=>LEDD<="0000010000000010";
WHEN"1110"=>LEDD<="0000000000001110";
WHEN"1111"=>LEDD<="0000000000000000";
WHENOTHERS=>COUNT<="0000";
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
LEDW<=COUNT;
PROCESS(BUTTON)IS
BEGIN
IF(BUTTON'EVENTANDBUTTON='0')THEN
IFM=3THENM<=0;
ELSEM<=M+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
4、仿真与结果分析;
4.1、开发环境介绍
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、Veril-ogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
4.2、创建工程
在QuartusII中新建一个VHDLFile文件,将VHDL代码输入这个文件,并保存到工作目录,名为LATTICE.vhd。
利用newprejectwizard工具创建一个工程,工程名为LATTICE,顶层文件实体名为LATTICE,并将上面创建的LATTICE文件加入到工程中。
4.3、编译前设置
1.选择目标芯片。
用assignmemts-=>settings命令,弹出settings对话框,选择目标芯片为EP2C5T144C8。
图4-1选择目标器件
2.选择工作方式,编程方式,及闲置引脚状态
单击上图中的device&pinoptions按钮,弹出device&pinoptions窗口。
在General项中选中auto-restartconfigurationaftererror,使对FPGA的配置失败后能自动重新配置,并加入JTAG用户编码。
图4-2选择配置器件工作方式
在configuration项中,其下方的Generatecompressedbitstreams处打勾,这样就能产生用于EPCS的POF压缩配置文件。
在Configuration选项页,选择配置器件为EPCS1,其配置模式选择为activeserial。
图4-3选择编程方式
在Unusedpins项,将目标器件闲置引脚状态设置高阻态,即选择Asinput,tri-stated。
图4-4设置闲置引脚状态
4.4、全程编译
设置好前面的内容之后,就可以进行编译了。
选择Processing菜单中startcompilation,在窗口的下方processing栏中显示编译信息。
图4-5全程编译成功完成
完成后在工程管理窗口左是角显示了工程yz_ok的层次结构和其中结构模块耗用的逻辑宏单元数。
此栏的右边是编译处理流程,包括数据网表建立、逻辑综合、适配、配置文件装配和时序分析等。
4.5、时序仿真
1.新建一个矢量波形文件,同时打开波形编辑器。
设置仿真时间为50us,保存波形文件为LATTICE.vwf。
2.将工程LATTICE的端口信号名选入波形编辑器中,所选的端口有clk,enable及总线h0和h8。
设置clk的时钟周期为2us,占空比为50%。
图4-6选择仿真控制
仿真器参数设置。
选择菜单Assignment中的Settings,在Settings窗口下选择Simulator,在右侧的simulationmode项下选择timing,即选择时序仿真,并选择仿真激励文件名LATTICE.vwf。
选择simulationoptions栏,确认选定simulationcoveragereporting;毛刺检测Glitchdetection为1ns宽度;选中Runsimulationuntilallvectorstimuli全程仿真。
现在所有设置进行完毕,在菜单processing项下选择startsimulation,直到出现simulationwassuccessful,仿真结束。
仿真文件simulationreport通常会自动弹出,否则选择processing=>simulationreport。
五、逻辑综合与结果分析。
VHDL语言具有强大的语言结构,只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。
同时,它还具有多层次的电路设计描述功能。
此外,VHDL语言能够同时支持同步电路、异步电路和随机电路的设计实现,这是其他硬件描述语言所不能比拟的。
VHDL语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自底向上的设计方法;既支持模块化设计方法,也支持层次化设计方法。
VHDL是超高速集成电路的硬件描述语言,它能够描述硬件的结构、行为与功能。
另外,VHDL具有并发性,采用自上而下的结构式设计方法,适合大型设计工程的分工合作。
在编写程序的时候,我才发现能看懂程序和能自己写程序是两个完全不同的概念,自己一开始写程序时,即便是一个很简单的功能模块,在编译时也可能产生很多错误,在不断的改错过程中,自己对VHDL语言的语法结构有了深刻的理解,对编译过程中常见的错误也有了全面的认识。
通过这两周的课程设计,我在熟悉了基于FPGA设计的同时,也学到了很多在学习课本知识时所体会不到的东西。