FPGA实验设计报告广东技术师范学院解析Word格式.docx
《FPGA实验设计报告广东技术师范学院解析Word格式.docx》由会员分享,可在线阅读,更多相关《FPGA实验设计报告广东技术师范学院解析Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
II的使用方法
2.学习Verilog
HDL和VHDL的编程方法
二、实验内容
编写一个分频器的Verilog
代码和VHDL代码并仿真。
三、实验原理
在数字电路中,
时钟信号的分频是很常见的电路。
分频器除了可以对时钟信号频率做除以二的计算外,分频器同时很类似涟波计数器。
涟波计数器是计数器的一种,它属于异步设计。
因为触发器并非皆由同一个时钟信号同步操作,所以它非常节省电路面积。
本实验要设一个带选择的分频时钟D[7:
0]用于选择是几分频。
D分频器设原理框图如图1所示:
图1.D分频器原理框图
四、实验步骤
1.新建工程,取名为DVF,如下图2所示。
图2新建工程DVF
2.新建VHDL设计文件,选择“File|New”
,在New对话框中选择Device
Design
Files
下的VHDL
File,单击OK,完成新建设计文件。
3.在新建设计文件中输入VHDL程序。
4.生成“Symbol”文件,新建“Block
Diagram/Schematic
File”文件,在文件中添加刚刚生成的“Symbol”以及输入输出管脚,最后完整的系统顶层模块图如图3所示。
图3
DVF顶层模块图
5.保存文件,使用qsf或者tcl进行管脚分配。
6.对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
7.新建“Vector
Waveform
File”文件进行波形仿真。
8.下载完成后,观察实验结果。
五、VHDL程序
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);
IFCLK'
EVENTANDCLK='
1'
THEN
IFCNT8="
11111111"
THEN
CNT8:
=D;
FULL<
='
;
ELSECNT8:
=CNT8+1;
FULL<
0'
ENDIF;
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
VARIABLECNT2:
STD_LOGIC;
BEGIN
IFFULL'
EVENTANDFULL='
CNT2:
=NOTCNT2;
IFCNT2='
THENFOUT<
ELSEFOUT<
ENDPROCESSP_DIV;
6、问题讨论
1、为什么在实验步骤1中,将半加器保存为DVF,可否保存为BVF?
答:
因为实验中要求所保存的文件名要与模块名相同,而保存的名字要符合其功能,弄混DVFr和BVF的话,会导致结果错误,不能正常运行。
2、如何设计分频器?
采用双计数器实现同样的功能,当分频系数N为偶数时,计数器从0到N-1循环计数,且计数器计数小于N/2时输出1,计数大于等于N/2则输出0;
当分频系数N为奇数时,计数器从0到N-1循环计数,且计数器小于(N+1)/2时输出0,计数等于(N+1)/2时则输出0到1的跳变信号,且此跳变信号必须在标准时钟的下降沿跳变(满足50%占空比),计数大于(N+1)/2时则输出1。
当分频系数N为奇数时,采用双计数器计数。
两个计数器同时计数,一个沿上升沿计数,另一个则沿下降沿计数。
计数器从0到N-1循环计数,且计数器计数小于(N-1)/2时输出1,计数大于等于(N-1)/2则输出0。
在这样的控制方式下,分频后输出的波形恰好相差1/2时钟周期,将两个波形进行或(or)操作后,即可得到所要的波形(占空比50%)。
广东技术师范学院实验预习报告
实验
(二)项目名称:
七段数码管扫描显示13579bdf
1.学习动态扫描显示的原理,进一步了解、熟悉和掌握FPGA开发软件Quartus
2.学习Verilog
HDL和VHDL的编程方法
3.学会使用Vector
Wave功能仿真
4.掌握使用多种方法分配管脚
利用动态扫描的方式设计一个在8个数码管上面分别显示‘13579bdf‘的程序
三、实验环境
硬件:
EP3C40Q240CB实验箱、USB
ByteBlaster
下载电缆
软件:
Altera
Quartus
II
9.0
集成开发环境
四、实验原理
一般来说,多个数码管的连接并不是把每个数码管都独立的与可编程逻辑器件连接,而是把所有的LED管的输入连在一起。
如图1所示。
其中每个数码管的8个段:
a、b、c、d、e、f、g、h(h是小数点),都分别连到SEG_D0~SEG_D7,8个数码管分别由8个选通信号DIG_C0~DIG_C7来选择。
被选通的数码管显示数据,其余关闭。
如在某一时刻DIG_C2为低电平“0”,其余选通信号为高电平“1”,这时仅DIG_C2对应的数码管显示来自段码信号端的数据,而其它7个数码管呈显示关闭状态。
根据这种电路状态,如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG_C0~DIG_C7分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫描就能实现扫描显示的目的。
虽然每次只有一个LED显示,但只要扫描显示速率够快,由于人的视觉余辉效应,使我们仍会感觉所有的数码管都在同时显示。
扫描频率大小不许合适才能有很好的效果。
如果太小,而每个LED开启的时间大于人眼的视觉暂停时间,那么会产生闪烁现象。
而扫描频率太大,则会
图1
扫描数码管的原理图
造成LED的频繁开启和关断,大大增加LED功耗(开启和关断的时刻功耗很大)。
一般来说,扫描频率选在50Hz比较合适。
SW1为清零信号使能,dig为数码管片选信号端,seg为7段显示片选信号。
五.引脚分配情况
图2.引脚分配图
6、实验步骤
1.新建工程,取名为DECL7S,如下图3所示
图3新建工程DDECL7S
2.新建VHDL设计文件,选择“File|New”
,在New对话框中选择Device
Design
Files下的VHDL
File,单击OK,完成新建设计文件。
3.在新建设计文件中输入VHDL程序。
4.编译程序。
5.保存文件,进行管脚分配。
6.对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
7、VHDL程序
ENTITYDECL7SIS
PORT(A:
LED7S1,LED7S2,LED7S3,LED7S4,LED7S5,LED7S6,LED7S7,LED7S8:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ARCHITECTUREoneOFDECL7SIS
PROCESS(A)
IFA='
LED7S1<
="
0000110"
--1
LED7S2<
1001111"
--3
LED7S3<
1101101"
--5
LED7S4<
0000111"
--7
LED7S5<
1101111"
--9
LED7S6<
1111100"
--b
LED7S7<
1011110"
--d
LED7S8<
1111001"
--f
ELSE
ENDIF;
ENDPROCESS;
8、问题讨论
1、在使用EP3C40Q240CB电路箱时要注意的事项?
答:
在使用EP3C40Q240CB电路箱时,首先要注意电箱的工作模式与
集成开发环境下的模式(如下图)相对应,在下载sof文件时要选择相对应的USBI/O输出接口,以及
下的引脚相对应,不要出错。
2、数码管是如何显示的?
实验(三)项目名称:
七段数码管显示学号
软件:
1.新建工程,取名为SCAN_LED,如下图1所示建立工程。
7.生成sof文件,下载到实验箱,调到相应的模式,使得七段数码管显示数据。
5、VHDL程序
ENTITYSCAN_LEDIS
RST:
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ARCHITECTUREoneOFSCAN_LEDIS
SIGNALCNT8:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALA:
INTEGERRANGE0TO15;
P1:
PROCESS(CLK,CNT8,RST)
CASECNT8(5DOWNTO3)IS
WHEN"
000"
=>
BT<
00000001"
A<
=1;
001"
00000010"
=3;
010"
00000100"
=5;
011"
00001000"
=7;
100"
00010000"
=9;
101"
00100000"
=10;
110"
01000000"
=11;
111"
10000000"
=12;
WHENOTHERS=>
NULL;
ENDCASE;
ENDPROCESSP1;
P2:
PROCESS(CLK,RST)
IFRST='
THENCNT8<
000000"
ELSIFCLK'
CNT8<
ENDPROCESSP2;
P3:
PROCESS(CLK,RST,A)
THENSG<
0000000"
CASEAIS
WHEN0=>
SG<
0111001"
---[
WHEN1=>
0100000"
----
WHEN2=>
WHEN3=>
0111111"
---0
WHEN4=>
---9
WHEN5=>
WHEN6=>
WHEN7=>
---]
ENDPROCESSP3;
1、Quartus
集成开发环境下EP3C40Q240CB引脚编码时出现不能定义是什么原因导致的?
EP3C40Q240CB引脚编码出现不能定义是因为重复定义了,导致不能定义。
实验(四)项目名称:
加法器
1.学习加法器的设计,进一步了解、熟悉和掌握FPGA开发软件Quartus
2.学习Verilog
HDL和VHDL的编程方法
编写一个半加器的vhd代码生成一个半加器,利用半加器制成全加器,继而完成四位全加器。
三、实验原理及说明
由数字电路知识可知,一位全加器可由两个一位半加器与一个或门构成,其原理图如图1所示。
该设计利用层次结构描述法,首先设计半加器电路,将其打包为半加器模块;
然后在顶层调用半加器模块组成全加器电路;
最后将全加器电路编译下载到实验箱,其中ain,bin,cin信号可采用实验箱上SW0,SW1,SW2键作为输入,并将输入的信号连接到红色LED管LEDR0,LEDR1,LEDR2上便于观察,sum,cout信号采用绿色发光二极管LEDG0,LEDG1来显示。
图1全加器方框图
四、实验步骤
1、在QUARTUSII软件下创建一工程,工程名为half_adder,芯片名为EP3C40Q240CB;
图2.半加器
2、新建Verilog语言文件,输入如下半加器Verilog语言源程序;
3、保存半加器程序为half_adder.v,进行功能仿真、时序仿真,验证设计的正确性。
4选择菜单File→Create/Update→CreateSymbolFilesforcurrentfile,创建半加器模块;
5、新建一原理图文件,在原理图中调用半加器、或门模块和输入,输出引脚,按照图3所示连接电路。
并将输入a_input、b_input、c_input连接到FPGA的输出端,便于观察。
完成后另保存full_adder。
图3.连接电路
6、对设计进行全编译,如出现错误按照错误提示进行修改。
7、分别进行功能与时序仿真,在进行功能仿真前必须先生成功能仿真网络表,才可进行功能仿真,验证全加器的逻辑功能。
图4全加器原理图
8.锁定引脚
To
DE2上的名称
Location
a_input
SW[0]
PIN_N25
b_input
SW[1]
PIN_N26
c_input
SW[2]
PIN_P25
a_output
LEDR[0]
PIN_AE23
b_output
LEDR[1]
PIN_AF23
c_output
LEDR[2]
PIN_AB21
sum_output
LEDG[0]
PIN_AE22
cout_output
LEDG[1]
PIN_AF22
9.下载
采用JATG方式进行下载,通过SW0,SW1,SW2分别代表a_input、b_input、c_input作为输入,LEDR[0],LEDR[1],LEDR[2]的亮灭显示分别代表a,b,co的状态,亮表示输入为1,灭表示输入是0。
全加器的结果输出sum_output、cout_output用LEDG[0],LEDG[1]亮灭显示,同样,亮表示输入为1,灭表示输入是0。
通过设置不同的输入验证全加器的逻辑输出显示。
5、实验结果
1.半加器的功能仿真与时序仿真:
图5半加器功能仿真结果
图6半加器时序仿真结果
由以上两个功能仿真与时序仿真对比可以看到,在功能仿真图中,输入到输出是不考虑器件及电路延时的情况下的功能上的仿真验证。
通过功能仿真结果可以看到所设计电路是达到预想要求,实现了半加器的功能。
而时序仿真是在将设计适配到芯片后的仿真验证,考虑有延时情况下的结果,从而可有效地分析出设计中的竞争和冒险,一般接近最后作出的硬件结果。
明显的可以看出输出到输入是存在延时,因为是纳秒级单位的,所以在波形上有直观的表现。
2.全加器的功能仿真与时序仿真:
图7全加器功能仿真
图8全加器时序仿真
同样,由以上两个功能仿真与时序仿真对比可以看到,与半加器得到的结果相似之处,在功能仿真图中,得到的输出波形结果是正确的,实现了全加器的功能。
而时序仿真是存在明显的延时,可以看出输出到输入不像功能仿真那么理想,在纳秒级单位的情况下可以明显看到波形的差距,存在着延时导致的毛刺。
六、实验程序
半加器程序
ENTITYhalf_adderIS
PORT(a,b:
INSTD_LOGIC;
s,co:
OUTSTD_LOGIC);
ENDhalf_adder;
ARCHITECTUREhalf1OFhalf_adderIS
SIGNALc,d:
c<
=aORb;
d<
=aNANDb;
co<
=NOTd;
s<
=cANDd;
ENDhalf1;
四位加法器半加器程序
ENTITYFOUR_FadderIS
PORT(a,b:
INSTD_LOGIC_VECTOR(0TO3);
ci:
s:
OUTSTD_LOGIC_VECTOR(0TO3);
co:
ENDFOUR_Fadder;
ARCHITECTUREf1OFFOUR_FadderIS
SIGNALtmp:
STD_LOGIC_VECTOR(0TO3);
SIGNALd:
COMPONENTBLOCK1
PORT(
CIN,AIN,BIN:
sum,cout:
OUTSTD_LOGIC
);
ENDCOMPONENT;
U1:
BLOCK1PORTMAP(ci,a(0),b(0),s(0),tmp(0));
U2:
BLOCK1PORTMAP(tmp(0),a
(1),b
(1),s
(1),tmp
(1));
U3:
BLOCK1PORTMAP