4b5b编码器.docx
《4b5b编码器.docx》由会员分享,可在线阅读,更多相关《4b5b编码器.docx(14页珍藏版)》请在冰豆网上搜索。
4b5b编码器
电子科技大学
UNIVERSITYOFELECTRONICSCIENCEANDTECHNOLOGYOFCHINA
数字电路
课程设计报告
课程设计题目4b5b编码器
学号2014020905009
作者姓名宁博宇
指导教师陈学英胡剑浩
摘要
通过VHDL编码,实现4位输入到五位输出的4B5B编码器,具体要求见真值表。
要求编码时先用普通逻辑编写,再换用与非门重新编写。
关键词:
4b5b
第一章绪论
一.1课程设计背景
在IEEE802.9a等时以太网标准中的4B:
5B编码方案,因其效率高和容易实现而被采用。
在同样的20MHz钟频下,利用4B:
5B编码可以在10兆位/秒的10Base-T电缆上得到16兆位/秒的带宽。
其优势是可想而知的。
4B:
5B编码方案是把数据转换成5位符号,供传输。
这些符号保持线路的交流(AC)平衡;在传输中,其波形的频谱为最小。
信号的直流(DC)分量变化小于额定中心点的10%。
这种编码的特点是将欲发送的数据流每4bit作为一个组,然后按照4B/5B编码规则将其转换成相应5bit码。
5bit码共有32种组合,但只采用其中的16种对应4bit码的16种,其他的16种或者未用或者用作控制码,以表示帧的开始和结束、光纤线路的状态(静止、空闲、暂停)等。
一.2实验要求
1.初步学习ISE使用环境
2.利用卡诺图对编码真值表进行化简,得出逻辑表达式
3.基于表达式进行硬件设计,采用基本门结构化描述
4.编写TestBench文件,并进行仿真
一.3完成目标
1.通过得出的逻辑表达式编写VHDL程并仿真。
2.全部利用与非门构造4B5B编码器并仿真。
实验原理
1.4.1要求的真值表(要求输入的为4位,输出的为五位)
1.4.2由真值表产生的卡诺图
设输入的4位编码为:
ABCD,输出的5位编码为:
VWXYZ。
由以上五个卡诺图可知,若输入为ABCD,可通过卡诺图得到的逻辑运算得到输出的VWXYZ,从而实现4B5B。
在具体的逻辑设计中,可以用基本方式实现(如运用not,and,or等),也可以用较为复杂的方式实现(如全部用nand编写)。
实验过程
1.5源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--useIEEE.NUMERIC_STD.ALL;
--Uncommentthefollowinglibrarydeclarationifinstantiating
--anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitynbyis
port(
a3:
inSTD_LOGIC;
a2:
inSTD_LOGIC;
a1:
inSTD_LOGIC;
a0:
inSTD_LOGIC;
b4:
outSTD_LOGIC;
b3:
outSTD_LOGIC;
b2:
outSTD_LOGIC;
b1:
outSTD_LOGIC;
b0:
outSTD_LOGIC);
endnby;
architectureBehavioralofnbyis
begin
b0<=a0;
b1<=((nota1)and(nota0))or((nota3)anda2)or(a3and(nota2))or(a3and(nota1));
b2<=((nota3)and(nota2)and(nota0))ora1;
b3<=a2or((nota3)and(nota1));
b4<=a3or(a1and(nota2))or((nota3)and(nota2)and(nota0));
endBehavioral;
以上程序为普通逻辑编写,为提高难度用逻辑转换关系再换用与非门重新编写,新程序如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--useIEEE.NUMERIC_STD.ALL;
--Uncommentthefollowinglibrarydeclarationifinstantiating
--anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitynb4b5bis
port(
a3:
inSTD_LOGIC;
a2:
inSTD_LOGIC;
a1:
inSTD_LOGIC;
a0:
inSTD_LOGIC;
b4:
outSTD_LOGIC;
b3:
outSTD_LOGIC;
b2:
outSTD_LOGIC;
b1:
outSTD_LOGIC;
b0:
outSTD_LOGIC);
endnb4b5b;
architectureBehavioralofnb4b5bis
begin
b0<=a0;
b1<=(not(((nota1)nand(nota0))nand((nota3)nanda2)))nand(not((a3nand(nota2))nand(a3nand(nota1))));
b2<=((not((nota3)nand(nota2)))nand(nota0))nand(nota1);
b3<=(nota2)nand((nota3)nand(nota1));
b4<=(not((nota3)nand(a1nand(nota2))))nand((not((nota3)nand(nota2)))nand(nota0));
endBehavioral;
1.6仿真程序(测试程序)
因为端口没有发生改变,所以普通逻辑和与非逻辑采用相同测试代码:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--USEieee.numeric_std.ALL;
ENTITYn4b5bIS
ENDn4b5b;
ARCHITECTUREbehaviorOFn4b5bIS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTnby
PORT(
a3:
INstd_logic;
a2:
INstd_logic;
a1:
INstd_logic;
a0:
INstd_logic;
b4:
OUTstd_logic;
b3:
OUTstd_logic;
b2:
OUTstd_logic;
b1:
OUTstd_logic;
b0:
OUTstd_logic
);
ENDCOMPONENT;
--Inputs
signala3:
std_logic:
='0';
signala2:
std_logic:
='0';
signala1:
std_logic:
='0';
signala0:
std_logic:
='0';
--Outputs
signalb4:
std_logic;
signalb3:
std_logic;
signalb2:
std_logic;
signalb1:
std_logic;
signalb0:
std_logic;
--Noclocksdetectedinportlist.Replacebelowwith
--appropriateportname
--
--constant_period:
time:
=10ns;
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
nbyPORTMAP(
a3=>a3,
a2=>a2,
a1=>a1,
a0=>a0,
b4=>b4,
b3=>b3,
b2=>b2,
b1=>b1,
b0=>b0
);
--Clockprocessdefinitions
--_process:
process
--begin
--<='0';
--waitfor_period/2;
--<='1';
--waitfor_period/2;
--endprocess;
--
--Stimulusprocess
stim_proc:
process
begin
a3<='0';
a2<='0';
a1<='0';
a0<='0';
waitfor100ns;
a3<='0';
a2<='0';
a1<='0';
a0<='1';
waitfor100ns;
a3<='0';
a2<='0';
a1<='1';
a0<='0';
waitfor100ns;
a3<='0';
a2<='0';
a1<='1';
a0<='1';
waitfor100ns;
a3<='0';
a2<='1';
a1<='0';
a0<='0';
waitfor100ns;
a3<='0';
a2<='1';
a1<='0';
a0<='1';
waitfor100ns;
a3<='0';
a2<='1';
a1<='1';
a0<='0';
waitfor100ns;
a3<='0';
a2<='1';
a1<='1';
a0<='1';
waitfor100ns;
a3<='1';
a2<='0';
a1<='0';
a0<='0';
waitfor100ns;
a3<='1';
a2<='0';
a1<='0';
a0<='1';
waitfor100ns;
a3<='1';
a2<='0';
a1<='1';
a0<='0';
waitfor100ns;
a3<='1';
a2<='0';
a1<='1';
a0<='1';
waitfor100ns;
a3<='1';
a2<='1';
a1<='0';
a0<='1';
waitfor100ns;
a3<='1';
a2<='1';
a1<='1';
a0<='0';
waitfor100ns;
a3<='1';
a2<='1';
a1<='1';
a0<='1';
waitfor100ns;
wait;
endprocess;
END;
1.7仿真波形
普通逻辑:
与非逻辑:
实验结果与分析
1.8实现的目标
运用VHDL编程实现了4B5B编码器,运用了两种编码方式,一种是普通的编码,另一种是全部使用与非门的较为复杂的编码。
1.9分析
通过比对可发现输出结果与真值表一一对应,且两种逻辑写法的仿真结果相同,完成了实验目标。
第二章总结与展望
第一次运用VHDL进行程序的设计与编写,由于设计相对较为简单,又有学长的指导,总的来说进行的较为顺利,可以说这次课程设计主要帮助我熟悉了VHDL的相关操作并且帮助我复习巩固了卡诺图,真值表的相关知识,我希望在未来进行更多的VHDL设计,加强自己的能力。