电子信息EDA技术实验指导书.docx
《电子信息EDA技术实验指导书.docx》由会员分享,可在线阅读,更多相关《电子信息EDA技术实验指导书.docx(27页珍藏版)》请在冰豆网上搜索。
电子信息EDA技术实验指导书
EDA技术
实验指导书
适用于电子信息工程专业
QUARTUSII8.1软件的使用
一、实验目的及要求:
1、练习使用QUARTUSII8.1软件,掌握利用该软件进行简单EDA设计的基本流程;
2、完成一个通过拨码开关控制发光二极管亮灭的应用,实验结束后可独立完成思考题。
二、实验环境及器材:
1、微机(已安装授权的QUARTUSII8.1软件)
2、EDA/SOPC实验开发系统
3、USBBlaster下载线一根
三、背景知识及操作流程:
QUARTUSII是ALTERA公司推出的EDA开发工具,其前身为MAXPLUSII,目前实验室安装的版本为8.1,利用该软件可进行对可编程逻辑器件的分析、综合、下载等设计。
EDA/SOPC实验开发系统是由北京百科公司生产的一套EDA实验系统,其核心芯片采用ALTERA公司的CYCLONE系列FPGA产品EP1C6Q240C8,同时配备了丰富的外部接口资源,可供学生进行EDA设计实验。
启动QUARTUS后的界面如图1所示,首先需要创建一个工程,具体操作过程如下:
图1QUARTUS软件的启动界面
(1)点击File–>NewProjectWizard创建一个新工程,系统显示如图2。
图2工程创建向导的启始页
(2)点击Next,为工程选择存储目录、工程名称、顶层实体名等,如图3所示;
(3)点击Next,若目录不存在,系统可能提示创建新目录,如图4所示,点击“是”按钮创建新目录,系统显示如图5所示;
(4)系统提示是否需要加入文件,在此不添加任何文件;
(5)点击Next,进入设备选择对话框,如图6,这里选中实验箱的核心芯片CYCLONE系列FPGA产品EP1C6Q240C8;
(6)点击Next,系统显示如图7,提示是否需要其他EDA工具,这里不选任何其他工具;
(7)点击Next后,系统提示创建工程的各属性总结,若没有错误,点击Finish,工程创建向导将生成一个工程,这时软件界面如图8,在窗口左侧显示出设备型号和该工程的基本信息等。
图3输入工程名称、存储目录
图4提示是否创建新文件夹
图5提示是否添加文件
图6芯片型号选择
图7提示是否利用其他EDA设计工具
图8工程阐述汇总
至此工程创建好完成,一下进行具体的设计了,为实现用一个拨码开关控制一个LED亮灭的功能,可用VHDL编写一个程序实现,具体操作过程如下:
(1)点击File->New创建一个设计文件,系统显示如图9;
图9创建一个设计文件
(2)选择设计文件的类型为VHDLFile;
(3)点击OK,系统显示如图10,窗口右侧为VHDL的编辑窗口。
图10新建的一个VHDL源文件的编辑窗口
(4)在编辑窗口中编辑以下程序:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitytestis
Port(led:
outstd_logic;
key:
instd_logic
);
endtest;
architectureBehavioraloftestis
begin
led<=key;
endBehavioral;
(5)输入程序后,存盘,如图11所示:
图11存盘
(6)点击Processing->StartCompilation编译该文件,系统将开始编译,结束后,给出提示信息和编译结果,如图5-12所示:
图12编译结果显示
(7)仿真
(8)建立时序仿真文件,如图9所示,选择“VectorWaveformFile”,出现图10的界面,在Name空白处击右键,Insert→InsertNodeorBus。
图10
图11
在图11中单击
图12
在12中单击
,再单击
→OK→OK。
如图13所示
图13
仿真文件存盘时,文件名字必须与顶层文件同名,即test,默认即可。
图14
图15
图15是为仿真输入赋值的。
如想赋值‘1’,单击
。
(9)单击菜单进行仿真
图16
仿真结果如图17。
图17仿真波形
(5)点击Assignment->Pins进行引脚分配,实验箱上拨码开关和LED对应的引脚分别为58和98,分配结果如图18所示。
图18引脚分配
(6)参照步骤(5)重新编译系统,系统将生成FPGA配置文件,在编译过程中若显示警告可不理会;
(7)准备下载,注意打开实验箱电源,并连接下载电缆;
(8)点击Tools->Programmer将配置文件下载到FPGA,系统显示如图19所示,注意选择下载模式为JTAG,若下载线硬件显示“NoHardware”(如图19所示),则点击HardwareSetup按钮,系统显示如图20,双击USB-Baster,设定其为当前选定硬件,再点Close返回。
图19下载界面
图20下载线配置
这时,系统界面如图21,选中Program/Configure,点击Start,将配置文件下载到FPGA。
图21配置好下载电缆的下载界面
观察实验效果,尝试开关拨码开关K1,发光二极管D1-1将随之亮灭。
实验一、计数器程序设计
1、实验目的:
1)了解计数器的工作原理;
2)用VHDL语言编写60进制计数器,通过设计熟悉EDA开发的基本流程;
3)熟悉QuartusII软件的使用,练习使用文本编辑器;
4)掌握VHDL编写中的一些小技巧。
2、实验要求:
(1)在实验报告结果分析中要对测量所得数据进行分析
3、实验内容:
利用VHDL语言设计60进制计数器,编译、仿真、下载
4、主要仪器设备及试剂:
1)计算机一台,实验箱
2)QUARTUSII8.1环境
5、实验步骤
按照QUARTUSII软件使用方法,为60进制计数器建工程。
工程名应为cntm60(实体名)。
参考程序如下。
要求编译、仿真、下载。
libraryieee;--调用ieee库
useieee.std_logic_1164.all;--使用ieee库中的1164包
useieee.std_logic_unsigned.all;--使用ieee库中的无符号包
entitycntm60is
port(ci:
instd_logic;--来至低级的进位
nreset:
instd_logic;--清零端
load:
instd_logic;--置数端
d:
instd_logic_vector(7downto0);--与置数端对应的数据输入端
clk:
instd_logic;时钟端
co:
outstd_logic;进位输出端
qh:
bufferstd_logic_vector(3downto0);--计数器的高位输出端
ql:
bufferstd_logic_vector(3downto0));--计数器的低位输出端
endcntm60;
architecturebehaveofcntm60is
begin
co<='1'when(qh="0101"andql="1001"andci='1')else'0';
process(clk,nreset)
begin
if(nreset='0')then
qh<="0000";
ql<="0000";
elsif(clk'eventandclk='1')then
if(load='1')then
qh<=d(7downto4);
ql<=d(3downto0);
elsif(ci='1')then
if(ql=9)then
ql<="0000";
if(qh=5)then
qh<="0000";
else
qh<=qh+1;
endif;
else
ql<=ql+1;
endif;
endif;
endif;
endprocess;
endbehave;
实验二、七段译码器器设计
1、实验目的:
1)了解七段译码器的原理。
2)进一步熟悉EDA开发的基本流程。
2、实验要求:
(1)在实验报告结果分析中要对测量所得数据进行分析
3、实验内容:
利用VHDL语言完成动态译码器的设计,仿真,下载。
4、主要仪器设备及试剂:
1)计算机一台,实验箱
2)QUARTUSII8.1环境
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitydecl7is
port(
a:
instd_logic_vector(3downto0);
sel:
outstd_logic_vector(2downto0);
ledl7:
outstd_logic_vector(6downto0));
enddecl7;
architecturebehaveofdecl7is
begin
sel<="111";
process(a)
begin
caseais
when"0000"=>ledl7<="0111111";
when"0001"=>ledl7<="0000110";
when"0010"=>ledl7<="1011011";
when"0011"=>ledl7<="1001111";
when"0100"=>ledl7<="1100110";
when"0101"=>ledl7<="1101101";
when"0110"=>ledl7<="1111101";
when"0111"=>ledl7<="0000111";
when"1000"=>ledl7<="1111111";
when"1001"=>ledl7<="1101111";
when"1010"=>ledl7<="1110111";
when"1011"=>ledl7<="1111100";
when"1100"=>ledl7<="0111001";
when"1101"=>ledl7<="1011110";
when"1110"=>ledl7<="1111001";
when"1111"=>ledl7<="1110001";
whenothers=>null;
endcase;
endprocess;
endbehave;
实验三、多功能数字钟设计
1、实验目的:
1)了解数字钟的原理;
3)进一步掌握自顶向下的数字系统设计方法,并体会其优越性;
2、实验要求:
(1)在实验报告结果分析中要对测量所得数据进行分析
3、实验内容:
利用综合设计方法完成数字钟的设计,仿真,下载。
4、主要仪器设备及试剂:
1)计算机一台,实验箱
2)QUARTUSII8.1环境
5、实验原理
多功能数字钟应该具有的功能有:
显示时-分-秒、整点报时、小时和分钟可调等基本功能。
首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。
在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。
实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描的确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。
对于报警信号,由于实验箱上只有一个小的扬声器,而要使扬声器发声,必须给其一定频率的信号进行驱动,频率越高,声音越尖。
另外由于人耳的听觉范围是300Hz~3.4KHz左右,所以设计时也要选择恰当的发声频率。
实验内容
本实验的任务就是设计一个多功能数字钟,要求显示格式为小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始报警,且前五次报警的声音频率较低,最后一次报警声音的频率较高,类似于收音机整点报时,即从xx-59-50秒开始,依次为嘀、嘀、嘀、嘀、嘀、嗒。
系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。
调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。
报时的喇叭采用实验箱的扬声器模块,整点报时时嘀声用1.25KHz(对10KHz信号进行8分频),嗒声用2.5KHz(对10KHz信号进行4分频)。
另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。
实验步骤
完成多功能数字钟的实验步骤如下:
1.首先打开QuartusII软件,新建一个工程,并新建一个VHDLFile。
2.按照自己的想法,编写VHDL程序
3.对自己编写的VHDL程序进行编译并仿真。
4.仿真无误后,根据引脚对照表,对实验中用到的时钟信号、按键开关、七段码管及扬声器输出进行管脚绑定,然后再重新编译一次。
5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。
6.按动S1和S2按键,观察时钟的小时和分钟会不会递增。
7.将时间调整到xx时59分,观察时钟到了第50秒时是否会发出嘀、
嘀、嘀、嘀、嘀、嗒的报时声。
注意:
此实验需管脚复用
-------------------------------------
--Title:
多功能数字钟--
-------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entityexp15is
port(Clk:
instd_logic;--时钟输入
Rst:
instd_logic;--复位输入
S1,S2:
instd_logic;--时间调节输入
SPK:
outstd_logic;--扬声器输出
Display:
outstd_logic_vector(7downto0);--七段码管显示输出
SEG_SEL:
bufferstd_logic_vector(2downto0)--七段码管扫描驱动
);
endexp15;
--------------------------------------------------------------------
architecturebehaveofexp15is
signalDisp_Temp:
integerrange0to15;
signalDisp_Decode:
std_logic_vector(7downto0);
signalSEC1,SEC10:
integerrange0to9;
signalMIN1,MIN10:
integerrange0to9;
signalHOUR1,HOUR10:
integerrange0to9;
signalClk_Count1:
std_logic_vector(13downto0);--产生1Hz时钟的分频计数器
signalClk1Hz:
std_logic;
signalMusic_Count:
std_logic_vector(2downto0);
begin
process(Clk)
begin
if(Clk'eventandClk='1')then
if(Clk_Count1<10000)then
Clk_Count1<=Clk_Count1+1;
else
Clk_Count1<="00000000000001";
endif;
endif;
endprocess;
Clk1Hz<=Clk_Count1(13);
process(Clk1Hz,Rst)
begin
if(Rst='0')then--系统复位
SEC1<=0;
SEC10<=0;
MIN1<=0;
MIN10<=0;
HOUR1<=0;
HOUR10<=0;
elsif(Clk1Hz'eventandClk1Hz='1')then--正常运行
if(S1='0')then--调节小时
if(HOUR1=9)then
HOUR1<=0;
HOUR10<=HOUR10+1;
elsif(HOUR10=2andHOUR1=3)then
HOUR1<=0;
HOUR10<=0;
else
HOUR1<=HOUR1+1;
endif;
elsif(S2='0')then--调节分钟
if(MIN1=9)then
MIN1<=0;
if(MIN10=5)then
MIN10<=0;
else
MIN10<=MIN10+1;
endif;
else
MIN1<=MIN1+1;
endif;
elsif(SEC1=9)then
SEC1<=0;
if(SEC10=5)then
SEC10<=0;
if(MIN1=9)then
MIN1<=0;
if(MIN10=5)then
MIN10<=0;
if(HOUR1=9)then
HOUR1<=0;
HOUR10<=HOUR10+1;
elsif(HOUR10=2andHOUR1=3)then
HOUR1<=0;
HOUR10<=0;
else
HOUR1<=HOUR1+1;
endif;
else
MIN10<=MIN10+1;
endif;
else
MIN1<=MIN1+1;
endif;
else
SEC10<=SEC10+1;
endif;
else
SEC1<=SEC1+1;
endif;
endif;
endprocess;
process(Clk)
begin
if(Clk'eventandClk='1')then
Music_Count<=Music_Count+1;
if(MIN10=5andMIN1=9andSEC10=5)then--在59分50秒开始提示
if((SEC1MOD2)=0)then--在偶数秒开始发声
SPK<=Music_Count
(2);--嘀
else
SPK<='0';
endif;
elsif(MIN10=0andMIN1=0andSEC10=0andSEC1=0)then
SPK<=Music_Count
(1);--嗒
else
SPK<='0';
endif;
endif;
endprocess;
process(SEG_SEL)
begin
case(SEG_SEL+1)is
when"000"=>Disp_Temp<=HOUR10;
when"001"=>Disp_Temp<=HOUR1;
when"010"=>Disp_Temp<=10;
when"011"=>Disp_Temp<=MIN10;
when"100"=>Disp_Temp<=MIN1;
when"101"=>Disp_Temp<=10;
when"110"=>Disp_Temp<=SEC10;
when"111"=>Disp_Temp<=SEC1;
endcase;
endprocess;
process(Clk)
begin
if(Clk'eventandClk='1')then--扫描累加
SEG_SEL<=SEG_SEL+1;
Display<=Disp_Decode;
endif;
endprocess;
process(Disp_Temp)--显示转换
begin
caseDisp_Tempis
when0=>Disp_Decode<="00111111";--0
when1=>Disp_Decode<="00000110";--1
when2=>Disp_Decode<="01011011";--2
when3=>Disp_Decode<="01001111";--3
when4=>Disp_Decode<="01100110";--4
when5=>Disp_Decode<="01101101";--5
when6=>Disp_Decode<="01111101";--6
when7=>Disp_Decode<="00000111";--7
when8=>Disp_Decode<="01111111";--8
when9=>Disp_Decode<="01101111";--9
when10=>Disp_Decode<="01000000";---
whenothers=>Disp_Decode<="00000000";--全灭
endcase;
endprocess;
endbehave;