3用VHDL语言设计HDB3编码器.docx
- 文档编号:10536538
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:11
- 大小:186.61KB
3用VHDL语言设计HDB3编码器.docx
《3用VHDL语言设计HDB3编码器.docx》由会员分享,可在线阅读,更多相关《3用VHDL语言设计HDB3编码器.docx(11页珍藏版)》请在冰豆网上搜索。
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。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用VHDL语言设计HDB3编码器 VHDL 语言 设计 HDB3 编码器