1、eda课程设计LED点阵显示控制绍 兴 文 理 学 院数 理 信 息 学 院EDA技术课 程 设 计 报 告课题 LED点阵显示控制设计 姓 名 学 号 专业班级 指导教师 时 间 课程设计任务书班 级姓名题目LED点阵显示控制设计技术参数、设计要求、检测数据等在EDA实验箱上利用FPGA和16*16点阵实现如下功能:实现基本的字符显示(譬如绍大)字符的显示时间可调整(譬如1秒、5秒、10秒等)字符可实现闪烁显示(譬如0.5s)字符可实现移位显示,且移位方向可控(左移、右移等)设计进度安排或工作计划2013.1.42013.1.4任务分配,熟悉课题,查询相关资料,出方案初稿。2013.1.52
2、013.1.5方案交流并定稿,划分设计模式,课程设计开展。2013.1.62013.1.7各模块设计实现及调试验证。2013.1.102013.1.13设计整体实现、调试及验证,并开始撰写报告。2013.1.142103.1.15设计完成,课程设计报告撰写并定稿,上交。其 它基于任务书,我们小组对设计增加了一些功能如下:通过键控可以改变字幕滚动速度。通过键控可以使字幕横向或纵向滚动。通过键控可以使字闪烁出现。LED点阵显示控制摘 要本文对基于FPGA控制的LED汉字滚动显示器的设计方法进行了探讨。提出了两个实现方案。并对其中一个方案作了详细说明。文中首先介绍了完成本设计所需的原理、技术、以及所
3、要实现的功能;然后研究了滚动显示汉字的方法及键控模式改变滚动的方式;最后,用VHDL语言程序设计了一个完整的LED汉字滚动显示器。本系统在FPGA试验箱上完成,由扫描控制模块、只读存储器ROM和16*16LED点阵显示模块、一个4-16译码器构成。其中:扫描控制模块和只读存储器ROM集成在FPGA芯片内部。一个4-16译码器(74LS154)输入完成FPGA中1616点阵显示模块的列扫描模式。FPGA定义的只读存储器ROM中保存了要显示的汉字的数模,并以16位的数据宽度输出到LED阵显示模块的行端,配合列扫描控制共同完成汉字的滚动显示。同时通过键控模式,对字幕滚动速度、方式、形式可调。本系统利
4、用数字系统设计自动化(EDA)技术实现了全硬件方式的LED点阵显示。利用FPGA内部的物理资源,将只读存储器ROM和主要功能模块设计在FPGA内部。充分显示了EDA技术设计的灵活性,同时也大大提高了系统的集成度和稳定性 关键词 FPGA; LED; EDA;动态扫描1.设计概述1.1LED点阵原理以下为88点阵LED外观及引脚图及其等效电路,只要其对应的X、Y轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则Y0=1,X0=0即可。应用时限流电阻可以放在X轴或Y轴。图 11 88点阵LED外观图5图 12 88点阵LED等效图5 1.2点阵LED扫描法介绍 点阵LED一般采用扫描式
5、显示,实际运用分为三种方式: (1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于1664=1024Hz,周期小于1ms即可。若使用第二和第三种方式,则频率必须大于168=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足1.3汉字显示原理要实现汉字的显示,首先是获得数模并保存,即在存贮器中建立汉字数据库。这里,直接运用取字模软件,输入要取模的字,自动生成字形码。然后是在扫描模块的控制下,从低往高列扫描的次序正确地输出这些数据,由于人视觉暂留效果,即呈现完整字形。某一时刻能在显示数据序列中定
6、位待显示数据的地址指针可用下式计算: addr=n+m 图 13滚动显示多汉字信息的原理示意图51.4设计的主要功能 基本功能: 实现基本的字符显示(譬如绍大) 字符的显示时间可调整(譬如1秒、5秒、10秒等) 字符可实现闪烁显示(譬如0.5s) 字符可实现移位显示,且移位方向可控(左移、右移等) 附加功能: 通过键控可以改变字幕滚动速度。 通过键控可以使字幕横向或纵向滚动。 通过键控可以使字闪烁出现。 1.5设计的主要工作 本设计需要利用EDA工具软件QuartusII编写并调试系统的VHDL程序。并且每一个模块都在这个软件下进行了仿真。系统的VHDL程序编好过后先在实验室的EDA实验箱上下
7、载调试、验证。2. 设计方案2.1方案一本文系统的LED点阵模块,共由1616=256个LED发光二极管组成。如何在该点阵模块上显示汉字是本文设计的关键技术。本文系统设计是采用一种16路动态分时扫描技术来实现的。具体方法是,将4个88数组的显示模块组合成两个16行16列的扫描结构。其行输入端与FPGA内的只读存储器ROM的16位数据输出端口相连;16个列控制端与一个4-16译码器的输出相连;而译码器的输入端和片选信号又与FPGA内的列扫描控制模块的输出端口相连。图2-1 系统结构框图2.2方案二VHDL程序设计的是硬件,可以“并发执行”。本设计可以将LED显示屏要的显示内容抽象成一个二维数组(
8、数组中的1对映点阵显示屏上面的亮点),用VHDL语言设计一个进程将这个数组动态显示在LED显示屏上,再利用另一个进程对这个数组按一定频率进行数据更新,更新的方式可以有多种。因为两个进程是同时进行的(并发执行),如果对数组中的汉字数据按滚动的方式更新,则可实现汉字的滚动显示。该方案的原理图。 2.3方案比较方案一很容易实现,而且占用FPGA的资源较少。但是由于其实现方式的局限性,该方案只能实现汉字的滚动显示。方案二中将LED点阵抽象成了一个二维数组。可以设计一些比较复杂的算法来控制这个数组,使设计的系统不但可以滚动显示汉字,还可以扩展一些其它的显示效果。但是方案二中对数组的处理部分对FPGA芯片
9、的资源消耗太大,所以最终选择方案一。3. 设计实现3.1分频程序该电路主要包含有一个计数器模块和一个译码输出模块,该电路是通过计数器模块实现分频的。比如要从12MHz的全局时钟得到100Hz的时钟,必须进行120000倍分频。但是这么大的分频需要仿真时间很久。仿真是一般采用小的分频来替代,真正下载到电路上时,就需要采用120000分频了。译码器的输入采用了寄存器锁存输出,这是为了消除毛刺。多输入的组合逻辑电路中,默写输入信号在理想情况下应该同时发生变化,但由于延迟路径不同造成这些输入信号发生变化的时间有微小差别(门延迟时间量级),这是得到的是输出信号就会有毛刺,这些毛刺有可能会给下一级电路带来
10、,使得整个系统运行不稳定。因此,为保证系统的稳健性,一般情况下,都应该给输出信号去毛刺,使之变得干净。在设计中,译码的输入是计数器的输出,计数器各级输出延迟是不一样的,因此译码器输出clk_scan信号波形就会有毛刺。if(reset_n=0)then -clk输入的500KHz信号 cnt_scan:=0; -clk_scan1.25khz的点阵动态扫描信号 cnt_key:=0; elsif(rising_edge(clk)then -clk_key1KHz的键盘扫描信号 if(cnt_scan=cnt_scanhigh)then cnt_scan:=0; else cnt_scan:=c
11、nt_scan+1; end if; if(cnt_key=cnt_keyhigh)then cnt_key:=0; else cnt_key:=cnt_key+1; end if; if(cnt_scan(cnt_scanhigh/2)then clk_scan=1; else clk_scan(cnt_keyhigh/2)then clk_key=1; else clk_key=0; end if; end if;把有毛刺的信号通过时钟采样,即通过一个D触发器也可以消除毛刺。本设计就是使用这种方法。这种方法的缺点是信号通过一个D触发器后,就延迟了一个时钟周期。对于本设计这种延迟是允许的。p
12、rocess(reset_n,clk_key,key1_in) variable temp1:std_logic; variable cnt1:integer range 0 to 15; begin if(reset_n=0)then key1_out=1; -高电平表示没有按下 elsif(rising_edge(clk_key)then if(temp1=key1_in)then if(cnt1=cnt1high)then cnt1:=0; key1_out=temp1; else cnt1:=cnt1+1; end if; else temp1:=key1_in; cnt1:=0; e
13、nd if; end if; end process; 3.2移动速度控制程序在用VHDL编程的时候,可以定义一个变量x作为“滑窗”在ROM上的起始地址,设计一个进程按一定的频率对x进行累加,再设计一个进程将以x为起始地址的长度为16的ROM中的区域动态显示在LED点阵中。显然x累加的速度决定了汉字的滚动速度。if(reset_n=0)then n=nhigh)then n=n; else n=n+1; end if; end if; elsif(key2=0)then if(flag_key=0)then flag_key:=1; if(n=1)then n=n; else n=n-1; e
14、nd if; end if; else flag_key:=0; end if; end if; if(reset_n=0)then -x的控制进程 cntx:=0; x=0; elsif(rising_edge(clk_scan)then if(flag_scan=1)then if(cntx=n*10 or cntx=cntxhigh)then cntx:=0; else cntx:=cntx+1; end if; if(cntx=n*10)then if(x=xhigh)then x=0; else x=x+1; end if; end if; end if; end if;此进程根据定
15、义的信号n来控制x递增的速度,n由外部的按键控制。n的范围为15代表了汉字的不同的滚动速度。当n为1时汉字滚动的速度最快,n为5时LED点阵上显示的汉字滚动速度最慢。3.3按键扫描本系统用到的按键只有5个:复位按键,控制n增大和减小的两个按键,控制闪烁的一个按键,控制横向纵向的一个按键。3.4汉字显示程序if(reset_n=0)then -显示各种模式转换 data=0000000000000000; elsif(rising_edge(clk_scan)then if(key4=1)then if(shanshuo=1)then if(key3=1)then index:=(cnt-x)
16、mod L_SZ); -左移 if(key5=1)then -显示模式转换上下或左右 data=ledsj(index); else data=ledsj1(index); end if; end if; if(key3=0)then index:=(cnt+x) mod L_SZ); -右移 if(key5=1)then data=ledsj(index); else data=ledsj1(index); end if; end if; elsif(shanshuo=0)then data=x0000; end if; elsif(key4=0)then if(key3=1)then in
17、dex:=(cnt-x) mod L_SZ); if(key5=1)then data=ledsj(index); else data=ledsj1(index); end if; end if; if(key3=0)then index:=(cnt+x) mod L_SZ); if(key5=1)then data=ledsj(index); else data(cnt_scanhigh/2)then clk_scan=1; else clk_scan(cnt_keyhigh/2)then clk_key=1; else clk_key=0; end if; end if; end proc
18、ess;end abc;2、键盘扫描字幕显示控制模块程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mnscan isport( clk_scan:in std_logic; -分频时钟 scan:out std_logic_vector(3 downto 0); -列扫描 data:out std_logic_vector(15 downto 0); -列段码输出 dis_n:out std_logic_vector(6
19、 downto 0); -不需要小数点(7位) key1,key2,key3,key4,key5:in std_logic; -key1(加速)key2(减速)key3=1左移key3=0右移 -key4(闪烁控制) key5(输出形式) reset_n:in std_logic -复位); end mnscan;architecture abc of mnscan isconstant L_SZ:integer:=223;constant L_DZ:integer:=15;signal cnt:integer range 0 to L_DZ; -和点阵屏的列一样大signal n:integ
20、er range 1 to 5; -控制速度signal flag_scan:std_logic;signal x:integer range 0 to L_SZ;signal shanshuo:std_logic; -闪烁signal shanshuo_cnt:integer range 0 to 60;-创建一个可以存储2唯数据的数据类型 array_1 array_2type array_2 is array(0 to 31)of std_logic_vector(15 downto 0);constant ledsj:array_2:=(x0008),(x3f88),(x2204),(
21、x2204),(x2112),(x210f),(x2888),(x1044),(x3f82),(x209f),(x2080),(x2080),(x2098),(x3f87),(x2080),(x0000),-绍 上下(x0000),(x0080),(x0080),(x0080),(x0080),(x7fff),(x0080),(x0140),(x0140),(x0240),(x0220),(x0420),(x0810),(x1808),(x7004),(x2002)-大);type array_1 is array(0 to 31)of std_logic_vector(15 downto 0);constant ledsj1:array_1:=(x0000),(x0000),(x7f7e),(x2182
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1