HDB3编码器
一、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编码器的更多相关文章
- FPGA旋转编码器的实现
module pmodenc( clk, rst_n, A, B, BTN,// A_Debounce,// B_Debounce,// BTN_Debounce,// Rotary_right,// ...
- STM32f103 定时器之编码器接口模式
背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...
- 【Arduino】旋转编码器的Arduino使用方法
以前用CRT显示器的时候,调整显示器的时候用一个圆盘转动和点击的方法就可以实现选择菜单和修改设置项的值,比多个按钮的方式方便很多. 鼠标滚轮也是这种操作方法,旋转+点击,只是方向不同.最近在网上买了旋 ...
- 基于eBox旋转编码器
在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch.常见的有5pin和3pin产品.5pin实在左右旋转的基础上增加了向下按得 ...
- (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程
变分自编码器(Variational Autoencoder, VAE)通俗教程 转载自: http://www.dengfanxin.cn/?p=334&sukey=72885186ae5c ...
- 【HEVC】1、HM-16.7编码器的基本结构
编码器在整个HM解决方案中的工程名为TAppEncoder,入口点函数位于encmain.cpp文件中: int main(int argc, char* argv[]) { TAppEncTop c ...
- STM32正交编码器驱动电机
1.编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向. 这里使用了TI12模式,例如当T1上升 ...
- Verilog学习笔记简单功能实现(四)...............译码器和编码器
这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...
- 全信号高清DVI编码器|上海视涛科技
高清DVI编码器(E700)简介 高清DVI编码器是上海视涛科技出品的高性能全信号DVI编码产品.该DVI编码器是上海视涛科技完全自主研发,并适用于DVI信号的编码采集及网络传输的专用硬件设备.可兼容 ...
随机推荐
- 【拓扑排序】烦人的幻灯片(slides)
1395:烦人的幻灯片(slides) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 753 通过数: 416 [题目描述] 李教授将于今天下午作一次非常重 ...
- nginx+腾讯云免费ssl证书+阿里云ECS实现Https配置
1. 申请SSL证书: 首先我们需要到腾讯云那边申请一个ssl证书,对于个人博客类型的,建议采用免费版本,土豪除外 申请地址:https://console.cloud.tencent.com/ssl ...
- Duplicate entry 'xxx' for key 'xxx'
插入数据的时候 报错,Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplic ...
- Git同步远程fork的项目
通过fork创建的项目,如果远程仓库代码进行了更新,本地需要同步的话,可以在git上创建一个上游仓库 步骤 运行git remote add upstream https://github.com/O ...
- Python中Scrapy框架元素选择器XPath的简单实例
原文标题:<Python网络爬虫-Scrapy的选择器Xpath> 对原文有所修改和演绎 优势 XPath相较于CSS选择器,可以更方便的选取 没有id class name属性的标签 属 ...
- linux系统调用之用户管理
getuid 获取用户标识号 setuid 设置用户标志号 getgid 获取组标识号 setgid 设置组标志号 getegid 获取有效组标识号 setegid 设置有效组标识号 geteuid ...
- Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(待完成)
参考资料: [1]:https://blog.csdn.net/weixin_43790474/article/details/84815383 [2]:http://www.cnblogs.com/ ...
- HDU - 5952 Counting Cliques(DFS)
A clique is a complete graph, in which there is an edge between every pair of the vertices. Given a ...
- (线段判交的一些注意。。。)nyoj 1016-德莱联盟
1016-德莱联盟 内存限制:64MB 时间限制:1000ms 特判: No通过数:9 提交数:9 难度:1 题目描述: 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们 ...
- node(基础三)_模块系统基础
一.前言 这篇文章主 ...