EDA实验报告.docx
《EDA实验报告.docx》由会员分享,可在线阅读,更多相关《EDA实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
EDA实验报告
EDA实验报告
班级:
学号:
姓名:
实验一:
数码管显示
一、实验目的及要求:
1、实验目的:
1)学习QuartusⅡ的基本操作;
2)熟悉教学实验箱的使用;
3)学习七段数码显示译码器设计;
4)掌握LED显示器的工作原理;
5)学习VHDL的CASE语句应用及多层次设计方法。
2、实验要求:
1)用VHDL语言进行描写;
2)在QuartusⅡ平台上仿真;
3)严格按照实验流程进行;
4)管脚映射按芯片要求进行,在数码管上静态显示译码数字。
5)查看资料,描述其工作原理。
二、实验原理:
1、BCD段显示译码器:
LED数码显示器是数字系统实验里面经常使用的一种显示器件,因为它经常显示的是十进制或十六进制的数,所以我们就要对实验里面所用到的二进制数进行译码,将它们转换成十进制的或是十六进制的数。
LED数码显示器分为共阴和共阳两种,本实验使用的是共阴的连接,高电平有效。
输入信号为D0,D1,D2,D3,相应的输出8段为a、b、c、d、e、f、g。
它们的关系表格如右所示:
有了真值表,我们便可以编写程序了。
图1:
七段译码器真值表
下图为译码器逻辑图,请按图进行连线。
其中A,B,C,D接拨号开关,a,b,c,d,e,f,g和使能端EN(高电平工作)接数码显示接口,管脚映射均为I/O口,映射后,通过拨号开关改变输入二进制码,则输出数码管上显示相应的数值。
在实验中要注意显示器上面每一段LED要和程序里面的对应。
图2:
七段译码器逻辑图
三、实验方法和步骤:
基本的操作在第一部分的实验方法和步骤中已经讲解了,这里不再赘述,遇到不同的状况时我们应该多多查找资料、寻问老师或同学,努力找到答案。
1、编程思路:
BCD七段显示译码器:
由于第一部分在语法规则上已经讲解过了,这里也就不再赘述,只是简单说一下自己的编程思路。
首先应该明确输入输出,这里我们输入的是4位变量data_in,输出的是7位变量data_out,同时还有一个高电平有效的使能信号EN。
结构体部分,采用进程,敏感信号是输入data_in和使能EN,当EN为高电平时,分情况讨论data_in,这里很容易就想到了用case语句,输出data_out的七位实际上对应了数码管的a、b、c、d、e、f、g,只要判断输入是什么,将真值表中对应的输出赋值给data_out就可以了。
记住最后的几个end,不能漏掉了。
2、调试过程及仿真结果:
BCD七段显示译码器:
本程序将为简单,调试过程基本没有遇到问题。
仿真波形如下:
图3:
七段译码器仿真波形
3、VHDL源程序:
BCD七段显示译码器:
Libraryieee;
Useieee.std_logic_1164.all;
EntityBCD1is
port(data_in:
instd_logic_vector(3downto0);
EN:
instd_logic;
data_out:
outstd_logic_vector(6downto0));
endBCD1;
ArchitectureoneofBCD1is
begin
process(data_in,EN)
begin
ifEN='1'then
casedata_inis
when"0000"=>data_out<="1111110";--0
when"0001"=>data_out<="0110000";--1
when"0010"=>data_out<="1101101";--2
when"0011"=>data_out<="1111001";--3
when"0100"=>data_out<="0110011";--4
when"0101"=>data_out<="1011011";--5
when"0110"=>data_out<="1011111";--6
when"0111"=>data_out<="1110000";--7
when"1000"=>data_out<="1111111";--8
when"1001"=>data_out<="1111011";--9
when"1010"=>data_out<="1110111";--A
when"1011"=>data_out<="0011111";--B
when"1100"=>data_out<="1001110";--C
when"1101"=>data_out<="0111101";--D
when"1110"=>data_out<="1001111";--E
when"1111"=>data_out<="1000111";--F
whenothers=>data_out<=NULL;
endcase;
endif;
endprocess;
endone;
四、实验总结:
刚拿到这个题目的时候觉得挺难的,因为想到自己要用程序去操控数码管,虽然说数码管以前接触的也很多,但还是不免有些担忧显示的问题,而且自己也发现很多同学都有这样的毛病,就是程序下载到FPGA里面后,发现显示的并不是自己想要的结果,通常会是乱码,这个时候同学们首先想到的不是检查自己的程序或者是电路,而是去怀疑硬件,总觉得自己做不出来很可能是数码管坏了,芯片坏了或者是哪一根线没有接通等等。
通过几次实验我总结出,其实硬件坏的几率很小很小,特别是相比较我们人的判断能力,通常情况下都是我们自己程序的毛病或者是哪一根线接错了导致结果出不来。
所以,实验不仅仅是补充了很多课本之外的知识,锻炼了我们实际动手能力,同时也考验了我们的耐心和毅力,一个弄科研的人,很重要的一点就是要不断尝试不怕失败不畏困难。
我觉得我在这几次实验中还是体会到了这一点的,特别是第三次实验,花了很大的功夫和精力去研究去探索,几经周折才在最后的时间里完成了任务,也达到了自己想要的效果,很开心很满意。
实验二:
键盘扫描
一、实验目的及要求:
1、实验目的:
6)学习QuartusⅡ的基本操作;
7)熟悉教学实验箱的使用;
8)掌握4*4键盘的工作原理。
2、实验要求:
1)完成键盘扫描的VHDL设计;
2)在实验板上面键盘扫描控制8位数码管显示的功能。
二、实验原理:
1、4×4矩阵键盘的工作原理
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
图1为矩阵键盘电路图:
图1矩阵键盘电路
图2按键排列
2、八位七段数码管显示模块:
八位七段数码管是电子开发过程中常用的输出显示设备。
在实验系统中使用的是两个四位一体、共阴极型七段数码管。
由于七段数码管公共端连接到GND(共阴极型),当数码管的中的那一个段被输入高电平,则相应的这一段被点亮。
反之则不亮。
共阳极性的数码管与之相么。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
其单个静态数码管如下图3所示,数码管显示模块的电路原理如图4所示。
图3静态七段数码管
图4数码管显示电路原理
三、实验方法和步骤:
基本的操作在第一部分的实验方法和步骤中已经讲解了,这里不再赘述,遇到不同的状况时我们应该多多查找资料、寻问老师或同学,努力找到答案。
1、编程思路:
因为这个程序是老师给的,也就没有什么编程思路了。
2、VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitykeyscanis
port(clk:
instd_logic;--ClockSignal
kr:
inoutstd_logic_vector(3downto0);--RowofKeyScan
kc:
inoutstd_logic_vector(3downto0);--ColumeofKeyScan
a,b,c,d,e,f,g:
outstd_logic;--7segmentdriver
sa,sb,sc:
outstd_logic);--DisplaySelect
endkeyscan;
architecturebehaveofkeyscanis
signaldisplay:
std_logic_vector(6downto0);
signaldcount:
std_logic_vector(2downto0);
signalkeyr,keyc:
std_logic_vector(3downto0);
signalkcount:
std_logic_vector(2downto0);
signalkflag1,kflag2:
std_logic;
signalbuff0,buff1,buff2,buff3,buff4,buff5,buff6,buff7:
std_logic_vector(6downto0);
begin
process(clk)--Inthisprocess,twocountswillaccumulate
begin
if(clk'eventandclk='1')then
dcount<=dcount+1;
kcount<=kcount+1;
endif;
endprocess;
process(clk)--Inthisprocess,themaintaskistoscankeyboard
begin
if(clk'eventandclk='1')then
if(kcount=0)then
kr<="1111";
kc<="0000";
elsif(kcount=1)then
keyr<=kr;kr<="ZZZZ";
elsif(kcount=2)then
kr<="0000";
kc<="1111";
elsif(kcount=3)then
keyc<=kc;kc<="ZZZZ";
endif;
endif;
endprocess;
process(clk)--changethekeyflags
begin
if(clk'eventandclk='1')then
if(kcount=4andkeyr="1111")then
kflag1<='0';
elsif(kcount=4)then
kflag1<='1';
endif;
kflag2<=kflag1;
endif;
endprocess;
process(clk)--shiftthedisplays
begin
if(clk'eventandclk='1')then
if(kcount=5andkflag1='1'andkflag2='0')then
buff0<=buff1;
buff1<=buff2;
buff2<=buff3;
buff3<=buff4;
buff4<=buff5;
buff5<=buff6;
buff6<=buff7;
endif;
endif;
endprocess;
process(clk)--gettheresultofthekey
begin
if(clk'eventandclk='1')then
if(kcount=5)then
if(keyr="1110")then
casekeycis
when"1110"=>buff7<="0111111";--display0
when"1101"=>buff7<="0000110";--display1
when"1011"=>buff7<="1011011";--display2
when"0111"=>buff7<="1001111";--display3
whenothers=>buff7<=buff7;--nochange
endcase;
elsif(keyr="1101")then
casekeycis
when"1110"=>buff7<="1100110";--display4
when"1101"=>buff7<="1101101";--display5
when"1011"=>buff7<="1111101";--display6
when"0111"=>buff7<="0000111";--display7
whenothers=>buff7<=buff7;--nochange
endcase;
elsif(keyr="1011")then
casekeycis
when"1110"=>buff7<="1111111";--display8
when"1101"=>buff7<="1101111";--display9
when"1011"=>buff7<="1110111";--displaya
when"0111"=>buff7<="1111100";--displayb
whenothers=>buff7<=buff7;--nochange
endcase;
elsif(keyr="0111")then
casekeycis
when"1110"=>buff7<="0111001";--displayc
when"1101"=>buff7<="1011110";--displayd
when"1011"=>buff7<="1111001";--displaye
when"0111"=>buff7<="1110001";--displayf
whenothers=>buff7<=buff7;--nochange
endcase;
endif;
endif;
endif;
endprocess;
process(clk)--displayprocess
begin
if(clk'eventandclk='1')then
sa<=dcount(0);
sb<=dcount
(1);
sc<=dcount
(2);
casedcountis
when"111"=>display<=buff0;
when"000"=>display<=buff1;
when"001"=>display<=buff2;
when"010"=>display<=buff3;
when"011"=>display<=buff4;
when"100"=>display<=buff5;
when"101"=>display<=buff6;
when"110"=>display<=buff7;
whenothers=>display<="0000000";
endcase;
endif;
endprocess;
process(clk)--Inthisprocess,a,b,c,d,e,f,gwilloutput
begin
if(clk'eventandclk='1')then
a<=display(0);
b<=display
(1);
c<=display
(2);
d<=display(3);
e<=display(4);
f<=display(5);
g<=display(6);
endif;
endprocess;
endbehave;
四、实验总结:
这次实验的程序虽然是老师给的,但我还时学到了学到很多的东西。
因为如果能看懂那个程序,我觉得对VHDL已经掌握的差不多了,同时它也让我学到了很多在书本上所没有的知识。
在调程序的时候还是遇到了一些问题,譬如:
虽然数码管可以显示,可是按键按下去后,有些数码管会显示乱码,后来才发现原来是引脚连接错误,所以有的时候细节是很重要的,必须要注意数码管的连接顺序。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
总的来说,这次试验还是让我获益匪浅。
实验三:
原理图设计
一、实验目的及要求:
1、实验目的:
9)学习QuartusⅡ的基本操作;
10)熟悉教学实验箱的使用;
11)设计一个半加器和一个全加器;
12)初步掌握原理图的设计输入,编译,仿真和调试过程。
2、实验要求:
1)完成半加器、全加器的原理图;
2)在QuartusⅡ平台上仿真;
3)在实验板上面实现半加器、全加器的功能。
二、实验原理:
1、半加器原理:
半加器是实现两个数相加的基础部分,它的真值表如右所示,所谓半加器,意思是没有来自低位的进位,输入是加数和被加数,输出进位以及和。
由真值表我们图1:
半加器真值表及实现电路
可以得到输出与输入之间的关系,即:
s0=a0xorb0,c1=a0andb0。
根据上面得到的结果便可以利用原理图输入的方法实现半加器了,这会在后面叙述。
2、全加器原理:
全加器的真值表如右,与半加器不同的是,它还有一个来自低位的进位,这样就构成了三个输入,分析知,全加器可通过半加器实现,电路如右,由此我们可以想到,可将前面做出
的半加器封装成器件,图2:
全加器真值表及实现电路
这样利用两个半加器和一个或门就可以实现全加器了。
三、实验步骤:
在这里用原理图输入设计方法完成1位全加器的设计。
1位全加器可以用两个半加器及一个或门连接而成,因此需要首先完成半加器的设计。
下面将给出使用原理图输入的方法进行底层元件设计和层次化设计的主要步骤。
1)为本项工程设计建立文件夹
a)在windows界面双击QuartusⅡ图标进入QuartusⅡ环境;
b)单击File菜单下的NewProjectWizard:
Introduction按照向导里面的介绍新建一个工程并把它保存到自己的路径下面;
2)输入设计项目和存盘
原理图编辑输入流程如下:
a)单击File菜单下的New,在弹出的New对话框中选择DeviceDesignFiles页的原理图文件编辑输入项BlockDiagram/SchematicFile,单击OK后将打开原理图编辑窗口。
b)在编辑窗口中的任何一个位置上右击鼠标,将出现快捷菜单,选择其中的输入元件项Insert→Symbol,于是将弹出输入元件的对话框。
c)单击按钮“…”,(假设QuartusⅡ安装在E盘的altera文件夹)找到基本元件库路径e:
\altera\90sp2\quartus\libraries\primitives\logic项,选中需要的元件,单击“打开”按钮,此元件即显示在窗口中,然后单击Symbol窗口的OK按钮,即可将元件调入原理图编辑窗口中。
例如为了设计半加器,需分别调入元件and2、not、xnor和输入输出引脚input和output,并如图3所示用单击拖动的方法连接好电路。
然后分别在input和output的PINNAME双击使其变黑色,再用键盘分别输入各引脚名:
a、b、co和so。
图3
3)将设计项目设置成可调用的元件
为了构成全加器的顶层设计,必须将以上设计的半加器half_adder.bdf设置成可调用的元件。
方法如下,在打开半加器原理图文件half_adder.bdf的情况下,选择菜单File→Create/Update→CreateSymbolFilesforCurrentFile项,即可将当前文件half_adder.bdf变成一个元件符号存盘,以待在高层次设计中调用。
转换中需要注意以下两点:
a)转换好的元件必须存在当前工程的的路径文件夹中。
b)按上述方式进行转换,只能针对被打开的当前文件。
4)设计全加器顶层文件
为了建立全加器的顶层文件,必须再打开一个原理图编辑窗口,方法同前。
在新打开的原理图编辑窗口双击鼠标,调出元件half_adder,并按图4连接好全加器电路图。
以full_adder.bdf为名将此全加器设置存在同一路径的文件夹中。
图4
五、实验结果
调试过程及仿真结果:
1、半加器:
半加器编译中没有遇到错误。
有了前面的经验,后面的仿真也都简单多了,下面是半加器的仿真:
图1-8:
半加器仿真波形(输入为格雷码)
2、全加器:
全加器是在半加器的基础上建立的,在仿真的时候老是提示错误不能仿真,错误说是没有激励文件,于是还是上网查询了一下,发现还得自己修改激励文件,修改了之后仿真波形就出来了。
5
图1-9:
全加器仿真波形(输入为格雷码)
四、实验总结:
第一次实验的感觉总是匆匆忙忙的,因为要学习的东西太多了,不懂的东西也太多了,但却也是收获最大的,几个小时的时间里,我必须学会如何良好使用QuartusⅡ这个陌生的软件(当然现在已经很熟练了),如何去编写VHDL这个以前从未接触的陌生语言,如何去操控好我们复杂的实验箱,过程虽然有点艰难,但却掩盖不了实验后的愉悦与欣慰。
FPGA芯片对于我来说也是个陌生的器件,它虽然小但引脚很多,第一次实验之后,我又在思考,FPGA相对于单片机来说有些什么好处呢,同样是编写程序下载到芯片内部运行,二者有些什么区别呢,查询了一下,发现FPGA的优势特别明显,而且是未来发展的趋势,它相对于单片机主要有下列优势:
1)FPGA运行速度快
2)FPGA管脚多,容易实现大规模系统
3)FPGA内部程序并行运行,有处理更复杂功能的能力
4)FPGA有大量软核,可以方便进行二次开发
看到这些优势,就好像觉得自己又找到了一块钻石,可以好好仔细研究研究了,还去图书馆借阅了几本这方面的书。
总之,自己在实验中受益匪浅,并且激发了很大的兴趣,希望以后还能在这一方面有所锻炼有所研究。