3用VHDL语言设计HDB3编码器.docx

上传人:b****3 文档编号:4149290 上传时间:2023-05-06 格式:DOCX 页数:11 大小:186.61KB
下载 相关 举报
3用VHDL语言设计HDB3编码器.docx_第1页
第1页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第2页
第2页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第3页
第3页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第4页
第4页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第5页
第5页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第6页
第6页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第7页
第7页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第8页
第8页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第9页
第9页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第10页
第10页 / 共11页
3用VHDL语言设计HDB3编码器.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

3用VHDL语言设计HDB3编码器.docx

《3用VHDL语言设计HDB3编码器.docx》由会员分享,可在线阅读,更多相关《3用VHDL语言设计HDB3编码器.docx(11页珍藏版)》请在冰点文库上搜索。

3用VHDL语言设计HDB3编码器.docx

3用VHDL语言设计HDB3编码器

3用VHDL语言设计HDB3编码器

设计任务与要求

将一串行输入码流编为HDB3码输出(编码部分);将一串行输入的HDB3码解码后串行输出(解码部分)。

3.1HDB3编码器实现的基本原理

从编码规则来分析,这个设计的难点之一是如何判决是否应该插“B”,因为这涉及到由现在事件的状态决定过去事件状态的问题。

按照实时信号处理的理论,这是没办法实现的。

但在实际的电路中,可以考虑用寄存器的方法,首先把信码寄存在寄存器里,同时设置一个计数器计数两个“V”之间“1”的个数,经过4个码元时间后,由一个判偶电路来给寄存器发送是否插“B”的判决信号,从而实现插“B”功能。

不过,信号处理的顺序不能像编码规则那样:

首先把代码串变换成为AMI码,完成插“V”、插“B”工作之后,其后的“+1”和“-1”的极性还要依据编码规则的规定变换。

这样做需要大量的寄存器,同时电路结构也变的复杂。

若把信号处理的顺序变换一下:

首先完成插“V”工作,接着执行插“B”功能。

最后实现单极性变双极性的信号输出。

这样做的好处是:

输入进来的信号和插“V”、插“B”功能电路中处理的信号都是单极性信号,且需要的寄存器的数目可以少很多。

另外,如何准确识别电路中的“1”、“V”和“B”。

因为“V”和“B”符号是人为标识的符号,但在电路中最终的表现形式还是逻辑电平“1”。

解决的方法是利用了双相码,将其用二进制码去取代。

例如,

代码:

110010

双相码101001011001

这样就可以识别电路中的“1”、“V”、“B”。

也可以人为地加入一个标识符(其最终目的也是选择输出“1”的极性)。

控制一个选择开关,使输出“1”的极性能按照编码规则进行变化。

3.2HDB3编码器的设计过程

本设计的思想并不像前面HDB3编码原理介绍的那样首先把消息代码变换成为AMI码,然后进行V符号和B符号的变换,而是在消息代码的基础上,依据HDB3编码规则进行插入“V”符号和插入“B”符号的操作,最后完成单极性信号变成双极性信号的变换。

单/双极性变换

插“B”

插“V”

图3-1HDB3码的编码器模型框图

整个HDB3编码器包含3个功能部分:

插“V”、插“B”和单极性码转变成双极性码。

各部分之间采用同步时钟作用,并且带有一个异步的复位(清零)端口。

下面将详细介绍各个部分的设计流程、编写的源程序模拟仿真的波形图。

(1)插“V”模块的实现

1)、插“V”模块的建模

插“V”模块的功能实际上就是对消息代码里的四连0串的检测即当出现四个连0串的时候,把第四个“0”变换成为符号“V”(“V”可以是逻辑“1”——高电平),而在其他情况下,则保持消息代码的原样输出。

同时为了减少后面工作的麻烦,在进行插“V”时,用“11”标识它,“1”用“01”标识,“0”用“00”标识。

插“V”符号的设计思想很简单:

首先判断输入的代码是什么(用一个条件语句判断),如果输入的是“0”码,则接着判断这是第几个“0”码,则把这一位码元变换成为“V”码。

在其他条件下,让原代码照常输出。

图3-2所示为插“V”符号的流程图

2)插”V”模块的程序设计

插V的程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityhdb3ais

port(reset,clk,datain:

instd_logic;

dout:

outstd_logic_vector(1downto0));

endentity;

architecturertlofhdb3ais

signalcounter:

integerrange0to3;

begin

process(reset,clk,datain)is

begin

ifreset='0'thencounter<=0;dout<="00";

elsif(clk='1'andclk'event)then

ifdatain='0'then

counter<=counter+1;

ifcounter=3then--连4个0了

dout<="11";counter<=0;

else

dout<="00";--没连4个0

endif;

else

dout<="01";--1码

counter<=0;

endif;

endif;

endprocess;

end;

3)插V的仿真波形图:

(2)插”B”模块的实现

1)下面开始加b的算法,主要问题是要把过去的数据拿来处理,这个在通信里很常用,一般方法是将输入的数据,放入一串寄存器中,处理完之后,在输出,或者边处理边输出.

由加v和加b的准则可以知道,v前面必定有3个0,加b的目的就是要把000中的第一个设置成b而且极性和v相反.这个算法就是把过去的三个数据比较如果是三个0,就处理第一个0.

所以可以设四个寄存器.

输入的数据:

110001

每个寄存器所接受过的数据的顺序:

1

10

100

1000

0001

由此可见算法很明了.设置两个临时reg变量even,flag.

Flag用来标志两个v之间,即如果输入为11(v)则flag=1,如果,输入为others则输出为0;

所以可以知道在两个v之间flag是为0的.

Even用来在两个v之间标志1的奇,偶.偶为0,奇为1.

同时要注意设置flag是检测d0,设置even是检测d3.

另外强烈建议注意if(条件)else语句的时序,就是如果条件里含有临时reg变量,则数据的输出是下一个状态.

2)基本流程:

图3-3插“B”功能的流程图

3)插B模块的程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityhdbis

port(reset,clk:

instd_logic;

datain:

instd_logic_vector(1downto0);

dout:

outstd_logic_vector(1downto0));

end;

architecturertlofhdbis

signalD1,D0:

std_logic_vector(3downto0);

signalflag,even:

integerrange0to1;

begin

process(clk,datain)is

begin

if(clk='1'andclk'event)then

D1(3)<=datain

(1);

D0(3)<=datain(0);

D1(2downto0)<=D1(3downto1);

D0(2downto0)<=D0(3downto1);

endif;

endprocess;

process(reset,clk,D1,D0)is

begin

ifreset='0'then

flag<=0;

even<=0;

elsif(clk='1'andclk'event)then

if(D1(3)='1'andD0(3)='1')then

flag<=1;

elseflag<=0;

endif;

if(D1(0)='0'andD0(0)='1')then

even<=even+1;

elsif(D1(0)='1'andD0(0)='1')then

even<=0;

endif;

endif;

endprocess;

process(reset,clk)is

begin

ifreset='0'thendout<="00";

elsif(clk='1'andclk'event)then

if(flag=0andeven=0and(D1(3)='1'andD0(3)='1'))then

dout<="10";

elsedout<=D1(0)&D0(0);

endif;

endif;

endprocess;

end;

4)插B模块的波形图:

(3)单极性变双极性的实现

1)建模

下面进行极性转化,当进行加v加b之后我们要把数据传输,不可能把加v加b的数据就传出去了,我们要让电路输出电压,来代表你的数据格式.

我们知道hdb3编码是极性交错的,所以可以通过把加v加b后的编码,转换后,用选择器选择电压值,以次传输.

自己可以规定:

01;正电压

11:

负电压.

00:

0电压.

基本思路:

由编码可以知道,v的极性和前面一个非0值的符号都是一样的.而1和b之间是+,-交错的.

2)基本流程图:

图3-4单/双极性变换控制流程图

3)单/双极性变换程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityhdb3cis

port(reset,clk:

instd_logic;

datain:

instd_logic_vector(1downto0);

dout:

outstd_logic_vector(1downto0));

endentity;

architecturertlofhdb3cis

signaleven:

std_logic;

begin

process(reset,clk,datain)is

begin

ifreset='0'then

even<='0';

dout<="00";

elsif(clk='1'andclk'event)then

ifdatain="11"then

ifeven='1'then

dout<="01";--正电平1

elsedout<="11";--负电平1

endif;

elsif(datain="01"ordatain="10")then

ifeven='1'theneven<='0';

dout<="11";

elseeven<='1';

dout<="01";

endif;

elsedout<="00";

endif;

endif;

endprocess;

end;

4)仿真的波形图如下:

3.3HDB3编码器仿真波形

图3-5HDB3编码器仿真波形

波形分析

图3-5是一路信码经过插V补B后的输出波形仿真图,输出相对与输入延时了6个脉冲周期。

图中datain表示码元输入;clk表示时钟输入;dout[1..0]表示经过插V、插B和极性变换后的二进制数码输出,00表示0码,01表示1,11表示-1。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2