北京印刷学院EDA设计报告点阵LED.docx
《北京印刷学院EDA设计报告点阵LED.docx》由会员分享,可在线阅读,更多相关《北京印刷学院EDA设计报告点阵LED.docx(21页珍藏版)》请在冰豆网上搜索。
![北京印刷学院EDA设计报告点阵LED.docx](https://file1.bdocx.com/fileroot1/2022-11/24/13eba536-5d92-4a66-9585-4f5a4a245918/13eba536-5d92-4a66-9585-4f5a4a2459181.gif)
北京印刷学院EDA设计报告点阵LED
北京印刷学院
课程设计报告
--嵌入式系统EDA
课程设计名称:
EDA技术课程设计
课程设计题目:
点阵LED显示屏控制器的设计
专业:
电子信息工程专业
班级:
学生姓名:
学生姓名指导老师:
唐英杰
时间:
目录
一、设计任务要求.......................................................3
1、基本要求:
..........................................................3
二、设计方案............................................................3
1、系统功能............................................................3
2、系统设计............................................................3
1)系统设计方案说明.....................................................3
2)模块分析............................................................4
1、分频模块............................................................4
2、时钟模块............................................................4
3、按键去抖模块........................................................5
4、只读ROM模块........................................................6
5、显示控制模块........................................................6
6、16*16LED点阵扫描显示模块...........................................7
三、应用设备及软件介绍..................................................9
1:
主要仪器设备(实验用的软硬件环境)...................................9
2:
实验的软件环境.......................................................9
3:
操作方法与实验步骤...................................................9
四、调试过程分析、遇到的问题及解决方法..................................9
五、设计结论...........................................................10
六、管脚分配说明......................................................11
七、参考文献...........................................................11
八、附录..............................................................11
附录一、分频模块程序.....................................................11
附录二、按键去抖模块程序.................................................13
附录三、显示控制模块程序.................................................14
附录四、扫描显示控制模块程序.............................................18
附录五、只读ROM模块程序..................................................20
一、设计任务要求
1、基本要求:
1点阵LED显示屏为16*16的屏;
2能显示一组汉字,如:
电子信息工程专业;
3能以多种显示方式显示汉字,如左移、右移等;
二、设计方案
1、系统功能
系统能够在16*16的LED点阵屏幕上显示任一汉字,有三种显示方式,分别是直接显示文字、从左到右刷屏显示、从右到左刷屏显示;并且能显示不同长度的文字。
2、系统设计
1)系统设计方案说明
此实验是基于CycloneIII的EP3C55F484C8嵌入式系统的设计,主要有时钟模块、按键去抖模块、只读ROM模块、显示控制模块、16*16LED点阵扫描显示模块以及一些输入和输出管脚、电源和地构成。
2)模块分析
1、分频模块
分频器,使输入时钟信号分频成低频信号,达到适合的频率,以供此实验应用。
其中分为奇分频和偶分频,这里用到100的偶分频和5的奇分频。
图一100分频模块
图二5分频模块
2、时钟模块
系统输入时钟为50MHz,为了能达到各模块需要的系统时钟,系统要通过时钟模块分频到1KHz。
在扫描显示模块要求输入时钟必须大于50*16ms,即小于人眼分辨时间,到达显示效果。
时钟模块输入为50MHz通过两个100分频,和一个5分频达到1KHz;
图三时钟模块组成
图四时钟模块
3、按键去抖模块
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键去抖。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
在该按键去抖模块输入时钟为1KHz,去抖系数为20,即按键抖动时间允许在20ms以内。
图五按键去抖模块
4、只读ROM模块
只读存储器ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。
ROM所存数据稳定,断电后所存数据也不会改变;其结构较简单,读出较方便,因而常用于存储各种固定程序和数据。
该只读ROM大小为16bitX512word,在这ROM存储用做字符发生器,用来存储要显示的文字编码。
每个文字编码为16个16b的数据,如“北”字的编码为
0004
0406
0404
0408
0408
FFFE
0000
0000
FEFC
0402
0802
1002
3002
0002
000E
0000
其中“北京印刷学院”存储地址为0~95;“愚者千虑,必有一得”地址为96~239,反向编码的“北京印刷学院”存储地址为240~335。
图六只读ROM模块
5、显示控制模块
该模块是本系统重要模块,本系统显示方式是通过改变字模的地址来呈现不同的显示形式。
本模块有时钟信号clk_1K;mode按键kin和复位按键rest;输出初始地址star_addr[8..0];同步复位信号r_flg和改变扫描方式的change信号,输出信号都作用于扫描显示show_count模块。
输入输出信号如下:
clk_1K——1KHz的时钟输入star_addr[8..0]——每状态对应的初始地址
kin——状态转换按键输入r_flg——同步复位信号
rest——复位按键输入change——改变扫描方式信号
本系统的三种显示方式分别是本模块里状态机:
s0:
直接显示文字;s1:
从左到右刷屏显示;s2:
从右到左刷屏显示;
状态转换图如右图:
文字编码已按地址存储在文字库ROM里,每种显示
方式都通过改变扫描显示的初始地址来实现。
在每个
状态机里当显示时间达到show_times*16即800ms左右
就会改变一次初始地址(+16或+1)直到该段文字结束
后,初始地址又变为该段文字的初始地址。
如显示方式图七显示方式状态转换图
一:
“北京印刷学院”存储地址为0~95。
初始地址为0,每次显示时间到800ms地址加16,直到地址为80的时候下一次计时到800ms后地址变为0;
图八显示控制模块
6、16*16LED点阵扫描显示模块
LED动态显示接口是嵌入式系统中应用最为广泛的一种显示方式之一,动态驱动是将所有行LED的同名端连在一起,另外为每列LED的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当FPGA输出字形码时,FPGA对位选通COM端电路的控制,所以我们只要将需要显示的列码的选通控制打开,该位就显示出字形,没有选通的列就不会亮。
通过分时轮流控制各列的COM端,就使各列LED轮流受控显示,这就是动态驱动。
在轮流显示过程中,每列LED的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各列LED并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
在本系统的扫描显示模块里包括LED动态扫描显示模块show_count和文字库ROM组成。
在核心模块扫描显示模块show_count输入信号有时钟clk,初始地址信号star_addr,控制信号change、rest。
输出信号有字模地址addr和位选信号bit_code。
个信号具体如下表:
Change——改变扫描方式信号输入
star_addr——控制端初始地址输入
rest——同步复位信号输入addr——字模地址输出
clk——1KHz时钟输入bit_code——列码位选信号输出
本模块通过地址控制ROM输出文字编码到LED点阵相应的每一列上来达到显示目的。
每个文字编码为16个16位的数据,每个16位数据对应每一列,故每个文字要扫描显示16次;用第一种显示效果为例:
当输出bit_code码为0时输出地址为0的数据,下一个时钟到来时,bit_code加1,同时addr加1显示下一列数据。
直到bit_code=15,addr也刚好加到star_addr+15,在下一时钟
图九扫描显示控制模块
到来时bit_code回到0;同时addr也回到改文字的star_addr。
这样不断的扫描显示达到显示出一个文字的效果。
下图为本系统的16*16LED点阵扫描显示模块总电路图,核心模块show_count通过addr总线连到字模ROM的address,这样实现了扫描显示模块通过控制ROM地址输出相应字模编码到对应列上来进行扫描显示。
其中注意的是,该ROM需要在输入地址后的第二个上升沿才能把数据送到q(输出)端,故在初始时刻,要在第三个上升沿才能让bit_code加1。
图十扫描显示模块总电路图
3、应用设备及软件介绍
1:
主要仪器设备(实验用的软硬件环境)
(1)计算机;
(2)实验箱(CycloneIII的EP3C55F484C8)
(3)电源线一根
(4)USB下载线一根
2:
实验的软件环境
QuartusⅡ9.0软件
3:
操作方法与实验步骤
(1)利用QuartusII9.0软件实现EDA的基本设计流程:
创建工程、编辑文本输设计
文件、编译前设置、全程编译、功能仿真。
(2)利用QuartusII9.0软件实现引脚锁定和编译文件下载。
四、调试过程分析、遇到的问题及解决方法
问题1:
本来自己通过在显示屏上设计好每个LED灯的状态,则需要32个管脚控制,结果发现管脚不够分配,只有20个管脚。
解决方法:
通过查阅实验说明书,了解了实验原理以及管脚分配,知道了每个字的代码是用字模软件生成的,重新根据实验原理编写代码从而实现20个管脚的分配。
问题2:
调试成功,但是LED屏幕上一直无法显示汉字。
解决方法:
通过仔细查阅实验说明书,将开发平台上的CTRL_SW组合开关上的1拨上,2、3、4拨下,使数码管显示为1,LED屏幕上显示汉字。
问题3:
在显示一段文字时,每次返回显示第一个文字的时候总是错位。
解决方法:
把扫描显示模块的复位信号用作跟显示控制模块的同步复位信号r_flg,当该段文字返回显示第一个文字时,由显示控制模块产生一个复位信号作用于扫描显示模块,让扫描显示模块同步复位,这样就不会出错了。
问题4:
每段文字显示完后总会出现一串乱码,然后一直黑屏。
解决方法:
导致这种情况的原因是运算语句参数错误,导致地址超范围;最后通过改变参数,使每次显示文字都在该段文字编码范围内,问题就解决了。
五、设计总结
通过这次课程设计的整个过程中,我们做了一次全面、较规范的设计练习,全面地温习了以前所学过的知识,以及做过的实验,用理论联系实际并结合FPGA课程和解决实际问题,巩固、加深和扩展了有关FPGA设计方面的知识。
尤其重要的是让我们养成了科学的习惯,在设计过程中一定要注意掌握项目工程设计方案,在设计阶段,注意设计模块与结构设计时序交替进行,采用正确的设计方法。
在整个设计过程中注意对设计资料和计算数据的保存和积累,保持记录的完整性。
在状态机的设计过程中要注意分清状态。
在课程设计的实践中进行了设计基本技能的训练,掌握了查阅和使用标准、规范、手册、图册、及相关技术资料的基本技能以及计算、数据处理等方面的能力。
在整个设计工过程中,尤其是设计之前,一定要有整体的逻辑思路;然后在分块解决。
同样在检测的过程中,要学会分模块检测,这一点是很重要的,会起事半功倍的效果。
通过对通用EP3C55F484C8的FPGA处理器的设计,掌握了一般verilog设计的程序和方法,让我们对整个FPGA程序的设计,verilog语言有了一个比较深的理解。
还有就是增强了自身的动手能力,把以前书本上讲的或是没有讲的,通过一次课程设计具体的实施,使自己真正得到锻炼,对于以后我们的发展与学习来说,都可以看作一笔不小的财富,前面还有很多需要我们去尝试。
这次课程设计还是有了不少收获,对FPGA的认识更加深了,自己动手能力也提高一些
六、管脚分配说明
管脚分配设计端口
芯片引脚
开发平台模块
EP3C16/40/55/80F484
row[16]
PIN_A13
16X16点阵
row[15]
PIN_F9
row[14]
PIN_D10
row[13]
PIN_B10
row[12]
PIN_B9
row[11]
PIN_B8
row[10]
PIN_B7
row[9]
PIN_E14
row[8]
PIN_C15
row[7]
PIN_F11
row[6]
PIN_C13
row[5]
PIN_E11
row[4]
PIN_B6
row[3]
PIN_A6
row[2]
PIN_A5
row[1]
PIN_A4
col[4]
PIN_C4
col[3]
PIN_A16
col[2]
PIN_A15
col[1]
PIN_A14
7、参考文献:
[1]夏宇闻.Verilog数字系统设计教程(第3版).北京:
北京航空航天出版社.2013
[2]夏宇闻.Verilog嵌入式数字系统设计教程.北京:
北京航空航天出版社.2009
[3]GX-BICE-EDA实验教程说明书.北京革新科技.
八、附录:
附录一、分频模块程序
DDF_2:
//二分频模块
moduleDDF_2(clkin,clkout);
inputclkin;
outputclkout;
regclkout;
reg[8:
0]count;
parameterNUM=0;
always@(posedgeclkin)
begin
if(count==NUM)
begin
count<=8'b0000_0000;
clkout<=~clkout;
end
else
count<=count+8'b0000_0001;
end
endmodule
DDF_5:
//五分频模块
moduleDDF_5(clkin,clkout);
parameterNUM=5;
inputclkin;
outputclkout;
wireclkout;
reg[4:
0]m,n;
regcount1,count2;
assignclkout=count1|count2;
always@(posedgeclkin)
begin
if(m==NUM-1)
m<=0;
else
m<=m+1;
if(m<(NUM-1)/2)
count1<=1;
else
count1<=0;
end
always@(negedgeclkin)
begin
if(n==NUM-1)
n<=0;
else
n<=n+1;
if(n<(NUM-1)/2)
count2<=1;
else
count2<=0;
end
endmodule
附录二、按键去抖模块程序
qudou:
//按键去抖模块
modulequdou(Kin,clk,Kout);
inputKin,clk;
outputKout;
regKout;
reg[5:
0]counter;
parameterdisort=20;
always@(posedgeclk)//上升沿
begin
if(Kin==0)//有按键
begin
if(counter>=disort)//大于去抖值disort
begin
Kout=0;//输出按键
counter=disort;//固定counter值
end
else
begin
Kout=1;//输出按键
counter=counter+1;//计数加1
end
end
else//没有按键
begin
counter=0;//计数值为0,清零
Kout=1;
end
end
endmodule
附录三、显示控制模块程序
display_count:
//显示控制模块
moduledisplay_count(clk_1k,kin,rest,star_addr,r_flg,change);
inputclk_1k,rest,kin;
outputreg[8:
0]star_addr;
outputregr_flg,change;
reg[10:
0]s_count;
reg[1:
0]k_count;
reg[3:
0]state;
parametershow_times=50,display_word=5,
s0=4'b0001,s1=4'b0010,s2=4'b0100,s3=4'b1000;
always@(negedgekinornegedgerest)
begin
if(!
rest)
k_count<=2'b00;
elseif(k_count==3)
k_count<=1;
else
k_count<=k_count+1'b1;
end
always@(posedgeclk_1k)
begin
if(!
rest)
begin
r_flg<=0;//tongbufuwei
s_count<=0;
star_addr<=0;
state<=s0;
change<=0;
end
elsebegin
//r_flg<=1;
case(state)
s0:
begin
if(k_count==1)
begin
state<=s1;
r_flg<=0;
star_addr<=96;
end
elsebegin
if(s_count==show_times*16)
begin
s_count<=0;
if(star_addr>=display_word*16)
begin
r_flg<=0;
star_addr<=0;
end
else
star_addr<=star_addr+16;
end
elsebegin
state<=s0;
r_flg<=1;
s_count<=s_count+1'b1;
end
end
end
s1:
begin
if(k_count==2)
begin
state<=s2;
r_flg<=0;
star_addr<=240;
change<=1;
end
if(s_count==(show_times-45)*16)
begin
s_count<=0;
if(star_addr==208)
begin
star_addr<=96;
r_flg<=0;//tongbufuwei