完整word版基于FPGA的数字电路实验报告.docx
《完整word版基于FPGA的数字电路实验报告.docx》由会员分享,可在线阅读,更多相关《完整word版基于FPGA的数字电路实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
完整word版基于FPGA的数字电路实验报告
清华大学
电子工程系
FPGA实验报告
程宇昕
2008011190
无86
实验一加法器设计
一实验目的
1.掌握加法器的工作原理和设计方法。
、
2.理解逐次加法器和超前进位加法器的原理。
二
1)4位逐次进位加法器
1.设计方案
利用全加器直接级联即可得到4位逐次进位加法器。
2.原理说明及框图
由一位全加器的原理可以写出真值表,如实验参考书所示,由此可以写出卡诺图,并化简得表达式
和
由此得到全加器的门级描述框图:
现在只需将4个加法器单位级联,即可得到4位逐次进位的加法器。
3.代码文件清单
Task11.v
4.仿真结果
如图所示,功能正常
5管脚绑定
用模式1电路,1键输入a,2键输入6,译码器5输出s。
灯管D1代表进位,键7输入Ci,功能正常。
2)4位超前进位加法器
1.设计方案
按照指导书上给出的表达式可得:
对于4位超前进位加法器,逻辑框图如下图所示。
各个进位表达式与的
的关系如下所示:
其中
分别表示各个全加器的和信号与进位信号。
2.原理说明及框图
超前进位加法器使用更多的器件,要求所有进位端都能通过输入的两个加数和进位数直接表示出来,表达式如上图所示。
直接转换为框图即可得到下图:
3.代码文件清单
Task12.v
4.仿真结果及分析说明
如图所示,仿真结果功能正确
5.管脚绑定
用模式1,其余键指定同上。
其中输出p用灯管D2表示,g用灯管D3表示,功能正常。
3)8位超前进位加法器
1.设计方案
采用两单位四位超前进位加法器级联即可得到8位的加法器。
2.代码文件清单
Task13.vadder.v
3.仿真结果及分析说明
如图所示,结果正确
4.管脚绑定
用了模式1,a用键2,1表示,b用键4,3输入b,键7输入Ci,D1显示进位,输出和s用译码器6,5表示,功能正确。
4)8位加法器(1位全加器级联实现)
1.设计方案
与第一问类似,仿照4位的实现原理,级联8个单位即可。
2.原理说明及框图
3.文件清单
Task14.v
4.仿真结果
结果正常
对比
8位逐次进位加法器
8位超前进位加法器
Totallogicelements16/5980
Totallogicelements32/5980
从速度上来比较,可以从仿真波形来看,8位逐次进位加法器出现了更多的延迟,而超前进位加法器从速度上快了很多,减少了几个ns的延迟。
5.下载情况
用模式1,输入与输出按键和显示的设计同上。
功能正常。
·5)8位BCD加法器
1.设计方案
在对BCD码进行加法运算时,可以先按二进制进行计算,然后对所得的结果进行修正即可。
可以先得到4位BCD加法器,级联即可得到8位的BCD加法器。
对于4位BCD加法器,修正的原则是:
若相加得到的数>9,则在此基础上加6得到修正值。
2.原理说明及框图
设计此加法器的关键是判断何时应该加6。
这个问题比较好解决。
当输出为11XX或者1X1X时就应该加上修正值了。
所以我用了两个与门来判断是否超过9,进位端输出超过15的标志值。
用或门联系上这3者,输出的值t0是否应该加上修正值6的信号了。
我的想法是,做出一个修正值M[3:
0],另其第4位和第1位始终为0,若t0为1,则M的2,3位为1,否则为0.这样利用已经设计好的4位超前进位加法器始终给结果加上M即可。
这个设计比较简单。
可以用下面的框图来表示(超前进位加法器用芯片表示)
3.代码文件清单
adder_4.v
BCD.v
Task15.v
4仿真结果
将以上的a,b化为2位10进制数,进行相加,可以得到s表示的2位10进制数,说明该BCD加法器功能正常。
4.下载情况
用模式1下载,其余按键与输出的设置同上。
经验证功能正常。
实验4竞争冒险消除实验
1.实验目的
·了解竞争冒险产生的原因及其避免方法
·学会利用软件仿真和硬件实现对数字电路的逻辑功能进行验证和分析
2.设计方案
按照指导书上的电路图仿真一遍没有消除冒险的电路,然后再消出冒险,进行一次仿真,对比两次的结果。
3.原理说明及框图
按照书上所给电路图,用verilog进行门级描述即可。
由于反相器的延迟时间比较短,几乎看不出任何毛刺现象,所以我在反相器之前加了lcell,有了延迟,才出了毛刺。
4.代码文件清单
Task21.v
Task22.v
5.仿真结果及分析说明
加入冗余项之前:
加入冗余项BC之后;
说明加入了冗余项以后,成功消除了冒险险象。
·思考题
1.比较逐次进位加法器和超前进位加法器的区别。
答:
主要区别在于,超前进位加法器可以直接根据输入确定每一位的输出,所以运算速度快,而这样消耗了更多的系统资源逐次进位加法器需根据每一位运算的情况确定进位,不过占用的系统资源更少。
2.自行设计一个1位全减器。
如何利用四位加法器实现一个4位全减器。
答:
因为减法可以看做是加上一个数的相反数。
所以只需对减数求反,再用加法器与被减数相加即可。
3.还有哪些方法可以消除竞争冒险?
举例说明。
答:
通常有三种消除的方法:
1)代数法
若两级门电路的与-或(或者或-与)逻辑表达式在某种输入情况下,变成
或者
形式,则该电路有险象存在。
消除险象的方法是更改电路,消除产生
或
的条件。
2)卡诺图法
在卡诺图中,两个方格群之间只要有一条小边相邻(即两个方格群既不相重迭,彼此之间又有相邻的最小项),则称这两个方格群相接。
有相接出现,对应的电路便有可能产生险象。
为了消除这种电路的险象,在相接处加一个搭接块,就可以消除险象。
3)取样脉冲法
一般来说,有多个输入发生状态变化时,险象是难以完全消除的。
当组合逻辑电路的过渡性冒险影响了整个系统的工作时,可以采用取样的办法解决。
取样脉冲仅在输出处于稳态值的期间到来,以保证输出正确的结果,而在没有取样脉冲的期间,输出端的信息是无效的。
实验五D触发器设计
·实验目的
1.掌握时序逻辑电路的基本分析和设计方法;
2.理解触犯器的工作原理,用硬件描述语言实现触发器的门级设计。
·D触发器门级和行为级设计(具有异步清零功能)
1.设计方案
D触发器的门级设计较为简单,就按照指导书的图用与非门可以搭成。
D触发器的行为级设计也容易实现,只需要用Always控制语句进行操作即可。
2.原理说明和框图
对于门级,直接按下面的图搭即可。
对于行为级,由功能表:
0
0
1
1
可以得到时序逻辑
,然后就可以用行为级来描述。
3.代码文件清单
task31.v
task32.v
4.仿真结果及分析说明
行为级:
由上图看出,该触发器的逻辑行为正常,clr端可以正常控制复位。
门级:
5.下载情况
行为级:
用模式6,时钟clk用pin28,clr用键4,D输入端用键3,Q1输出采用D1灯管表示,Q2输出用D2表示。
功能正常。
门级:
模式6,clk用pin28,D输入端用键3,r对应键4,s对应键5,q1显示对应D1,q2对应D2。
功能正常无误。
移位寄存器
1.设计方案
将触发器的输入与输出级联即可得到移位寄存器,这样每次有一个值输入时,第一个触发器就会读入一个值,下一个时钟脉冲沿来临时将这个值传递到下一个触发器,即形成了移位的效果。
同时。
同时设计load端可以直接从输入读数,以及异步清零端。
2.原理说明及框图
如图,用行为级实现单个触发器(可直接置数和异步清零的),将四个触发器单元级联起来就可得到移位寄存器。
3.代码文件清单
Task33.v
4.仿真结果及分析说明
由上图知该寄存器的移位,异步清零,置数功能均正确无误。
5.下载情况
用模式5,clk用自带pin28,clr用键8,load用键7,set用键6~键3,输入in用键3.用D1~D4表示输出。
功能正确。
·JK触发器
1.设计方案
直接用行为级设计,根据jk触发器的表达式为:
所以直接实现即可。
2.原理说明及框图
上图为jk触发器真值表,由此得到了其输出布尔方程。
其门级排布如下:
3.代码文件清单
Task34.v
4.仿真结果及分析说明
如图所示,功能正常
实验8累加器设计
·实验目的
1.掌握时序逻辑电路的基本分析和设计方法;
2.初步了解模块化设计的思想,理解累加器的工作原理,用硬件描述语言实现指定功能的累加器设计。
·4位累加器
1.设计方案
需要用两个模块,一个用来进行保存工作,即累加器,另一个用来实现数据相加,即加法器。
这样即可每次把数据加到总和里,实现累加器的工作。
2.原理说明及框图
基本原理为书上的结构图。
只要实现了两个主要模块,再用线网连接即可。
3.代码文件清单
Dts.v
Adder.v
Task41.v
4.仿真结果及分析说明
由仿真结果知该累加器功能正常。
5.下载情况
采用模式0,clk用自带的pin28,clr用键7,en使能端用键8,co进位输出用D1表示,输入in用键1,输出用译码器5.经过验证功能正确。
·2位乘法器
1.设计方案
根据题目要求,需要用累加器和计数器来实现此乘法运算。
即用一个数作为累加的次数,另一个数作为每次累加的数。
分两个模块,一个累加器,一个计数器即可实现。
2.原理说明及框图
计数器控制累加的次数,初始时累加计数器清零。
计数器:
乘法器:
由于是两位的二进制数,所以计数器只用写两位的即可。
3.仿真结果及分析说明
由上面几组结果可知该乘法器计算结果正常。
4.文件清单
Counter.v
Addst.v
Task42.v
5.下载情况
用模式1,clk用pin28(高频),键2,1输入a,键4,3输入b,clr键8,rst用键7,输出out用译码器5显示。
功能正确无误。
·思考题
1.给出锁存器的定义,它与边沿触发器的区别是什么?
答:
锁存器是一种对脉冲电平敏感的存储单元电路,它可以在特定输入脉冲电平作用下改变状态。
边沿触发器只有在固定的时钟上升沿或者下降沿来临时改变状态。
可以通过锁存器实现边沿触发器。
2.利用乘法器实现乘法操作,当乘法完成时,用哪些方法可以控制累加器停止累加?
答:
用两个异或门,比较计数器的输出与一个加数的大小,若相等时则输出低电平到累加器的使能端,则可停止累加。
实验9序列检测器的设计
·实验目的
掌握利用有限状态机实现时序逻辑的方法。
1实验原理:
有限状态机(FSM)本质上是由寄存器和组合逻辑电路构成的时序电路。
次态由当前状态和输入一起决定,状态之间的转移和变化总是在时钟沿进行。
有限状态机分为Moore型和Mealy型。
Moore型有限状态机输出仅由当前状态决定;Mealy型有限状态机输出由当前状态和输入同时决定。
有限状态机的组合逻辑电路部分:
由当前状态和输入得到次态和输出。
时序部分:
在时钟沿到来时把把次态打入寄存器。
1)实验内容:
(1).设计一个最简的状态机,功能是检测一个5位的二进制序列“10101”,当连续的5个输入为10101时,在第三个1出现时输出1,其他情况输出0。
输入序列不可重复检测。
设计方案:
设计一个5位的序列检测器。
利用Mealy型状态机实现。
需要5个状态:
Empty:
初始状态
State1:
输入为1
State10:
输入为10
State101:
输入为101
State1010:
输入为1010
状态转换表:
Presentstate
Nextpresent
Output
0
1
0
1
Empty
Empty
State1
0
0
State1
State10
State1
0
0
State10
Empty
State101
0
0
State101
State1010
State1
0
0
State1010
Empty
Empty
0
1
经过状态化简,上面状态已经为最简状态。
状态装换图:
在用HDL代码实现时,利用always块和case语句实现有限状态机。
电路框图:
3代码文件:
Task5.v
4仿真结果:
5下载情况:
模式0,clk用键8手动输入,in用键6输入,reset键7,out输出采用译码器1。
功能正确无误。
·思考题
1.如果本实验内容要求输入序列不可以重复使用,所设计的序列检测器会不会变得更复杂?
情说明原因。
答:
如果按照我的设计思路,采用状态机设计或者是采用移位寄存器,都不会让实现变复杂。
对于状态机的实现方式,只需要做一个小小的改动,当现状态为1010时,若输入为1,此时不要回到状态101,而是回到状态0,这个状态机便不能重复检测序列了。
对移位寄存器的实现方式,当输出为1时,利用移位寄存器的clr清零端,让其清零,移位寄存器便回到了全0状态,相当于不能重复检测了。
2.说明行为级描述和门级描述的优缺点。
答:
优点
缺点
门级
逻辑清楚,逻辑单元数目清晰可见,节省资源与空间
代码过长,效率不高,对于复杂的状态机问题很难实现
行为级
抽象级别高,代码简洁,容易实现,不用涉及电路的具体实现方式
无法了解电路详细结构,可能导致资源浪费,对电路难以实现宏观规划
实验21HDB3编解码器设计
·实验目的
掌握结构化设计方法,理解系统级/行为级设计思路
理解HDB3码的原理并掌握HDB3编码器和解码器的设计方法。
1实验原理
HDB3码型说明:
HDB3码是伪三进制信号,它的三个状态可用B+,B-和0表示。
但是对4个连空号应用特殊规则——引入交替翻转的“破换点”。
4个0000被000V或B00V取代,其中V表示破坏点。
选取原则是:
使得任意两个相邻的V之间的B脉冲数目为奇数,这样,相邻V脉冲的极性也满足交替规律,因而整个信号保持无直流分量。
HDB3编码器原理:
由于当前输出的HDB3码不仅与当前输入的NRZ码有关,还与以前输入的NRZ码有关,所以这种码是有记忆的,需要移位寄存器来储存之前的编码信息。
通过对于HDB3码型的分析可以发现HDB3码在编码时的一个最大的特点就是每一个V码的极性总是与前一个出现的B码的极性相同,这是由于HDB3码中两个V码之间的B码个数为奇数这一特性造成的,也是在进行HDB3编码时利用到的最重要的性质。
在进行编码的过程中,需要标记出上一次出现B码的极性、上一次出现V码的极性以及上一次V码出现之后B码个数的奇偶性三个变量,但是利用上面提到的HDB3码的性质,上述三个变量中只有两个是相互独立的,即只要确定了上一次出现B码的极性和上一次出现V码的极性,那么上一次V码出现之后B码个数的奇偶性也自然可以确定下来。
这样当输入出现连续四个零时,只需根据两个标记变量的情况进行回溯即可确定V码和B码的极性(是否需要插入B码),完成初步的编码。
在完成初步的编码后还需要注意的是,因为HDB3码是占空比为50%的归零码,而在初步编码后得到的结果是非归零码,因此还需要对初步编码的结果进行进一步的处理转化从而得到符合要求的HDB3码。
HDB3解码器原理
解码器的工作原理相对于编码器而言更为简单一些。
HDB3解码器不能做到实时解码,在出现V码时需要进行长度为4的回溯,将这四个码重新解码为零,因此在解码器中也需要利用移位寄存器来存储之前的解码信息。
在解码器中最关键的就是找出V码并进行回溯,这里用到的是HDB3码性质的另外一种表述形式,即连续两个B码的极性不同,而一个B码接着一个V码时极性相同。
这样只需用一个标记变量标记出上一次出现的码的极性即可判断出当前的码是否为V码,从而完成解码。
M序列发生器
实验中,M序列发生器用来产生RXD节点的NRZ码。
其原理就是利用移位寄存器产生一种伪随机序列。
在具体实现时,只需将移位寄存器的最高两位进行异或作为最低位的输出,其它位由低向高进行移位操作,最高为作为整个M序列发生器的输出即可。
M序列接收器
M序列接收器是与M序列发生器相应的结构。
将经过编解码后的结果作为其输入,利用M序列自身的性质进行检测。
如果编解码正确,则接收器的输出应为全零。
2仿真结果
如图所示,M序列生成检测,以及回环测试结果正常
3代码文件
HDB3.v
Task52.v
4下载情况
模式7
FPGA实验总结
通过这天的实验,使我从零基础开始,一步一步了解、掌握Verilog语法及使用方法,初步了解了通信系统中编解码的基本工作原理及其他简单数字系统的系统级设计方法,学会如何利用FPGA实现实际的各种功能。
可以说正是通过这种综合性实验的锻炼,才使得我们能够把课堂上所学的知识更好的应用到实际工作当中,为我们今后的发展奠定坚实的基础。
尽管有些知识和语言上刚开始还很生涩,但是凭借这几天的学习以及同学和助教对我的帮助,让我掌握了Verilog的初步应用。
正是老师,助教同学对我的帮助,才能让我顺利完成实验。
谢谢大家!