基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证-FPGA常见问题社区-FPGA CPLD-ChipDebug

基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证


一、理论基础

       HDB3码(三阶高密度双极性码)是串行数据传输的一种重要编码方式,和最常用的NRZ码(非归零码)相比,以上所说的有点使HDB3码具有明显的优势,同时,HDB3码具有较强的检错能力,当数据序列用HDB3码传输时,若传输过程中出现单个误码,其极性交替变化规律将受到破坏,因而在接收端根据HDB3码这一独特规律特性,可检出错误并纠正错误,同时HDB3码方便提取位定时信息。

   HDB3码是AMI码的改进型,通常被称为三阶高密度双极性码。 HDB3码的编码规则第一步:检查消息代码的连0串,当没有4个或4个以上连零串的时候,按AMI码的编

码规则对消息代码进行编码;AMI编码规则如下所示:

    原码:   1 0 0 0 0  1 0 0 0 0  1  1 0 0 0 0   1  1

  AMI码:-1 0 0 0 0  +1 0 0 0 0 -1  +1 0 0 0 0   -1  +1

第二步:当检测到连续4个或4个以上的连续零的时候,那么将每4个连零段的第4个零变换成与前一非0符号相同极性的符号,同时保证相邻符号的极性交替。

第三步:检查相邻符号间非零符号的个数的奇偶性,若为偶数,则将当前的符号的前一非零符号后的第1个零变为+B或-B符号,且B的极性与前一非零符号的极性相反,并使后面的非零符号从V符号开始再交替变化。

    编码分为信源编码和信道编码两种类型:

信源编码是针对信源统计特性进行编码,主要任务就是减少冗余度,提高编码效率。由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的基本途径有两个:一是使序列中的各个符号尽可能的互相独立,即解除相关性;二是使编码中各个符号出现的概率尽可能相等,即概率均匀化。

      信道编码主要是针对信道统计特性进行编码,主要目的是提高信息传输的可靠性。由于实际信道存在噪声和干扰,使得经信道传输后与所接收的码字之间存在差异,称为差错。通常,信道噪声和干扰越大,码字产生差错的概率也就越大。信道编码的任务就是通过在选择发射的数据中引入冗余,防止数据出现差错

       AMI码全称是传号交替反转码,又称双极性方式码,属于单极性码的变型,编码规则是:消息码的1交替的变换为+1-10保持不变。优点:无直流,零频附近的低频分量少;有一定检错能力,当发生1位误码时,可按AMI规则发现错误,以ARQ纠错;接收后只要全波整流,则变为单极性码,如果它是AMI-RZ型,可直接提取同步。

缺点码流中当连 0过多时,同步不易提取。举例如下:

消息代码:0  1   1  1  0  0   1  0 …

AMI  0  +1  –1  +1  0  0  -1  0 …

      0  -1  +1  –1  0  0  +1  0 …

首先将消息代码变换成AMI码;然后检查AMI码中的连0情况,当无4个或4个以上的连0串时,则保持AMI的形式不变;若出现4个或4个以上连0串时,则将1后的第4个0变为与前一非0符号(+1或-1)同极性的符号,用V表示(+1记为+V,-1记为-V);最后检查相邻V符号间的非0符号的个数是否为偶数,若为偶数,则再将当前的V符号的前一非0符号后的第1个0变为+B或-B符号,且B的极性与前一非0符号的极性相反,并使后面的非0符号从V符号开始再交替变化。

第一步:检查消息代码的连0串,当没有4个或4个以上连零串的时候,按AMI码的编

码规则对消息代码进行编码;AMI编码规则如下所示:

    原码:   1 0 0 0 0  1 0 0 0 0  1  1 0 0 0 0   1  1

  AMI码:-1 0 0 0 0  +1 0 0 0 0 -1  +1 0 0 0 0   -1  +1

第二步:当检测到连续4个或4个以上的连续零的时候,那么将每4个连零段的第4个零变换成与前一非0符号相同极性的符号,同时保证相邻符号的极性交替。

第三步:检查相邻符号间非零符号的个数的奇偶性,若为偶数,则将当前的符号的前一非零符号后的第1个零变为+B或-B符号,且B的极性与前一非零符号的极性相反,并使后面的非零符号从V符号开始再交替变化。

二、核心程序

module hdb3_decode(
                   i_rst,
                   i_clk,
                   hdb3_code,
                   hdb3_decode
                   );
 
input       i_rst;
input       i_clk;
input [1:0] hdb3_code;
output      hdb3_decode;
 
 
reg [9:0] fifo_decode;
always@(posedge i_clk or negedge i_rst)
begin
     if(!i_rst)
     begin
     fifo_decode <= 10'b0;
     end
else begin
           if(fifo_decode[5:4] == hdb3_code && fifo_decode[3:0] == 4'b0000)
           begin
                if(fifo_decode[7:6] == 2'b11)
                fifo_decode <= {2'b01,8'b0000_0000};
                else
                fifo_decode <= {fifo_decode[7:6],8'b0000_0000};
           end
           
      else if(fifo_decode[7:6] == hdb3_code && fifo_decode[5:0] == 6'b00_0000)
           fifo_decode <= {2'b01,8'b0000_0000};
           
      else if(fifo_decode[7:6] == 2'b01 || fifo_decode[7:6] == 2'b11)
           fifo_decode <= {2'b01,fifo_decode[5:0],hdb3_code};
           
      else
           fifo_decode<= {fifo_decode[7:0],hdb3_code};
    end
end
 
assign hdb3_decode = (fifo_decode[9:8] == 2'b01)?1'b1:1'b0;
 
endmodule

 

系统总体结构如下图所示:

图片[1]-基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证-FPGA常见问题社区-FPGA CPLD-ChipDebug

三、测试结果

通过对系统的综合,可以看到其RTL结构图:

图片[2]-基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证-FPGA常见问题社区-FPGA CPLD-ChipDebug

测试结果如下

图片[3]-基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证-FPGA常见问题社区-FPGA CPLD-ChipDebug

请登录后发表评论