eda实验报告.docx
《eda实验报告.docx》由会员分享,可在线阅读,更多相关《eda实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
eda实验报告
EDA技术与VHDL
实验报告
电气工程系
电子信息工程
实验一:
1位全加器设计
实验目的:
I113
1.学习QuartusII9.1集成开发环境的使用方法以及如何建立工程和文件;
2.用原理图输入设计法和
VHDL文本输入设计法设计
1位全加器;
3.通过电路仿真和硬件验证,进一步了解
1位全加器的功能
I113
实验内容:
用原理图输入设计法和
VHDL文本输入设计法分别设计
1位全加器,并下载到CH4实验
箱上运行。
实验原理:
1位全加器可以由两个半加器和一个或门连接而成,因而可根据半加器的电路(如
图3-1所示)或真值表写出或门和半加器的VHDL描述。
然后根据图3-2写出全加器的顶层描述。
co
a
b
so
co
0
0
0
0
a
and2
0
1
1
0
b
not
xnor2
so
1
0
1
0
1
1
0
1
图3-1
半加器h_adder电路图及其真值表
u1
d
h_adder
a
or2a
ain
h_adder
c
cout
f_adder
cout
ain
A
co
A
co
fb
bin
sum
bin
B
so
e
B
so
u3
sum
cin
cin
u2
图3-2全加器f_adder电路图及其实体模块
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
7.下载****.sof配置文件到EP3C16Q240C8中;
1半加器的vhdl描述有两种,我用的是下面这种,布尔函数描述法:
(1)布尔函数描述方法的VHDL源程序如下:
LIBRARYIEEE;--半加器描述
(1):
布尔方程描述方法
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYh_adderIS
PORT(a,b:
INSTD_LOGIC;
co,so:
OUTSTD_LOGIC);
ENDENTITYh_adder;
ARCHITECTUREfh1OFh_adderis
BEGIN
so<=NOT(aXOR(NOTb));co<=aANDb;
ENDARCHITECTUREfh1;
(2)或门逻辑描述:
LIBRARYIEEE;--或门逻辑描述
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor2aIS
PORT(a,b:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDENTITYor2a;
ARCHITECTUREoneOFor2aIS
BEGIN
c<=aORb;
ENDARCHITECTUREone;
(3)1位二进制全加器顶层设计描述:
LIBRARYIEEE;--1位二进制全加器顶层设计描述
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYf_adderIS
PORT(ain,bin,cin:
INSTD_LOGIC;
cout,sum:
OUTSTD_LOGIC);
ENDENTITYf_adder;
ARCHITECTUREfd1OFf_adderIS
COMPONENTh_adder--调用半加器声明语句
PORT(a,b:
INSTD_LOGIC;
co,so:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTor2a
PORT(a,b:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALd,e,f:
STD_LOGIC;--定义3个信号作为内部的连接线。
BEGIN
u1
:
h_adderPORTMAP(a=>ain,b=>bin,co=>d
,so=>e);
--例化语句
u2
:
h_adderPORTMAP(a=>e,
b=>cin,co=>f,so=>sum);
u3
:
or2aPORTMAP(a=>d,
b=>f,c=>cout);
ENDARCHITECTUREfd1;
实验结果:
实验二:
移位寄存器模块
实验目的:
1设计8位CPU设计中常用的移位寄存器模块
2用case语句设计并行输入输出的移位寄存器
3体会信号赋值的特性
实验内容:
编写移位寄存器的VHDL实现程序;通过电路仿真和硬件验证,进一步了解移位寄存器的功能。
设计原理:
LibraryIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSHIFTIS
PORT(CLK,C0:
INSTD_LOGIC;--时钟和进位输入
MD:
INSTD_LOGIC_VECTOR(2DOWNTO0);
--移位模式控制字
D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
--待加载移位的数据
QB:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);移--位数据输出
CN:
OUTSTD_LOGIC);--进位输出
ENDENTITY;
ARCHITECTUREBEHAVOFSHIFTIS
SIGNALREG:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCY:
STD_LOGIC;
BEGIN
PROCESS(CLK,MD,C0)
BEGIN
IFCLK‘EVENTANDCLK=’1‘THEN
CASEMDIS
WHEN"001"=>REG(0)<=C0;
REG(7DOWNTO1)<=REG(6DOWNTO0);CY<=REG(7);
--带进位循环左移
WHEN"010"=>REG(0)<=REG(7);
REG(7DOWNTO1)<=REG(6DOWNTO0);
--自循环左移
WHEN"011"=>REG(7)<=REG(0);
REG(6DOWNTO0)<=REG(7DOWNTO1);
--自循环右移
WHEN"100"=>REG(7)<=C0;
REG(6DOWNTO0)<=REG(7DOWNTO1);CY<=REG(0);
WHEN"101"=>
REG(7DOWNTO0)<=
--带进位循环右移
D(7DOWNTO0);
--加载待移数
WHENOTHERS=>REG<=REGCY;<=CY;--保持
ENDCASE;
ENDIF;
ENDPROCESS;
QB(7DOWNTO0)<=REG(7DOWNTO0);CN<=CY;--移位后输出
ENDBEHAV;
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
7.下载****.sof配置文件到EP3C16Q240C8中;
实验结果:
实验三:
计数器和移位寄存器设计
一、十进制加法计数器
实验目的:
设计带有异步复位和同步时钟使能的十进制加法计数器。
实验内容:
编写十进制加法计数器的VHDL实现程序;通过电路仿真和硬件验证,了解变量的使用方法,以及“(OTHERS=>X)”的使用方法。
设计原理:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,RST,EN:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT10;
ARCHITECTUREbehavOFCNT10IS
BEGIN
PROCESS(CLK,RST,EN)
VARIABLECQI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='1'THENCQI:
=(OTHERS=>'0');--计数器异步复位
ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿
IFEN='1'THEN--检测是否允许计数(同步使能)
IFCQI<9THENCQI:
=CQI+1;
--允许计数,检测是否小于
ELSECQI:
=(OTHERS=>'0');--大于9,计数值清零
ENDIF;
ENDIF;
ENDIF;
IFCQI=9THENCOUT<='1';--计数大于9,输出进位信号
ELSECOUT<='0';
ENDIF;
CQ<=CQI;--将计数值向端口输出
ENDPROCES
ENDbehav;
9
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器
VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
实验结果:
1、引脚图:
二、移位寄存器设计
实验目的:
设计带有同步并行预置功能的8位右移移位寄存器。
实验内容:
CLK是移位时钟信号,DIN是8位并行预置数据端口,LOAD是并行数据预置使能信号,
QB是串行输出端口
设计原理:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSHFRTIS--8位右移寄存器
PORT(CLK,LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
QB:
OUTSTD_LOGIC);
ENDSHFRT;
ARCHITECTUREbehavOFSHFRTIS
IFLOAD='1'THENREG8:
=DIN;
--由(LOAD='1')装载新数据
ELSEREG8(6DOWNTO0):
=REG8(7DOWNTO1);
ENDIF;
ENDIF;
QB<=REG8(0);--输出最低位
ENDPROCESS;
ENDbehav;
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
7.下载****.sof配置文件到EP3C16Q240C8中;
实验结果:
实验四:
七段数码显示译码器和数控分频器设计
一.七段数码显示译码器
实验目的:
学习7段数码显示译码器设计;学习VHDL的CASE语句应用及多层次设计方法。
实验内容:
在QuartusII上对该例进行编辑、编译、综合、适配、仿真,给出其所有信号的时序仿真波形。
提示:
用输入总线的方式给出输入信号仿真数据,仿真波形示例下图所示。
引脚锁定及硬件测试
设计原理:
7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制
BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制
的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实
现。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDECL7SIS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
LED7S:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
END;
ARCHITECTUREoneOFDECL7SIS
BEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>LED7S<="0111111";
WHEN"0001"=>LED7S<="0000110";
WHEN"0010"=>LED7S<="1011011";
WHEN"0011"=>LED7S<="1001111";
WHEN"0100"=>LED7S<="1100110";
WHEN"0101"=>LED7S<="1101101";
WHEN"0110"=>LED7S<="1111101";
WHEN"0111"=>LED7S<="0000111";
WHEN"1000"=>LED7S<="1111111";
WHEN"1001"=>LED7S<="1101111";
WHEN"1010"=>LED7S<="1110111";
WHEN"1011"=>LED7S<="1111100";
WHEN"1100"=>LED7S<="0111001";
WHEN"1101"=>LED7S<="1011110";
WHEN"1110"=>LED7S<="1111001";
WHEN"1111"=>LED7S<="1110001";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器
VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
7.下载****.sof配置文件到EP3C16Q240C8中;
实验结果:
二.数控分频器设计
实验目的:
学习数控分频器的设计、分析和测试方法。
。
实验内容:
根据波形图,分析VHDL中的各语句功能、设计原理及逻辑功能,详述进程P_REG和P_DIV的作用,并画出该程序的RTL电路图。
输入不同的CLK频率和预置值D,给出时序波
形。
在实验系统上硬验证。
给出不同输入值
D时,FOUT输出不同频率
设计原理:
数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的
分频比,数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出
位与预置数加载输入信号相接即可。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDVFIS
PORT(CLK:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
FOUT:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFDVFIS
SIGNALFULL:
STD_LOGIC;
BEGIN
P_REG:
PROCESS(CLK)
VARIABLECNT8:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT8="11111111"THEN
CNT8:
=D;
--当CNT8计数计满时,输入数据
D被同步预置给计
--数器CNT8
FULL<='1';--同时使溢出标志信号FULL输出为高电平
ELSECNT8:
=CNT8+1;--否则继续作加1计数
FULL<='0';--且输出溢出标志信号FULL为低电平
ENDIF;
ENDIF;
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
VARIABLECNT2:
STD_LOGIC;
BEGIN
IFFULL'EVENTANDFULL='1'THEN
CNT2:
=NOTCNT2;
--如果溢出标志信号FULL为高电平,D触发器输出取反
IFCNT2='1'THENFOUT<='1';ELSEFOUT<='0';
ENDIF;
ENDIF;
ENDPROCESSP_DIV;
END;
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
7.下载****.sof配置文件到EP3C16Q240C8中;
实验结果:
实验五:
单进程Moore状态机
实验目的:
测试单进程Moore状态机。
实验内容:
在QuartusII上对该例进行编辑、编译、综合、适配、仿真,给出单进程状态机的工作时序,分析本实例VHDL程序。
设计原理:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMOORE1IS
PORT(DATAIN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
CLK,RST:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDMOORE1;
ARCHITECTUREbehavOFMOORE1IS
TYPEST_TYPEIS(ST0,ST1,ST2,ST3,ST4);
SIGNALC_ST:
ST_TYPE;
BEGIN
PROCESS(CLK,RST)
BEGIN
IFRST='1'THENC_ST<=ST0;Q<="0000";
ELSIFCLK'EVENTANDCLK='1'THEN
CASEC_STIS
WHENST0=>IFDATAIN="10"THENC_ST<=ST1;
ELSEC_ST<=ST0;ENDIF;
Q<="1001";
WHENST1=>IFDATAIN="11"THENC_ST<=ST2;
ELSEC_ST<=ST1;ENDIF;
Q<="0101";
WHENST2=>IFDATAIN="01"THENC_ST<=ST3;
ELSEC_ST<=ST0;ENDIF;
Q<="1100";
WHENST3=>IFDATAIN="00"THENC_ST<=ST4;
ELSEC_ST<=ST2;ENDIF;
Q<="0010";
WHENST4=>IFDATAIN="11"THENC_ST<=ST0;
ELSEC_ST<=ST3;ENDIF;
Q<="1001";
WHENOTHERS=>C_ST<=ST0;
ENDCASE;
ENDIF;
ENDPROCESS;
ENDbehav;
实验步骤:
1.打开实验箱电源;
2.输入移位寄存器VHDL程序;
3.点击图标,进行分析和综合;
4.建立波形文件,进行功能仿真;
5.按接线图配置FPGA引脚;
6.点击图标,进行编译;
7.下载****.sof配置文件到EP3C16Q240C8中;
实验结果:
状态转换图:
实验六:
Mealy状态机
实验目的:
测试Mealy状态机。
实验内容:
在QuartusII上对该例进行编辑、编译、综合、适配、仿真,给出两个程序实现Mealy
状态机的工作时序,分析本实例VHDL程序。
设计原理:
与Moore状态机相比,mealy状态机的输出变化要领先一个周期,即一段输入信号或状
态发生变化,输出信号即发生变化。
程序一是两进程Mealy型状态机。
程序二是在程序一的基础上在COM1的进程中增加了一个IF语句,由此产生一个锁存
器,Q输出的时序是一致的,没有发生锁存后延时一个周期的现象。
测试两种实现方式的工作时序。
VHDL程序一:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMEALY1IS
PORT(CLK,DATAIN,RESET:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(4DOWNTO0));
ENDMEALY1;
ARCHITECTUREbehavOFMEALY1IS
TYPEstatesIS(st0,st1,st2,st3,st4);
SIGNALSTX:
states;
BEGIN
COMREG:
PROCESS(CLK,RESET)BEGIN--决定转换状态的进程