vhdl实验报告16乘16点阵字选.docx
《vhdl实验报告16乘16点阵字选.docx》由会员分享,可在线阅读,更多相关《vhdl实验报告16乘16点阵字选.docx(13页珍藏版)》请在冰豆网上搜索。
![vhdl实验报告16乘16点阵字选.docx](https://file1.bdocx.com/fileroot1/2023-2/21/e710826f-b43b-425c-b574-0543e95a10dd/e710826f-b43b-425c-b574-0543e95a10dd1.gif)
vhdl实验报告16乘16点阵字选
综合实践总结报告
综合实践名称:
EDA技术与实践
综合实践地点、时间
题目功能分析和设计
实验的要求有如下三点:
1.用16*16点阵的发光二极管显示字符;
2.可显示字符为0~9的数字字符与A~F英文字母的大写;
3.输入为四位二进制矢量;
按照要求可知,LED点阵模块,共由16×16=256个LED发光二极管组成,如何在该点阵模块上显示数字和字母是本实验的关键。
先将要显示的每一幅图像画在一个16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布
以数字8为例,点阵分布为:
0000000000000000
0000000000000000
0001111111111000
0001111111111000
0001100000011000
0001100000011000
0001100000011000
0001111111111000
0001111111111000
0001100000011000
0001100000011000
0001100000011000
0001111111111000
0001111111111000
0000000000000000
0000000000000000
考虑到实际物理实验平台上点阵发光二极管的原理,以下为16×16点阵LED外观图,只要其对应的X、Y轴顺向偏压,即可使LED发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
所以我采用行列扫描的方法,用四位二进制数做列选信号(总共16列),如选中第一列,则扫描第一列之中哪些行是高电平
(1),哪些行是低电平(0);为高电平的则点亮,为低电平的不亮。
(列信号都接地)。
如此,列选信号由“0000”变到“1111”时,16列扫描完毕,一个字也就出来了,列选信号重新由“0000”开始扫描。
注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。
再者,就是字变换的问题。
题目要求可显示字符为0~9的数字字符与A~F英文字母的大写;16个字正好用四位二进制表示,字选信号。
每个字选信号对应一个0到9,A到F中的一个字模(像前面列出的8的字模一样)。
通常情况下是1s变一个字符,但我在实验时考虑到仿真的问题,将字选信号的变化周期缩小很多,以便仿真。
要注意的是,列选信号变化频率一定是比字选信号大得多的。
一.总体模块划分
1.字选模块
输入为一个时钟信号,输出为4位二进制(用xuan表示)字选信号,用来顺序输出题目要求的16个字。
因为设计采用字选模块和列选模块使用同一个输入时钟脉冲,但是字选信号的变化频率比列选信号要小得多。
所以该模块中还应该设置一个计数器,计数器满,则Q加1,即变向下一个字,同时计数器重新置零。
2.列选模块
输入为一个时钟信号,输出为4位二进制(用sel表示)列选信号,用来选中列,进行扫描。
3.显示模块
输入为字选信号和列选信号,输出为16位二进制,用来表示一列,该列中的1的位置就表示亮灯的位置,0的位置表示不亮。
每扫描一列就输出一列,看该列中哪些行是1,哪些行是0。
该模块应该包含0~9,A~F这16个字模。
4.顶层模块
该模块采用图形模式(.gdf),将所有的模块按要求合理连接起来后,再添加上顶层的输入输出信号。
附顶层图:
二.代码实现
1.顶层模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdianzhenIS
PORT(k1,clk,reg,red,RES:
INSTD_LOGIC;
SEL:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));
ENDDIANZHEN;
ARCHITECTUREAOFDIANZHENIS
COMPONENTXUANZI
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTXUANZ
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTXUA
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTXU
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTXUS
PORT(red,REG:
INSTD_LOGIC;
ZI,si,MI,NI:
inSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTLIEXUAN
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTXIANSHI
PORT(
res:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
SEL:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0)
);
ENDCOMPONENT;
SIGNALZI_DAOUT,SI_DAOUT,MI_DAOUT,NI_DAOUT,XUAN_DAOUT,SEL_DAOUT:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
SEL<=SEL_DAOUT;
U1:
XUANZIPORTMAP(CLK=>CLK,
Q=>ZI_DAOUT);
U2:
XUANZPORTMAP(CLK=>CLK,
Q=>SI_DAOUT);
U3:
XUAPORTMAP(CLK=>CLK,
Q=>MI_DAOUT);
U4:
XUPORTMAP(CLK=>CLK,
Q=>NI_DAOUT);
U5:
XUSPORTMAP(REG=>REG,
RED=>RED,
ZI=>ZI_DAOUT,
SI=>SI_DAOUT,
MI=>MI_DAOUT,
NI=>NI_DAOUT,
Q=>XUAN_DAOUT);
U6:
LIEXUANPORTMAP(CLK=>CLK,
Q=>SEL_DAOUT
);
U7:
XIANSHIPORTMAP(RES=>RES,
SEL=>SEL_DAOUT,
XUAN=>XUAN_DAOUT,
Q=>Q);
ENDA;
2.字选模块:
四种环节
字选中间选择环节xus:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXUSIS
PORT(red,REG:
INSTD_LOGIC;
ZI,si,MI,NI:
inSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDENTITYXUS;
ARCHITECTUREAOFXUSIS
BEGIN
PROCESS(zi,si,red)
BEGIN
CASEredIS
WHEN'0'=>
CASEregIS
WHEN'0'=>
Q<=zi;
WHEN'1'=>
Q<=si;
ENDCASE;
WHEN'1'=>
CASEregIS
WHEN'0'=>
Q<=mi;
WHEN'1'=>
Q<=ni;
ENDCASE;
ENDCASE;
ENDPROCESS;
ENDA;
(1)情况‘1’:
zi+1循环
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXUANZIIS
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDENTITYXUANZI;
ARCHITECTUREXZOFXUANZIIS
BEGIN
PROCESS(CLK)
VARIABLECOUNT:
INTEGERRANGE1600DOWNTO0;
VARIABLEZI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCOUNT=1600THEN
IFzi="1111"THEN
zi:
="0000";
ELSE
zi:
=zi+1;
ENDIF;
COUNT:
=0;
ELSE
COUNT:
=COUNT+1;
ENDIF;
ENDIF;
Q<=zi;
ENDPROCESS;
ENDARCHITECTUREXZ;
(2)情况‘2’SI:
-1循环
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXUANZIS
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDENTITYXUANZ;
ARCHITECTUREXZOFXUANZIS
BEGIN
PROCESS(CLK)
VARIABLECOUNT:
INTEGERRANGE1600DOWNTO0;
VARIABLEZI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCOUNT=1600THEN
IFzi="0000"THEN
zi:
="1111";
ELSE
zi:
=zi-1;
ENDIF;
COUNT:
=0;
ELSE
COUNT:
=COUNT+1;
ENDIF;
ENDIF;
Q<=zi;
ENDPROCESS;
ENDARCHITECTUREXZ;
(3)情况‘3’MI:
+2循环
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXUAIS
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDENTITYXUA;
ARCHITECTUREXZOFXUAIS
BEGIN
PROCESS(CLK)
VARIABLECOUNT:
INTEGERRANGE1600DOWNTO0;
VARIABLEZI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCOUNT=1600THEN
IFzi="1111"THEN
zi:
="0001";
ELSE
zi:
=zi+2;
ENDIF;
COUNT:
=0;
ELSE
COUNT:
=COUNT+1;
ENDIF;
ENDIF;
Q<=zi;
ENDPROCESS;
ENDARCHITECTUREXZ;
(4)情况‘4’NI:
-2循环
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXUIS
PORT(CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDENTITYXU;
ARCHITECTUREXZOFXUIS
BEGIN
PROCESS(CLK)
VARIABLECOUNT:
INTEGERRANGE1600DOWNTO0;
VARIABLEZI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCOUNT=1600THEN
IFzi="0001"THEN
zi:
="1111";
ELSE
zi:
=zi-2;
ENDIF;
COUNT:
=0;
ELSE
COUNT:
=COUNT+1;
ENDIF;
ENDIF;
Q<=zi;
ENDPROCESS;
ENDARCHITECTUREXZ;
三.仿真结果
这里只仿真顶层模块。
由仿真结果可以看出,设计完全符合要求。
四.心得与体会
通过这次大作业,我深深地感受到,要把知识真正掌握到手里,在理论的基础上,还必须要有更深一步的实践。
通过大作业的实践,把那些书本上的知识点都运用起来,去真正地做点东西出来,远比死记硬背理论知识更有意义。
从刚开始的毫无头绪,无从下手,到之后积极查找资料,与组员讨论,再到后来着手设计,划分模块,编写代码,编译仿真,纠错反思。
这样一步步脚踏实地迈向成功的感觉真的不错。
以后,我会继续用VHDL去做一些自己感兴趣的东西,慢慢积累,慢慢地争取往更高的目标发展。