首页 > 其他分享 >基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证

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

时间:2023-01-03 22:46:03浏览次数:68  
标签:AMI 编码 极性 FPGA 符号 fifo decode MATLAB HDB3

目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础
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和-1,0保持不变。优点:无直流,零频附近的低频分量少;有一定检错能力,当发生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

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

 

 

三、测试结果

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

 

 测试结果如下

 

标签:AMI,编码,极性,FPGA,符号,fifo,decode,MATLAB,HDB3
From: https://www.cnblogs.com/matlabfpga/p/17023587.html

相关文章