基于FPGA的HDB3编译码verilog实现,包括testbench

发布时间 2023-05-23 12:32:05作者: 我爱C编程

1.算法仿真效果

vivado2019.2仿真结果如下:

 

 

2.算法涉及理论知识概要

       数字基带信号的传输是数字通信系统的重要组成部分。在数字通信中,有些场合可不经过载波调制和解调过程,而对基带信号进行直接传输。采用AMI码的信号交替反转,有可能出现四连零现象,这不利于接收端的定时信号提取。而HDB3码因其无直流成份、低频成份少和连0个数最多不超过三个等特点,而对定时信号的恢复十分有利,并已成为CCITT协会推荐使用的基带传输码型之一。

 

      三阶高密度双极性码(英语:High Density Bipolar of Order 3 code,简称:HDB3码)是一种适用于基带传输的编码方式,它是为了克服AMI码的缺点而出现的,具有能量分散,抗破坏性强等特点。

       三阶高密度双极性码用于所有层次的欧洲E-carrier系统,HDB3码将4个连续的“0”位元取代成“B00V”。这个做法可以确保连续的violations are of differing polarity,即是相隔单数的一般B记号。

 

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

 

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

 

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

 

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

 

        VV之间如果出现偶数个B时,应在后一个V字节补一个B',定义为B'00VB'与前面相邻的B之间符号极性相反,这个字节的VB'符号极性相同。

 

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

 

±1和±B、±V没有区别,这里只是说明它们是0变来的。

-B为补码,值为-1,此字节V符号跟随,为-V

由规则导出的一种编码方法,个人认为这是机器实现时最效率的思路之一:

1、源码是1时,暂时不变;

2、连0不超过3个时不变,有4个或以上连0时把每40换为取代节,即B00V

3、确定B0还是±1:第一个B一般取0,若两个取代节之间1的个数为偶,易推得后者的B一定是±1,此时B1遵循的规则完全相同,可以直接记为1,即100V;为奇则一定是0,记为0,即000V

4、统一确定极性:第一个非0符一般取-1,之后,根据前一个非0符极性,V取同,1取反;

手算的方法多种多样,理清规则,遵循“先满足V之间极性交替,然后确定B”的大方向,皆可迎刃而解。

       常见的错误:经常出现 “第一步先转成AMI” 的表述,这无论对于手算还是编程,实际操作起来都是多余的步骤。如例子中的最后一位,HDB3码和AMI码相反,AMI码和HDB3码的极性没有必然关系,因此转成AMI既决定不了1码最终的极性,又不改变0,对HDB3编码过程没有任何帮助。HDB3是改进的AMI,提到它主要是追根溯源、做对比,起到帮助理解记忆的作用,并不是一定要在编码过程中用到它。

 

1、虽然编码很复杂,但解码规则很简单,就是把原来的取代节(4个连零)找到即可,若3连“0”前后非零脉冲同极性,则将最后一个非零元素译为零,如+1000+1 就应该译成“10000”,否则不用改动;若2连 “0”前后非零脉冲极性相同,则两零前后都译为零,如-100-1,就应该译为0000,否则也不用改动.

 

2、再将所有的-1变换成+1后,就可以得到原消息码。

 

3.verilog核心程序

 

`timescale 1ns / 1ps
module hdb3(
input rst_n,clk,data_in,
output [1:0] bv_out,hdb3_out,state,
output flag,
output [7:0] count,
output hdb3_dec,
output [9:0] fifo_dec 
);
 
wire [1:0] hdb3_vout;
wire [1:0] v_in;
wire [1:0] bv_in;
wire [1:0] hdb3_in;
 
 
VB VB_u(
.rst_n  (rst_n),
.clk    (clk),
.v_in   (v_in),
.bv_out (bv_out),
.flag   (flag),
.count  (count)
);
 
SV SV_u(
.rst_n     (rst_n),
.clk       (clk),
.data_in   (data_in),
.hdb3_vout (hdb3_vout)
);
 
hdb3_VB hdb3_VB_u(
.rst_n    (rst_n),
.clk      (clk),
.bv_in    (bv_in),
.hdb3_out (hdb3_out),
.state    (state)
);
 
decode decode_u(
.rst_n    (rst_n),
.clk      (clk),
.hdb3_in  (hdb3_in),
.hdb3_dec (hdb3_dec),
.fifo_dec (fifo_dec)
);
 
 
assign v_in    = hdb3_vout;
assign bv_in   = bv_out;
assign hdb3_in = hdb3_out;
 
endmodule