一、HDB3 码介绍

三阶高密度双极性码(英语:High Density Bipolar of Order 3 code,简称:HDB3码)是一种适用于基带传输的编码方式。它是一种 AMI 码的改进型, HDB3 码保持了 AMI 码极性反转的特点, 且减少了连 “0” 的长度,有利于接收端从基带信号中提取定时信息,低频成分少, 提取同步时钟方便, 有内在检错能力等优点, 是 CCITT(国际电报电话咨询委员会) 推荐的使用码型之一, 广泛的应用于数字基带通信。

HDB3 码有以下特点 :基带信号无直流成分,且只有很小的低频成分;连 0串符号最多只有 3 个,利于定时信息的提取;不受信源统计特性的影响,对定时信号的恢复十分有利,而成为普遍使用的基带传输码之一。 在 AMI 码中,如果连续的较长的一段序列为 “0”码, 则接收端会因为长时间无交替变化波形的控制而失去同步信号,而 HDB3 码克服了 AMI 码的上述缺点。此外, HDB3码还具有频谱能量主要集中在基波频率以下,占用频带较窄等特点。

二、编码规则

1、连0的个数不超过3时,规则与AMI相同,即0不变,1变为-1、+1交替;

2、若连0的个数超过3,则将每4个0看作一小节,定义为B00V,B可以是-1、0、+1,V可以是-1、+1;

3、B和V具体值满足以下条件:V和前面相邻非0符号极性相同;不看V时极性交替;V与V之间极性交替;

4、一般第一个B取0,第一个非0符取-1。

由于V会破坏极性交替的规律、B有3种变化以满足规则,所以V称为破坏脉冲、B称为调节脉冲,B00V称为取代节、破坏节。

HDB3编码举例

代码

1

0

0

0

0

1

1

0

0

0

0

0

1

HDB3

+1

0

0

0

+1

-1

+1

-1

0

0

-1

0

+1

V/B

       

+V

   

-B

   

-V

   

三、HDB3 码编程实现

3.1、编码器要求

HDB3编码器输入信号为: 一路串行2.048MB/S合路数据流,一路2.048MB/S位同步时钟脉冲。

HDB3编码器输出信号为: 一路串行2.048MB/S合路HDB3编码的正极性数据流H+,一路串行2.048MB/S合路HDB3编码的负极性数据流H-,一路2.048MB/S位同步时钟脉冲。

3.2、编码器总体思想

HDB3编码规则分析:

1、对输入为1码元交替翻转编码,即:依次在H+和H-端口输出1。

2、对输入为0码元同时在H+和H-端口输出0。

3、当连续输入4个0码元,且与上一个连续0码元之间1码元为奇数个时,第四个0码元改为1码元,且与之前1码元的最后一个1码元同极性,即:在同端口输出。

4、当连续输入4个0码元,且与上一个连续4个0码元之间1码元为偶数个时,第一个0码元改为1码元,与之前1码元的最后一个1码元反极性,即:在不同端口输出,第四个0码元改为1码元,且与之前1码元的最后一个1码元同极性,即:在同端口输出。

3.3、HDB3编码VHDL语言设计方案提示:

1、逐位处理输入输出数据,即:每输入一比特数据就判断处理,并在H+和H-端口同时输出一位比特脉冲.

2、为了能修改含本时钟之前4个时钟周期的输出比特,至少应移位缓存4比特输出

3、为了能处理本时刻输入的比特,应该至少已知以下状态信息:

1)、输出“1”时,确定下次1码元输出端口的确定,即极性是+或-;每输入一个“1”,极性反转一次,记录信息X

2)、更新“B00V”时,记录信息Y=1,当Y=1时,极性再反转一次X,(两次反转即同极性)

3)、开辟一个当前是否为连续“0000”;

记录两个连续“0000”之前连续1的个数记数,(即奇偶数)Z。

如何准确识别电路中的 1、V、B。因为 V和B符号是人为标志的符号, 但在电路中最终的表现形式还是逻辑电平 “1”。解决的方法是利用双相码 , 将其用二进制代码分别表示 。双相码的编码规则是:对每个二进制代码分别利用 2个不同相位的二进制码取代 。利用双相码就可以识别电路中的 1、V、B。也可以人为地加入一个标志符(其最终目的也是选择输出“1”的极性), 控制一个开关 ,使输出“1”的极性能按照编码规则进行变化。

本设计的总体思想并不是首先把消息代码变成 AMI码 ,而是进行 V符号的插入, B符号的操作, 最后完成单极性信号变成双极性信号的转换 (在插入V的时候同时把信息流变成双相码)。本设计的HDB3码的编码器模型框图见图 1。

3.3.1、插 V模块实现

当出现 4个连 0串时, 把第 4个 0变换成符号 V(V可以是逻辑 1———高电平 ), 而在其他情况下,则保持消息代码的原样输出。同时 ,为了减少后面工作的麻烦,在进行插 V时, V用 11标识, 1用01标识, 0用 00标识。插 V符号的流程见图 2。

3.3.2、插 B模块实现

插 B模块的功能是保证附加 V符号后的序列不破坏“极性交替反转”造成的无直流特性 ,即当相邻 V符号之间有偶数个非 0符号时, 把后一小段的第 1个0变换成一个非破坏符号———B符号 。图 3所示为实现插 B功能的流程图 。

3.3.3、单极性变双极性的实现

根据 HDB3码的编码规则 ,V的极性是正负交替翻转的,余下的 1和 B看成为一体且是正负交替翻转的 ,同时满足 V的极性与前面的非 0码极性一致,由此可以单极性变双极性的实现。V、B、1前面进程已经分别用双相码 11、10、01表示, 所以在此基础上从单极性变双极性的实现比较简单。根据编码规则, B符号的极性与前一非零符号相反, V极性符号与前一非零符号一致。因此将 V单独拿出来进行极性变换,余下的 1和 B看成一体进行正负交替 ,这样就完成了 HDB3的编码。

3.4、HDB3编码器代码

--hdb3编码器
--输入:一路串行2.408mb/s的合路数据流和一路2.048mb/s的时钟脉冲.
--输出:.048mb/s hdb3编码正负极性的数据流,和一路2.048mb/s时钟脉冲.
-- hdb3码用两位矢量表示:用01表示+,用00表示00,用10表示-.
library ieee;
use ieee.std_logic_1164.all;
entity hdb3_encoder is
port(codein:in std_logic;
clk:in std_logic;
clr:in std_logic;
codeout:out std_logic_vector( downto )
);
end entity hdb3_encoder; architecture encoder of hdb3_encoder is
signal codeoutv:std_logic_vector( downto ); --作为插入的v进程存储处理的编码,用11
signal count0:integer:=; --数4个连0
signal s0:std_logic_vector( downto ):=""; --两个5位寄存器
signal s1:std_logic_vector( downto ):="";
signal count1:integer range downto ; --数两个v之间1的奇偶
signal codeoutb:std_logic_vector( downto );
signal clkb:std_logic;
signal s3:std_logic_vector( downto );
signal flag1b:integer range downto ;
signal flagv:integer range downto ;
signal firstv:integer range to ;
component dff --实例化d触发器,用来移位
port(d:in std_logic;
clk:in std_logic;
q:out std_logic);
end component;
begin
--插入V
process(clk,clr) begin
if(rising_edge(clk))then --上升沿触发
if(clr='')then
codeoutv<="";
count0<=;
else
case codein is --clr=0时,才编码
when '' => codeoutv<="";
count0<=;
when ''=>
if(count0=)then
codeoutv<=""; --4个连0插入v
count0<=;
else
count0<=count0+;
codeoutv<="";
end if;
when others=>
codeoutv<="";
count0<=count0;
end case;
end if;
end if;
end process ;
s0()<=codeoutv();
s1()<=codeoutv();
ds11:dff port map(s1(), clk, s1()); --移位
ds01:dff port map(s0(), clk, s0());
ds12:dff port map(s1(), clk, s1());
ds02:dff port map(s0(), clk, s0());
ds13:dff port map(s1(), clk, s1());
ds03:dff port map(s0(), clk, s0());
bclk: clkb<= not clk;
--插入B
process(clkb)
begin
if(rising_edge(clkb))then
if(codeoutv="")then
if(firstv=)then
count1<=;
firstv<=;
s1()<=s1();
s0()<=s0();
else
if(count1=)then
s1()<=''; --插入b
s0()<='';
count1<=;
else
s1()<=s1();
s0()<=s0();
count1<=;
end if;
end if;
elsif(codeoutv="")then
count1<=count1+;
s1()<=s1();
s0()<=s0();
else
s1()<=s1();
s0()<=s0();
count1<=count1;
end if;
end if;
end process ;
codeoutb<=s1()&s0();
--极性翻转
process(clk)
begin
if(rising_edge(clk))then
if((codeoutb="")or(codeoutb=""))then
if(flag1b=)then --fla1b标志1和V的极性
codeout<=""; --输出+
flag1b<=;
else
codeout<=""; --输出-
flag1b<=;
end if;
elsif(codeoutb="")then --V的极性变化
if(flag1b=)then
codeout<="";
else
codeout<="";
end if;
else
codeout<=""; --0的极性不需要变化
flag1b<=flag1b;
end if;
end if;
end process ;
end encoder;

仿真波形图:

1、输入 1 0 0 0 0 1 1 0000000000…

2、输入全0

3、输入全1

HDB3编码器的更多相关文章

  1. FPGA旋转编码器的实现

    module pmodenc( clk, rst_n, A, B, BTN,// A_Debounce,// B_Debounce,// BTN_Debounce,// Rotary_right,// ...

  2. STM32f103 定时器之编码器接口模式

    背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...

  3. 【Arduino】旋转编码器的Arduino使用方法

    以前用CRT显示器的时候,调整显示器的时候用一个圆盘转动和点击的方法就可以实现选择菜单和修改设置项的值,比多个按钮的方式方便很多. 鼠标滚轮也是这种操作方法,旋转+点击,只是方向不同.最近在网上买了旋 ...

  4. 基于eBox旋转编码器

    在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch.常见的有5pin和3pin产品.5pin实在左右旋转的基础上增加了向下按得 ...

  5. (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程

    变分自编码器(Variational Autoencoder, VAE)通俗教程 转载自: http://www.dengfanxin.cn/?p=334&sukey=72885186ae5c ...

  6. 【HEVC】1、HM-16.7编码器的基本结构

    编码器在整个HM解决方案中的工程名为TAppEncoder,入口点函数位于encmain.cpp文件中: int main(int argc, char* argv[]) { TAppEncTop c ...

  7. STM32正交编码器驱动电机

    1.编码器原理        什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向. 这里使用了TI12模式,例如当T1上升 ...

  8. Verilog学习笔记简单功能实现(四)...............译码器和编码器

    这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...

  9. 全信号高清DVI编码器|上海视涛科技

    高清DVI编码器(E700)简介 高清DVI编码器是上海视涛科技出品的高性能全信号DVI编码产品.该DVI编码器是上海视涛科技完全自主研发,并适用于DVI信号的编码采集及网络传输的专用硬件设备.可兼容 ...

随机推荐

  1. Nginx log日志参数详解

    $args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符 ...

  2. poj3680 Intervals (费用流)

    建图((x,y,c,l)表示x到y,费用c,流量l) (S,1,0,K) (i,i+1,0,K) 这个边上的流量,表示i还可以被覆盖的次数 (N,T,0,K) (i,j,w,1)对于权值为w的区间[i ...

  3. DBC格式解析(以文本形式打开)

    我们先来看一段数据 BO_ 1024 VOLTAGE01: 8 BMS2 SG_ V01 : 7|16@0+ (0.001,0) [0|0] "" Vector__XXX SG_ ...

  4. Keepalived+Nginx搭建主从高可用并带nginx检测

    应用环境:部分时候,WEB访问量一般,或者测试使用,利用Keepalived给Nginx做高可用即可满足要求. 测试环境:   搭建步骤: 1. 安装软件 在Nginx-A和Nginx-B上: ~]# ...

  5. 码农眼中的数学之~矩阵专栏(附Numpy讲解)

      2.矩阵专栏¶ 吐槽一下:矩阵本身不难,但是矩阵的写作太蛋疼了 (⊙﹏⊙)汗 还好有Numpy,不然真的崩溃了... LaTex有没有一个集成了很多常用公式以及推导或者含题库的在线编辑器? 代码裤 ...

  6. Spring的核心

    技术书籍这么多,每次好不容易读完一本,但总过不了多久就会遗忘.为了对抗,整理记录和回看,也是实属必要.由此,从这<Spring 实战(第四版)>开始,记录一下知识点,下次再要复习时,能免去 ...

  7. gei 操作

    git --version 查看版本号 进入项目文件 上传账号的用户名git config --global user.name "牛星宇" 上传账号的邮箱git config - ...

  8. 【听RQY大佬“训话”有感】

    今天听了山东省“红太阳”——RQY大佬(dalao获奖传送门)的讲话,做一下总结及感悟: 总结: 1.基础重要!!!.基础重要!!!.基础重要!!!(重要的事情说三遍) 只要基础好了,后面知识都很简单 ...

  9. node.js(小案例)_实现学生信息增删改

    一.前言 本节内容主要对小案例做一个总结: 1.如何开始搭建小项目 2.路由设计 3.模块应用 4.项目源码以及实现过程github地址: 项目演示如下: 二.主要内容 1.项目的关键性js源码: 项 ...

  10. python自动化开发-[第十七天]-django的ORM与其他

    今日概要: 1.name别名 2.模版的深度查询 3.模版语言之filter 4.自定义过滤器,filter和simpletag的区别 5.orm进阶 扫盲:url的组成 URL:协议+域名+端口+路 ...