EDA实验报告分析.docx
《EDA实验报告分析.docx》由会员分享,可在线阅读,更多相关《EDA实验报告分析.docx(21页珍藏版)》请在冰豆网上搜索。
EDA实验报告分析
E
D
A
验
报
告
班级:
姓名:
学号:
实验一EDA工具基本操作与应用
1、实验目的
1、掌握QUARTUSII设计工具进行电子设计的基本流程。
2、了解可编程器件设计的全过程。
二、实验内容
一个简单的D触发器的设计。
三、实验条件
QUARTUSII软件,GW48试验箱,计算机。
四、实验设计
(1)系统的原理框图
(2)VHDL源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDCFQIS
PORT(D,CLK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC);
ENDENTITYDCFQ;
ARCHITECTUREARTOFDCFQIS
BEGIN
PROCESS(CLK)IS
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
Q<=D;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
(3)管脚锁定
实验设备:
CW48系统;试验芯片:
EP1C6/12Q240;试验模式:
NO.1;
五、实验结果及总结
(1)系统仿真情况
(2)硬件验证情况
CLK
0
1
0
1
0
1
0
1
0
D
1
0
0
0
1
0
0
1
1
Q
0
0
0
0
0
1
0
1
0
(3)实验过程中出现的问题及解决办法
在仿真的过程中,把时钟频率调低时,发现有延迟。
实验二8位加法器的设计
一、实验目的
1、掌握QUARTUSII设计工具进行电子设计的基本流程。
2、了解可编程器件设计的全过程。
二、实验内容
设计一个简单的8位加法器
三、实验条件
QUARTUSII软件,GW48试验箱,计算机。
4、实验设计
一、基本原理:
调用库(USEIEEE.STD_LOGIC_ARITH.ALL)直接进行算术运算,以实现加法器功能,从而不用去编写全加器,即程序尽量简单化。
并用函数CONV_INTEGER(D)把输入的8位二进制数转换成整形数,再相加以十进制数在数码管上显示出来。
加法信号由(ST)控制,ST接一个正脉冲信号,当来一个下降沿时,就读进第一个8位二进制数,再来一个下降沿时就执行加法功能,前后两个8位二进制数相加。
进程process(p)就是把三位十进制数的百位、十位、各位分别取出来,再转换成4位逻辑位矢量。
一个简单加法器,能够实现加法运算并显示结果,在按键控制下,由开关变量以二进制(不超过8位)的形式送入加数和被加数,但必须以十进制的形式显示,按下加法按键后,以十进制方式显示结果。
根据要求首先加法器中必须有二进制(8位)转换成十进制电路,其次加法器中需要用开关变量来控制加数和被加数的输入,再次输入的二进制加数和被加数必须经过转换成十进制后显示,最后加法完成结果以十进制显示。
其二进制(8位)全为1时转换成十进制表示为255,先设三位分别表示十进制数的百位、十位和个位。
将二进制数分别减去100的二进制数,循环直至二进制数小于100,百位循环一次加一,根据同样的道理得出十位和个位。
加数和被加数的输入和显示,利用高低电平控制显示器,当电平为高电平时显示加数和被加数的和,利用选择器来分别选择输出显示,当低电平时分别显示输入的二进制加数和被加数。
加法器是数字系统中的基本逻辑器件,减法器和硬件乘法器都可由加法器来构成。
多位加法器的构成有两种方式:
并行进位和串行进位。
并行进位加法器设有进位产生逻辑,运算速度较快;串行进位方式是将全加器级联构成多位加法器。
并行进位加法器通常比串行级联加法器占用更多的资源。
随着位数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大。
因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。
程序总体设计框图如图2.1所示:
动态扫描显示电路
输入
图2.1程序总体设计框图
二、单元电路设计
一个简单8位加法器,能够实现加法运算并显示结果,在按键控制下,由开关变量以二进制(不超过8位)的形式送入加数和被加数,但必须以十进制的形式显示,按下加法按键(ST)后,以十进制方式显示结果。
调用库(USEIEEE.STD_LOGIC_ARITH.ALL)直接进行算术运算,以实现加法器功能,从而不用去编写全加器,即程序尽量简单化。
并用函数CONV_INTEGER(D)把输入的8位二进制数转换成整形数,再相加以十进制数在数码管上显示出来。
加法信号由(ST)控制,ST接一个正脉冲信号,当来一个下降沿时,就读进第一个8位二进制数,再来一个下降沿时就执行加法功能,前后两个8位二进制数相加。
进程process(p)就是把三位十进制数的百位、十位、各位分别取出来,再转换成4位逻辑位矢量。
8位二进制加法器电路如图3.1所示:
图3.1八位二进制加法器电路图
8位二进制加法器程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYadder_8IS
PORT(
ST:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
BAI:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
SHI:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
GE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDadder_8;
ARCHITECTUREBHVOFadder_8IS
SIGNALA,B,C,P,Q:
INTEGERRANGE0TO999;
BEGIN
PROCESS(ST)
BEGIN
Q<=CONV_INTEGER(D);
IFST'EVENTANDST='1'THENP<=Q+P;
ELSEP<=P;
ENDIF;
ENDPROCESS;
PROCESS(P)
BEGIN
A<=P/100;
B<=(PMOD100)/10;
C<=PMOD10;
BAI<=CONV_STD_LOGIC_VECTOR(A,4);
SHI<=CONV_STD_LOGIC_VECTOR(B,4);
GE<=CONV_STD_LOGIC_VECTOR(C,4);
ENDPROCESS;
ENDBHV;
程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSCAN_LEDIS
PORT(CLK:
INSTD_LOGIC;
d0,d1,d2,d3,d4,d5,d6,d7:
inSTD_LOGIC_VECTOR(3DOWNTO0);
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
END;
ARCHITECTUREoneOFSCAN_LEDIS
SIGNALCNT8:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALA:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
P1:
PROCESS(CNT8)
BEGIN
CASECNT8IS
WHEN"000"=>BT<="00000001";A<=d0;
WHEN"001"=>BT<="00000010";A<=d1;
WHEN"010"=>BT<="00000100";A<=d2;
WHEN"011"=>BT<="00001000";A<=d3;
WHEN"100"=>BT<="00010000";A<=d4;
WHEN"101"=>BT<="00100000";A<=d5;
WHEN"110"=>BT<="01000000";A<=d6;
WHEN"111"=>BT<="10000000";A<=d7;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP1;
P2:
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'
THENCNT8<=CNT8+1;
ENDIF;
ENDPROCESSP2;
P3:
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>SG<="0111111";WHEN"0001"=>SG<="0000110";
WHEN"0010"=>SG<="1011011";WHEN"0011"=>SG<="1001111";
WHEN"0100"=>SG<="1100110";WHEN"0101"=>SG<="1101101";
WHEN"0110"=>SG<="1111101";WHEN"0111"=>SG<="0000111";
WHEN"1000"=>SG<="1111111";WHEN"1001"=>SG<="1101111";
WHEN"1010"=>SG<="1110111";WHEN"1011"=>SG<="1111100";
WHEN"1100"=>SG<="0111001";WHEN"1101"=>SG<="1011110";
WHEN"1110"=>SG<="1111001";WHEN"1111"=>SG<="1110001";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP3;
END;
三、波形仿真结果分析
8位二进制加法器功能仿真结果如图4.1所示:
图4.18位二进制功能仿真结果
【D】是输入端,由8个开关控制,【ST】是输入端,接正脉冲信号,【BAI】、【SHI】、【GE】都是输出端,分别是以个3位十进制数的百位、十位和各位。
加法信号由(ST)控制,ST接一个正脉冲信号,当来一个下降沿时,就读进第一个8位二进制数,再来一个下降沿时就执行加法功能,前后两个8位二进制数相加。
相加结果由3位十进制数通过数码管显示出来。
四、安装调试步骤
安装与调试过程是设计元件由虚拟变成事实最为重要的一步,安装就代表着元件的测试操作,也是检验仿真是否真正有效的最重要的步骤.所以在整个设计中安装调试便是最后一步也是前面所有步骤中的一个验收。
安装调试的成败直接验证实验的正确性。
但是在安装调试中我们也需要注意首先得确保仿真测试正确无误,然后引脚锁定并编译,接着将实验板连接好,接好电源就可以下载了。
下载完成后就可以调试,根据设计的要求来分别验证试验的结果,比如我们做加法器时,调试过程便是验证加法器的实现,先利用高电平来控制程序的有效,先输入一个八位二进制数,显示段是否显示其对应的十进制数,拨加法控制器,再在输入端输入被加数(八位二进制数),同样看被加数是否在显示段出现其十进制数,按下等号控制器,显示段便显示结果。
结果为要求显示的结果即实现加法功能。
当安装调试过程正确完成后,即设计的最后一步完成。
整个设计也即完成。
断掉电源拆线,整理实验台。
实验三序列器的设计
一、实验目的及要求
1.了解序列检测器的工作原理;
2.掌握时序电路设计中状态机的应用;
3.进一步掌握用VHDL语言实现复杂时序电路的设计过程。
2、实验内容
1.了解序列检测器的工作原理;
2.掌握时序电路设计中状态机的应用;
3.进一步掌握用VHDL语言实现复杂时序电路的设计过程。
3、实验条件
一、实验原理:
1)序列检测器在很多数字系统中都不可缺少,尤其是在通信系统当中。
序列检测器的作用就是从一系列的码流中找出用户希望出现的序列,序列可长可短。
比如在通信系统中,数据流帧头的检测就属于一个序列检测器。
序列检测器的类型有很多种,有逐比特比较的,有逐字节比较的,也有其他的比较方式,实际应用中需要采用何种比较方式,主要是看序列的多少以及系统的延时要求。
现在就逐比特比较的原理简单的介绍一下。
2)逐比特比较的序列检测器是在输入一个特定波特率的二进制码流中,每进一个二进制码,预期望的序列相比较。
首先比较第一个码,如果第一个码与期望的序列的第一个码相同,那么下一个进来的二进制码再和期望的序列的第二个码相比较,依次比较下去,直到所有的码都和期望的序列相一致,就认为检测到一个期望的序列。
如果检测过程中出现一个码与期望的序列当中对应的码不一样,则从头开始比较。
<二>实验内容:
本实验就是要设计一个序列检测器,要求检测的序列长度为8位,实验中用拨挡开关的SW1~SW8来作为外部二进制码流的输入,在FPGA内部则是逐个比较。
同时用按键模块的S1来作为一个启动检测信号,每按下S1一次,检测器检测一次,如果序SW1~SW8输入的序列与VHDL设计时期望的序列的一致,则认为检测到一个正确的序
本实验设计一个频率计,系统时钟选择核心板上的50MHz的时钟,闸门时间为1s,在闸门为高电平期间,对输入的频率进行计数,当闸门变低的时候,记录当前的频率值,并将频率计数器清零,频率的显示每过2秒刷新一次。
被测频率通过一个拨动开关来选择是使用系统中的数字时钟源模块的时钟信号还是从外部通过系统的输入输出模块的输入端输入一个数字信号进行频率测量。
当拨动开关为高电平时,测量从外部输入的数字信号,否则测量系统数字时钟信号模块的数字信号。
步骤如下:
1.打开QUARTUSII软件,新建一个工程。
2.建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3.按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,参照提供的示例程序。
4.编写完VHDL程序后,保存起来。
方法同实验一。
5.将编写的VHDL程序进行编译并生成模块符号文件,并对程序的错误进行修改,最终所有程序通过编译并生成模块符号文件。
QUARTUSII软件,GW48试验箱,计算机。
列,否则如果有一个不同,则认为没有检测到正确的序列。
另外为了便于观察,序列检测结果用一个LED显示,本实验中用LED模块的D1来显示,如果检测到正确的序列,则LED亮起,否则LED熄灭;用数码管来显示错误码的个数。
另外就是序列检测时钟信号的输入,本实验选择时钟模块的1KHz信号。
<三>实验步骤:
1)打开QUARTUSII软件,新建一个工程。
2)建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3)按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘中提供的示例程序。
4)编写完VHDL程序后,保存起来。
方法同实验一。
5)对编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
6)编译仿真无误后,依照《用户手册》进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
7)用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。
8)将数字信号源模块F的时钟选择为1KHZ,拨动八位拨动开关(SW8~SW1),使其为一个二进制数值,注意此时SW8代表高位。
按下键盘模块的S1键开始检测。
如果八位拨动开关设定的二进制值与程序设定的"11001100"值相同,观察发光管模块的D1的状态以及数码管上显示的值。
如果与程序设定的值不同,观察发光管模块的D1的状态以及数码管上显示的值。
观察实验结果是否与自己的编程思想一致。
9)实验完毕,关闭电源,整理实验器材。
五、实验分析及总结
一、VHDL程序:
--Title:
序列检测器--
--Author:
--
--Data:
2006-10-1--
-------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entityexp18is
port(Clk:
instd_logic;--时钟输入
K:
instd_logic_vector(7downto0);--序列输入
Start:
instd_logic;--输入:
启动检测
ledag:
outstd_logic_vector(6downto0);
del:
outstd_logic_vector(7downto0);--结果输出
led:
outstd_logic
);
endexp18;
--------------------------------------------------------------------
architecturebehaveofexp18is
signalm_Count:
integerrange0to15;
signalStart_Flag:
std_logic;
signalError_Num:
std_logic_vector(3downto0);
signalABC:
std_logic_vector(7downto0);
signalm_Result:
std_logic_vector(7downto0);
signalled_count:
std_logic_vector(6downto0);
signalsel_count:
std_logic_vector(2downto0);
signalsel:
std_logic_vector(2downto0);
begin
ABC<="11001100";--待检测序列值
process(Clk)
begin
if(Clk'eventandClk='1')then
if(Start='0')then
Start_Flag<='1';
elseif(m_Count>=7)then
Start_Flag<='0';
endif;
endif;
endprocess;
process(Clk)--计数器累加
begin
if(Clk'eventandClk='1')then
if(Start='0')then
m_Count<=0;
elsif(Start_Flag='1')then
m_Count<=m_Count+1;
else
m_Count<=15;
endif;
endif;
endprocess;
process(Clk)--波形判断
begin
if(Clk'eventandClk='1')then
if(Start='0')then
Error_Num<="0000";
elsif(m_Count<=7andK(m_Count)/=ABC(m_Count))then
Error_Num<=Error_Num+1;
endif;
endif;
endprocess;
process(Clk)--波形判断
begin
if(Clk'eventandClk='1')then
if(Start='0')then
m_Result(7downto4)<="0000";
elsif(m_Count=8)then
if(Error_Num="0000")then
m_Result(7downto4)<="1000";
else
m_Result(7downto4)<="0000";
endif;
endif;
m_Result(3downto0)<=Error_Num;
endif;
endprocess;
process(Clk)--显示位选
begin
if(Clk'eventandClk='1')then
sel_count<=sel_count+1;
endif;
sel<=sel_count;
endprocess;
process(Error_Num)--显示译码
begin
caseerror_numis
when"0000"=>led_count<="0111111";--'0'
when"0001"=>led_count<="0000110";--'1'
when"0010"=>led_count<="1011011";--'2'
when"0011"=>led_count<="1001111";--'3'
when"0100"=>led_count<="1100110";--'4'
when"0101"=>led_count<="1101101";--'5'
when"0110"=>led_count<="1111101";--'6'
when"0111"=>led_count<="0000111";--'7'
when"1000"=>led_count<="1111111";--'8'
when"1001"=>led_count<="1101111";--'9'
when"1010"=>led_count<="1000000";--'-'
whenothers=>led_count<="0000000";--全灭
endcase;
ledag<=led_count;
endprocess;
process(Error_Num)--检测数据是否正确
begin
if(Error_Num="0000")then
led<='1';
else
led<='0';
endif;
endprocess;
process(sel)
begin