EDA实验五学号计数器的设计与仿真.docx
《EDA实验五学号计数器的设计与仿真.docx》由会员分享,可在线阅读,更多相关《EDA实验五学号计数器的设计与仿真.docx(12页珍藏版)》请在冰豆网上搜索。
EDA实验五学号计数器的设计与仿真
EDA实验五学号计数器的设计与仿真
一、实验目的:
了解计数器的设计原理和方法,并且学会用数码管显示
二、实验内容:
本实验内容是:
在QuartusII平台上,利用VHDL代码实现学号230计数器的设计,并在三位数码管显示出来。
三、实验方法:
实验方法:
采用基于FPGA进行数字逻辑电路设计的方法。
采用的软件工具是QuartusII软件仿真平台,采用的硬件平台是AlteraEPF10K20TI144_4的FPGA试验箱。
实验步骤:
1、编辑源文件。
打开QuartusII软件平台,建立工程文件夹,工程所在文件夹名字为xuehao_230。
然后编辑源文件,保存,文件名与工程文件夹名一致。
2、按照实验箱上FPGA的芯片名更改编程芯片的设置。
操作是点击Assign/Device,选取芯片的类型。
3、编译与调试。
确定状态图文件为当前工程文件,点击Complier进行文件编译。
编译结果有错误或警告,则将要调试修改直至文件编译成功。
4、波形仿真及验证。
在编译成功后,点击Waveform开始设计波形。
点击“insertthenode”,按照程序所述引脚,任意设置各输入节点的输入波形…点击保存按钮保存。
5、FPGA芯片编程及验证,应记录实验结果进行分析。
四、实验具体步骤与过程分析
1、建立工程。
打开QuartusII软件平台,点击File---〉newprojectwizard建立一个工程xuehao_230,工程所在文件夹名字为xuehao_230,设置顶层实体名称为xuehao_230,点击next设置device,按照实验箱上FPGA的芯片名更改编程芯片的设置。
2、添加VHDL文件。
在所在工程添加文件cnt10.vhd(十进制计数器),cnt_xuehao.vhd(230进制计数器),scan_led3_vhd.vhd(三位数码管显示),exp_cnt_xuehao230_7seg.vhd(数码管显示230三位学号计数器)四个文件。
这里通过老师给出的代码进行修改且理解:
cnt10.vhd如下:
分析:
这是十进制计数器的VHDL代码设计,因为十进制有十个状态,所以输入数据和输出状态需要四位宽,其中输入端口有aclr清零端,clock时钟信号,cnt_en使能端,data[3..0]数据输入,sload装载使能,当aclr为高电平有效时,输出清零,从0开始,计数为时钟信号clock的上升沿到来时且使能端cnt_en为高电平有效时自动加1(sload为低电平时),如果装载使能sload为高电平有效时,则装载数据data[3..0],输出端口有两个,分别为cout(当q[3..0]为9时输出为高电平),q[3..0]变化为0—9循环变化。
cnt_xuehao.vhd如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
LIBRARYlpm;
USElpm.all;
entitycnt_xuehaois
port(aclr,clock,cnt_en,sload:
instd_logic;
datab,datas,datag:
instd_logic_vector(3downto0);
cout:
outstd_logic;
qb,qs,qg:
outstd_logic_vector(3downto0));
endcnt_xuehao;
architectureaofcnt_xuehaois
componentcnt10IS
PORT(
aclr:
INSTD_LOGIC;
clock:
INSTD_LOGIC;
cnt_en:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(3DOWNTO0);
sload:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDcomponent;
signalregb,regs,regg:
std_logic_vector(3downto0);
signallkaclr,couts,coutg:
std_logic;
begin
cntb:
cnt10portmap(aclr=>(lkaclroraclr),clock=>clock,cnt_en=>(coutsandcoutg),data=>datab,sload=>sload,q=>regb);
cnts:
cnt10portmap(aclr=>(lkaclroraclr),clock=>clock,cnt_en=>coutg,data=>datas,sload=>sload,cout=>couts,q=>regs);
cntg:
cnt10portmap(aclr=>(lkaclroraclr),clock=>clock,cnt_en=>cnt_en,data=>datag,sload=>sload,cout=>coutg,q=>regg);
lkaclr<='1'when(regb=x"3"andregs=x"6"andregg=x"5")else
'0';
cout<='1'when(regb=x"2"andregs=x"3"andregg=x"0")else
'0';
qb<=regb;
qs<=regs;
qg<=regg;
enda;
分析:
这里是调用cnt_10十进制计数器的元件例化来设计230(学号)计数器。
输入端口aclr(高电平有效清零端),clock(时钟信号上升沿有效),cnt_en(使能端),sload(装载时能,高电平有效时装在输入的数据),datab[3..0],datas[3..0],datag[3..0](三位学号的数据输入端,每位变化相当于一个十进制计数器);输出端口qb[3..0](百位)qs[3..0](十位)qg[3..0](个位)变化为qbqsqg=000到230共231中状态,当等于230时,输出cout为高电平指示达到一个循环。
这里的主要思想是用三次十进制计数器分别生成230计数器的三位。
scan_led3_vhd.vhd如下:
分析:
这里是七段数码管的显示,显示八个数码管中的三个。
输入引脚scan_clk为时钟源,cnt_aclr为清零端,datab[3..0],datas[3..0],datag[3..0]为数据输入,用以显示得到三位十六进制的数,已在数码管上显示出来,输出接口seg7[6..0]用来接七段数码管的abcdefg段,wei[2..0]用来选择八个数码管中的三个来显示输入数据。
exp_cnt_xuehao409_7seg.vhd如下:
分析:
这里是用到元件例化把230计数器和3位数码管结合,达到在七段数码管上显示230计数器的输出的三位。
也是我们实验的最终目的,显示计数器的状态变化。
输入引脚和输出引脚都是上面几个vhd文件的结合,主要有输入接口aclr(高电位清零),clock(计数器时钟信号),scan_clk(数码管时钟源),cnt_en(时能端),sload(装在时能),数据装载输入datab[3..0](百位),datas[3..0](十位),datag[3..0](个位);输出端口cout(当输出状态为408时cout输出为高电平),seg7[6..0](七段数码管的abcdef段),wei[2..0]三位数码管显示。
3、简单编译
这里首先点击左上角files中,选择exp_cnt_xuehao230_7seg.vhd右击选择SetasTop-levelEntity设为为顶层文件,然后键盘按下Ctrl+L进行编译。
提示成功。
4、RTL调试
点击Tools->Netlistviewers->RTLviewer命令查看经软件解释生成的原理图如下:
分析:
如上图由两部分组成,一部分是cnt_xuehao(230计数器),另一部分是scan_led3_vhd(三位数码管),输出端为cout和wei[2..0],seg7[6..0].输入端为aclr(清零命令),clock(计数器时钟信号),cnt_en(使能端),sload(装载使能),数据输入datab[3..0](百位),datas[3..0](十位),datag[3..0](个位),scan_clk(数码管时钟源).
容易验证RTL调试与VHD文件相符。
点击cnt_xuehao部分生成cnt_xuehao的RTL部分如下图:
分析:
如图知道409计数器主要部分是由三个十进制计数器组成的。
与相应的VHDL代码的实现功能是一致的。
5、功能仿真
下面我只对文件cnt_xuehao.vhd进行功能仿真,即对(学号)230计数器进行功能仿真。
首先设置cnt_xuehao.vhd为顶层实体文件(因为之前exp_cnt_xuehao230_7seg.vhd为顶层实体文件)。
然后进行简单编译一次。
a).点击File->New->VectorWaveformFile建立波形文件。
点击“insertthenode”,插入输入端和输出端接口。
b).然后设置输入端colck的周期为10ns;设置datab,datas,datag,qb,qs,qg为ASCII显示;手动设置aclr(清零命令)为低电平,然后在180ns左右设置一小段为高电平以验证清零作用;手动设置cnt_en(使能端)恒为高电平有效;手动设置sload(装载使能)在前一周期为高电平有效,得以第一周期转载输入的数据,接着一个周期后恒为低电平无效,之后只做时钟计数;手动设置输入数据datab,datas,datag均恒为0,然后在第一周期把它们设置为399得以第一周期装载(装载使能sload有效)数据,则计数从399开始。
则初始设置完成,如下图:
保存波形文件为cnt_xuehao.vwf
c)选择ProcessingGenerateFunctionalSimulationNetlist命令,产生功能仿真网表。
d)选择AssignmentsSettings命令,单击SimulatorSettings选项,在右侧的Simulationmode下拉列表中选择Functional项,并指定Simulationinput波形文件为cnt_xuehao.vwf,单击OK按键完成设置
e)选择ProcessingStartSimulation命令,完成功能仿真,仿真结果为:
综上分析,230计数器设计成功,且有清零命令,装载输入功能,自动计数功能。
6、引脚设置与下载测试
a)目标器件选择及管脚分配。
选择菜单AssignmentsPins,然后在分配窗口为输入端和输出端设置管脚。
如图为详细的引脚设置:
b)进行一次全编译后,开始下载验证:
分析:
通过上述验证,得到了实验结论,与验证结果相符。
虽然实验过程中出现了几处错误,但最后都得到解决。
五、实验心得和总结:
这次实验难点较多,但是通过讨论和查阅资料,最后都得到解决。
通过这次实验感觉此次实验最大收获是搞清楚了计数器的功能原理和完全接触到了元件例化的用法。
这次实验对这么多次元件例化的接触,印象很深刻。
还有通过波能仿真的过程也收获很大,在初始化输入端的设置用了很多技巧,得以把计数器的清零功能装载功能和计数功能都仿真出来。