字符发生器 课程设计.docx
《字符发生器 课程设计.docx》由会员分享,可在线阅读,更多相关《字符发生器 课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
![字符发生器 课程设计.docx](https://file1.bdocx.com/fileroot1/2022-12/17/a29f502d-9fc2-420e-824b-acf3f404e07b/a29f502d-9fc2-420e-824b-acf3f404e07b1.gif)
字符发生器课程设计
电子课程设计
——字符发生器
学院:
0000000
专业、班级:
00000000
姓名:
000
学号:
0000000000
指导教师:
00000
2011年12月
目录
一、设计任务及要求····················1
二、总体框图··························1
三、选择器件··························2
四、功能模块··························2
五、总体设计电路图····················9
字符发生器
一、设计任务及要求:
1.利用实验箱上的16*16点阵,设计字符发生器,可以显示字符“千里之行,始于足下”。
要求能够连续显示一行字,在实验箱上验证设计结果,要求写出完整的设计报告,并附有每个字的VHDL程序及字库图形。
2.基本要求:
实现字符自动轮换显示。
二、总体框图
74LS161计数器
设计思路:
此电路由十六进制计数器,ROM存储器,地址计数器和分频器这四部分构成。
地址计数器的作用是在时钟clk的作用下将从ROM中读出的信号对应正确的写在16*16的点阵上。
十六进制计数器是在addr[7..0]输出0-15的循环计数,由此输出与ADDRESS1的输出addr[3..0]共同作为rom的输入地址,以此决定q[15..0]的输出(即ADDRESS1的DIN[15..0]的输入),此十六进制计数器是由74LS161十六进制计数器得来的。
Rom是一个用来存储数据的具有读写功能的的存储器,在此电路中的作用是存储“千里之行,始于足下”这八个字和“,”。
在addr[7..0]输入相应的地址时读取rom中的相应的数据,然后在输出端q[15..0]输出。
分频器的作用是将一个时钟脉冲信号的频率分开来,分别给与放大,然后送到地址计数器和rom的控制端。
在时钟脉冲的作用下,地址计数器计数,ROM相对应的地址单元中的代码输出,以驱动列选通线产生电路。
地址计数器同时又为行选通线产生电路。
地址随着地址计数器计数值的变化,发光二极管显示屏逐行扫描,在16*16的点阵显示屏上显示出字符或图案。
各模块功能:
1)ROM是只读存储器存放字符的代码,它是字符显示器的核心部件。
2)发光二极管显示屏用来显示字符或图案,它是由若干发光二极管组成的16*16点阵式显示屏。
3)地址计数器的作用是在时钟clk的作用下将从ROM256x16中读出的信号对应正确的写在16*16的点阵上。
4)74LS161是一个异步清零,同步置数的十六进制计数器。
三、选择器选择
1、配有QuartusII6.0软件的计算机一台。
2、下载接口是数字芯片的下载接口,主要用于FPGA芯片的数据下载。
3、EDA实验箱,其中配有16*16点阵的显示屏。
4、导线若干。
四、功能模块
1.74LS161计数器
(1)74LS161器件图
74LS161是同步置数异步清零的十六进制计数器。
其中,A、B、C、D为输入端;LDN为同步置数端;ENT与ENP为使能控制端;CLRN为异步清零端;RCO为进位输出端;QA.QB.QC.QD为输出端;CLK为脉冲信号输入端。
(2)74LS161功能表
输入
输出
CLR(非)LOAD(非)ENTENP
CP
0XXX
10XX
1111
110X
11X0
X
↑
↑
X
X
异步清零
同步预置
计数
保持
保持
(5)74LS161十六进制计数器构成九进制计数器的电路图
2、ADDRESS模块
(1)ADDRESSVHDL程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityaddressis
port(clk,reset:
instd_logic;
din:
instd_logic_vector(15downto0);
ad:
outstd_logic_vector(3downto0);
qout:
outstd_logic_vector(15downto0));
endaddress;
architectureaofaddressis
begin
process(clk,din,reset)
variableQ1:
std_logic_vector(3downto0):
="0000";
begin
ifclk'eventandclk='1'then
ifreset='0'or(Q1="1111")then
Q1:
="0000";
else
Q1:
=Q1+1;
ad<=Q1;
endif;
endif;
qout<=din;
endprocess;
enda;
(2)address.vhdl编译生成的逻辑符号
说明:
clk为时钟输入端口;reset为复位端;din[15..0]为接受ROM数据信号端口;ad[3..0]为片选地址输出;qout[15..0]为高八位短驱动和低八位短驱动.
(3)模块功能:
地址选择器包含行选线产生电路和列选线产生电路,从ROM中选择相应的地址输出。
clk为扫描时钟脉冲,控制扫描速度的快慢;RESET为复位端,只有在RESET为高电平的情况下,在脉冲上升沿到来时,ad计数,其中ad[3..0]输出扫描驱动信号,接入扫描片选端,依次选中LED点阵的各列,din输入字符存储器中每个存储单元的数据,qout[15..0]控制LED点阵的高八位和LED点阵的低八位,din中存储器中调用的数据模块由qout[15..0]输出,在LED点阵中经扫描显示字符。
(4)addres仿真图:
3、分频器divvhdl程序、模块功能及仿真图
(1)div分频器VHDL程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydivis
port(clk:
Instd_logic;
clkout:
outstd_logic);
enddiv;
architectureoneofdivis
begin
process(clk)
variablecnt:
integerrange0to10;
variabletmp:
std_logic;
begin
ifclk'eventandclk='1'then
ifcnt>=9then
cnt:
=0;
tmp:
=nottmp;
else
cnt:
=cnt+1;
endif;
endif;
clkout<=tmp;
endprocess;
endone;
(2)divvhdl编译生成的逻辑符号
Div的逻辑功能:
将一个时钟脉冲信号的频率分开来,分别给与放大,然后送到address和rom的控制端clock。
(3)div分频器仿真图:
3.用来存储字符的ROM256X16存储器
(1)在设计ROM时,根据ROM的大小,可以采用不同的设计方法进行设计,比如4*8,8*8,256*16或256*8的ROM可以采用数组描WHEN—ELSE,然而数组描述ROM在面积上是最有效的,在用数组描述时常把数组常量的ROM放在一个程序包中,这种方法可以提供ROM的重用,在程序包中应当用常量定义ROM的大小。
而用WHEN—ELSE描述一个ROM,它确实是最直观的,是类似查表得方法来设计的。
(2)存入ROM中的数据(文本格式.mif)
(ROM256X16.MIF
千:
001000F83F00010001000104FFFE010001000100010001000100010001000000
里:
3FF82108210821083FF8210821083FF8010001003FF8010001000100FFFE0000
之:
0200010000887FFC0008001000200040
00800100060018002800E70040FE0000
行:
08001C0031FC400088000C001BFE302050209020102010201020102010A01040
:
0000000000000000000000000000000000000000000030003000100020000000
始:
1020183010201048FC8425FE2484440044FC288418841484228442FC80840000
于:
00003FFC0100010001000100FFFE010001000100010001000100090005000200
足:
00001FF01010101010101FF011100100090009F8090009001500230040FE8000
下:
00047FFE01000100010001C00160013001200100010001000100010001000000
(3)rom生成的256*16逻辑符号
五、总体设计电路
(1)工作情况:
74LS161十六进制计数器,在输入clk1的作用下在输出端输出0000-1001的地址数据,即为九进制。
九进制输出的地址数据与ADDRESS1的输出addr[3..0]共同作为了存储器ROM的地址输入。
此输入地址选定了存储器中在该地址上存储的数据。
然后将数据在存储器的输出端q[15..0]输出。
存储器的输出作用下输出的addr[3..0]决定了输出结果在16*16的点阵上列循环扫描。
而addr0则决定着输出在16*16的点阵上的行扫描,也即输出时在低位(lout)还是在高位(hout)。
总体上说来就是计数器提供部分地址,div是一个分频器,而ROM是一个字符的存储库,ADDRESS1则是决定着要输出的字符如何在16×16的点阵上扫描输出。
(2)模块间的连接关系:
计数器的输出连接在ROM256×16的地址输入端,ROM256×16的输出q[15..0]连接在ADDRESS1的din[15..0]端。
ADDRESS1的输出addr[3..0]又回到了ROM256×16的地址输入端。
(3)时序仿真结果:
(4)管脚分布图:
(5)实验效果图
(6)仿真分析:
仿真分析:
RESET接低电平;当时钟脉冲信号来时,地址输出由“0000”逐步变为“1111”,qout由0000000000000000开始得到相应的变化,由此可推断模拟结果符合设计要求。
(7)实验连线
将试验箱上的clk与I03连接,然后打开试验箱开关,进行下载。
试验完成后就会在试验箱的16*16的点阵屏上显示“千里之行,始于足下”。
六、心得体会
通过这次课程设计我感触很深,受益良多。
这是我入大学以来第一次做课程设计,从开始的陌生和无从下手到最后的成功其中是忙碌的的,在这两星期的日子里学到了很多东西,自己也摸索出了很多东西,也巩固了这个学期所学的东西,同时也学到了书本上没有的知识。
这次试课程设计使我懂的了理论与实践的相结合是很重要的。
理论是实践的基础。
只有理论知识是不够的,应该把所学的理论知识应用到实践中。
在实践中验证理论的正确性。
在实践中提高动手能力和独立思考的能力。
总的来说,这次EDA设计的字符发生器虽然没有达到预计的结果但还算成功。
在设计中前前后后遇到了很多问题,但通过在图书馆翻阅资料及老师的辛勤指导下问题也都一个一个的解决了。
在试验箱上出来结果哪一刹那,我忍不住心中的喜悦,这是人生的为数不多的历练。
实际的感受到了知识的实用性。
非常感谢这次的课程。
非常感谢学院能给我们提供这样的一个可以自己动脑、动手进行设计的机会,同时也大大加强了同学之间的沟通,以及学生与老师之间的交流,这是一个放飞自我的平台,也是我们理想与实际结合的升华,我想学院给我们提供的这些,教会我们的这些不仅仅在现在有用,对于我们今后步入社会也是同样有用的。
在这次课程设计中有许多老师和同学对我给予了很大的帮助,最后向他们表示衷心的感谢!