VHDL实验指导书.docx
《VHDL实验指导书.docx》由会员分享,可在线阅读,更多相关《VHDL实验指导书.docx(23页珍藏版)》请在冰豆网上搜索。
VHDL实验指导书
VHDL语言
实验指导书
指导老师:
宾心华
湖南科技大学信息与电气工程学院
通信工程系
2007年8月
1实验软件操作介绍
所有实验内容均采用Maxplus2软件来完成,首先我们对该软件的使用与操作进行一个详细的介绍:
Max+plus2是Altera公司推出的的第三代PLD开发系统(Altera第四代PLD开发系统被称为:
QuartusII,主要用于设计新器件和大规模CPLD/FPGA).使用MAX+PLUSII的设计者不需精通器件内部的复杂结构。
设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,MAX+PLUSII把这些设计转自动换成最终所需的格式。
其设计速度非常快。
对于一般几千门的电路设计,使用MAX+PLUSII,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。
设计处理一般在数分钟内内完成。
特别是在原理图输入等方面,Maxplus2被公认为是最易使用,人机界面最友善的PLD开发软件,特别适合初学者使用。
下面我们通过具体的图例和操作步骤介绍Max+plus2的使用方法:
以一个最简单的例子,用ALTERA的EPLD——EPM7128S实现二分频器,来示范用MAX+PLUSII进行开发的全过程。
首先启动MAX+PLUSII,进入集成开发环境
运行:
maxstart.exe
设计输入
建立一个新设计输入文件,这里我们采用原理图方式GraphicEditorfile(*.gdf)来进行设计输入,这是最方便,最直观的逻辑输入方法
选择“OK”进入编辑状态
接着输入逻辑元件,在编辑区的空白处双击鼠标。
在SymbolName栏输入dff,表示D触发器
选择“OK”,D触发器就被放在编辑区
放置器件时,在SymbolLibraries框中选择mf库,就可以选择常用的74系列逻辑芯片。
下面再放一个反相器,输入名称:
not
在反相器上按鼠标右键,将反相器旋转180度
下面放置I/O脚,输入脚:
input,输出脚:
output
在PING_NAME上双击,编辑管脚名为in、out
鼠标移动到器件的端上就变为小十字,拖动即可画线,如图连接
好了,设计输入告一段落,将设计文件存盘,命名为myfirst.gdf
编译
上面已经完成了原理图的输入,需要给设计指定一个工程名,选择File->Project->SetProjecttoCurrentFile,将当前工程名设为当前文件名
下面定义器件,即定义用哪种EPLD来实现设计,选择Assign->Device,在弹出窗口中选择MAX7000系列的EPM7128SLC84-10,确认
准备开始编译,选择MAX+plusII->Compiler,弹出编译窗口,按Start开始编译。
编译结束之后,在编译窗口中的rpt图标上双击,可打开编译报告文件,其中有便宜后的管脚分配图,可看到我们定义的管脚in和out
分配I/O脚
上面MAX+PLUSII完成了编译,把我们定义的I/O脚自动分配给了器件EPM7128SLC84,也许你对MAX+PLUSII自动分配的管脚不满意,没关系,自己定义,选择MAX+plusII->FloorplanEditor,进入底层编辑工具,再选择Layout->DeviceView和Layout->CurrentAssignmentsFloorplan,显示当前的管脚分配情况
可看到EPLD的底层图,右上角为UnassignedNodes&Pins
可以直接将UnassignedNodes&Pins中的管脚拖到合适的地方。
编辑后结果如下
然后需要按前面所述将工程重新编译一遍,在rpt报告文件里可以看到新定义的管脚分配图。
仿真
设计已经完成,但功能是否完全正确呢?
只要进行一下仿真就能知道
首先,要编辑一个波形文件,打开MAX+plusII->WaveformEditor
然后确定仿真的时长,选择File->EndTime,输入100us,确定
还需要确定仿真的最小时间单位,选择Option->GridSize,输入50ns,确定
下面开始输入要仿真的信号名称,选择Node->EnterNodeFromSNF,在弹出的对话框中按List按钮,可以看到我们前面定义的I/O:
in、out
按=>选择要增加的Nodes,把in、out都加入,确定,in、out出现在WaveEditor中。
按in的图标,选中信号in,在左侧的工具按钮上选择时钟工具。
在弹出的对话框中按确认。
用左侧工具调整显示比例,得到以下波形。
这就在in脚上加入了一个周期是100ns的信号
将波形文件存盘为myfirst.scf,选择MAX+plusII->Simulator调入仿真器
直接按Start启动仿真,仿真结束后按OpenSCF,可以看到仿真结果
可以看出out脚输出正确,实现了二分频,另外,输出和输入之间的实际时延也被仿真出来了
编程
至此,一个设计已经全部完成,你可以在设计目录下找到生成的编程文件*.pof,要将它实现需要对EPM7128进行编程,最方便又廉价的方法是用Altera的ByteBlaster下载电缆将编程文件.pof从电脑的并行口直接写入器件。
选择MAX+plusII->Programmer,再选择Options->HardwareSetup,如下配置硬件。
。
可以看到myfirst.pof已经自动被Programmer选中了
这时,确认硬件正确连接,目标板电源打开,按下Program即可开始对目标板上的EPLD进行编程了。
2VHDL语言实验项目与具体内容
实验一基本逻辑门、编译码器的设计
1.实验目的
(1)编写VHDL语言程序,熟悉程序编写调试的一般过程。
通过具体实验巩固所学VHDL语言程序的理论知识。
(2)了解编译与仿真的作用与意义。
(3)熟练掌握简单的VHDL语言语句与程序结构。
2.实验内容
(1)利用所提供的简单门电路、编码器、译码器源程序进行编译、仿真操作,温习巩固实验一的内容。
(2)自己动手编制程序设计简单的门电路、编码器,译码器程序。
(3)将编写的程序进行编译并调试。
(4)将编译通过的程序进行仿真,观察仿真结果。
3.实验设备
PC机一台,max-plus2软件。
4.实验步骤
(1)参考所提供的源程序,在理解程序的前提下进行编译、仿真
(2)按要求编写门电路、编码器、译码器的程序。
(3)输入源程序,进行编译并调试。
(4)编译通过对程序进行仿真并观察仿真结果,分析程序与仿真结果。
5.实验报告要求
(1)列出源程序。
(2)说明所用到的VHDL语言语句功能,并对构造体的描述方式进行简单分析。
(3)观察并记录仿真结果,并分析原因与联系。
6.参考程序
1.与非门电路程序
libraryieee;
useieee.std_logic_1164.all;
entitynand2is
port(a,b:
instd_logic;
y:
outstd_logic);
endnand2;
architecturenand2_1ofnand2is
begin
y<=aandb;
endnand2_1;
2.编码器程序
LIBRARYieee;
USEieee.std_logic_1164.all;
entitybianma8_3is
port(a:
instd_logic_vector(7downto0);
b:
outstd_logic_vector(2downto0));
endbianma8_3;
architecturertlofbianma8_3is
begin
process(a)
begin
caseais
when"00000001"=>b<="000";
when"00000010"=>b<="001";
when"00000100"=>b<="010";
when"00001000"=>b<="011";
when"00010000"=>b<="100";
when"00100000"=>b<="101";
when"01000000"=>b<="110";
whenothers=>b<="111";
endcase;
endprocess;
endrtl;
3.译码器3_8设计
libraryieee;
useieee.std_logic_1164.all;
entityym3_8is
port(a0,a1,a2:
inbit;
s1,s2,s3:
inbit;
y0,y1,y2,y3,y4,y5,y6,y7:
outbit);
endym3_8;
architecturertlofym3_8is
signals:
bit;
signala:
bit_vector(2downto0);
signaly:
bit_vector(7downto0);
begin
process(a,s1,s2,s3)
begin
s<=s2ors3;
a<=a2&a1&a0;
ifs1='0'then
y<="11111111";
elsifs='1'then
y<="11111111";
else
caseais
when"000"=>y<="11111110";
when"001"=>y<="11111101";
when"010"=>y<="11111011";
when"011"=>y<="11110111";
when"100"=>y<="11101111";
when"101"=>y<="11011111";
when"110"=>y<="10111111";
whenothers=>y<="01111111";
endcase;
endif;
endprocess;
y0<=y(0);
y1<=y
(1);
y2<=y
(2);
y3<=y(3);
y4<=y(4);
y5<=y(5);
y6<=y(6);
y7<=y(7);
endrtl;
7.其他实验要求:
(1)学生根据在利用参考程序进行实验仿真之后编写其他逻辑门电路VHDL语言程序进行仿真并观察仿真结果。
(2)参考8-3编码器与3-8译码器的实验程序,编写其他类型编码器如2-4译码,4-2编码器VHDL语言程序,进行仿真实验,观察结果。
实验二交通灯控制器的设计
1.实验目的
(1)初步了解复杂控制电路设计的方法与流程,进一步熟练VHDL程序编写与调试的过程。
(2)对状态机的概念有基本的认识。
(3)对于复杂的时序逻辑电路仿真应该对相应参数做修改,以使得程序较容易调试。
2.实验内容
(1)利用所提供的参考程序,了解交通灯控制器的设计思路与方法,在此基础上自己进行设计与改善。
(2)将所编程序进行编译并调试改错。
(3)思考如何能有效对复杂的时序逻辑电路进行仿真实现。
需要修改相应参数。
(4)将编译通过的程序进行仿真,观察仿真结果。
看是否与预期一致,并思考如何改善电路。
3.实验任务
在十字路口的两个方向上各设一组红绿黄灯,显示顺序为:
其中一个方向是绿灯、
黄灯、红灯,另一个方向是红灯、绿灯、黄灯。
其中绿灯、红灯、黄灯的持续显示时间分别是20s、5s、25s。
选做内容:
当各条路中任意一条上出现特殊情况,例如消防车。
救护车或其他需要优先放行的车辆时,各方向上均是红灯亮;增加数码显示功能,将每个路口交通灯点亮时间以倒计时的方式通过数码管显示出来。
4.实验设备
PC机一台,max-plus2软件。
5.实验步骤
a)参考所提供的源程序,在理解程序的前提下进行编译、仿真
b)按要求编写交通灯控制器的程序。
c)输入源程序,进行编译并调试。
d)编译通过对程序进行仿真并观察仿真结果,分析程序与仿真结果。
6.实验报告要求
(1)列出源程序,并具体介绍程序原理,设计思路。
(2)说明所用到的VHDL语言语句功能,并对构造体的描述方式进行简单分析。
(3)改变主要参数使得能够进行仿真调试,并解释修改参数的原因与理由。
(4)观察并记录仿真结果,并分析原因与联系。
7.参考程序:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
ENTITYnclightIS
Port(clk:
instd_logic;
ra,rb,ya,yb,ga,gb:
outstd_logic);
ENDnclight;
Architectureaofnclightis
typestateis(S0,S1,S2,S3);
signalpresentstate,nextstate:
state;
signaltmp1,tmp2:
integerrange0to60;
signaltimeout1,timeout2:
std_logic;
signalq:
std_logic_vector(21downto0);
signalsec:
std_logic;
Begin --get1hzclockpulse
process(clk)
begin
ifclk'eventandclk='1'thenq<=q+1;endif;
sec<=q(21);--get1hzclockpulse
endprocess;
timing:
process(sec)
begin
ifsec'eventandsec='1'then
iftmp1=9thentimeout1<='1';timeout2<='0';tmp1<=0;else
iftimeout1='1'theniftmp2=4thentimeout2<='1';timeout1<='0';tmp2<=0;
elsetmp2<=tmp2+1;endif;
elsetmp1<=tmp1+1;endif;
endif;endif;
endprocess;
ToNextstate:
process(sec)
begin
ifsec'eventandsec='1'thenpresentstate<=nextstate;endif;
endprocess;
changestate:
process(presentstate)
begin
casepresentstateis
whenS0=>iftimeout1='0'then
nextstate<=s0;ra<='0';rb<='1';ya<='0';yb<='0';ga<='1';gb<='0';
elsenextstate<=s1;endif;
whenS1=>iftimeout2='0'then
nextstate<=s1;ra<='0';rb<='1';ya<='1';yb<='0';ga<='0';gb<='0';
elsenextstate<=s2;endif;
whenS2=>iftimeout1='0'then
nextstate<=s2;ra<='1';rb<='0';ya<='0';yb<='0';ga<='0';gb<='1';
elsenextstate<=s3;endif;
whenS3=>iftimeout2='0'then
nextstate<=s3;ra<='1';rb<='0';ya<='0';yb<='1';ga<='0';gb<='0';
elsenextstate<=s0;endif;
whenothers=>nextstate<=s0;timeout1<='0';timeout2<='0';
endcase;
endprocess;
enda;
8.其他实验要求:
(1)通过行为描述方式,利用有限状态机自主进行一个交通灯控制器的设计。
(2)将参考程序的设计思想由行为描述方式描述的VHDL语言转变为由寄存器传输描述方式,并尽可能实现模块化。
实验三数字频率计的设计
1.实验目的
(1)初步开始掌握利用VHDL语言进行应用程序设计的方法,开始独立设计
VHDL语言程序。
(2)能对自己编写的程序进行进一步改进,根据要求,能增加或完善一些具体功
能。
(3)能够从实验过程中理解VHDL语言三种描述方式的不同,并能利用结构描述
方式构建一些程序模块。
2.实验内容
(1)通过分析所给出的具体设计框图,对每个模块进行编程,在此基础上自己进行设计与改善。
(2)将所编程序进行编译并调试改错,最终实现正确仿真。
(3)分析所编写的程序属于哪种描述方式,并尝试用其他描述方式进行编程,并
分析不同描述方式的差异。
3.实验任务
设计一个四位十进制数字显示的数字式频率计,其频率测量范围为10MHz。
满刻度量程分别为10KHz、100KHz、1MHz和10MHz四档,即最大读数分别为9.999KHz,99.99KHz,999.9KHz,9999KHz,要求量程能够自动转换。
选做改进方向:
增加显示位数,增大测频范围。
4.实验设备
PC机一台,max-plus2软件。
5.实验步骤
a)分析给出框图结构,并绘制程序流程。
b)按要求编写数字频率计程序。
c)输入源程序,进行编译并调试,完成调试,观察仿真结果。
d)对已通过程序进行改进,增加或完善程序功能。
6.实验报告要求
(1)列出源程序,并以此得出具体设计模块图,并具体介绍设计思路。
(2)对模块进行分析,得出设计优势,分析可能改进方向。
(3)分析仿真的结果,就仿真结果与具体程序进行对应说明。
7.系统结构框图及简单介绍
被测频率信号
时钟信号
系统结构框图如上。
图中,分配器用于对时钟信号进行分频得到0.5Hz的时钟,为计数器模块提供1s的闸门时间;计数器模块为核心模块,完成在1s的时间里对被测信号技术的功能,并通过选择输出数据实现换挡功能;锁存器模块实现锁存功能,在经过1s计数时间后将锁存器送来的计数值进行锁存并送数码管显示模块;数码管显示模块对应于数码管片选信号,将相应的数据送译码器译码;译码输出模块完成对接收信号的译码并送数码管显示。