BCH编码(15,5)1bit串行,5bit并行

1)什么是BCH码

①BCH码是一种纠错码、线性分组码、循环码。

②需要传输信息位数:k

③纠错能力:t

④总码长(信息位+监督位):n

⑤n的长度满足n=2^m –1时生成的为本原BCH码;n的长度为2^m– 1的因子时为非本原BCH码

(如n=15,n=31,n=63时为本原BCH码;n=21(可被63整除)等时为非本原BCH码)

⑥此外还有加长BCH码和缩短BCH码。

⑦具体的BCH码通常用BCH(n,k)码来表示。

2)Matlab代码:

function f=bchencode(a)

G=[1 0 1 0 0 1 1 0 1 1 1 0 0 0 0

0 1 0 1 0 0 1 1 0 1 1 1 00 0

0 0 1 0 1 0 0 1 1 0 1 1 10 0

0 0 0 1 0 1 0 0 1 1 0 1 11 0

0 0 0 0 1 0 1 0 0 1 1 0 11 1]

a=input('输入信息:');

b=dec2bin(a,5);

c=mod(b*G,2);

disp('输入序列为:');

disp(b);

disp('编码后的序列为:');

disp(c);

end

1、1bit串行


`timescale 1ns/1ps

module bch5_15(
input         clk, 
input         rst_n, 
input         en_bch, 
input         bch_datain, //5bit

output reg bch_dataout, //15bit
output reg [4:0]  datain //15bit
);
 
reg  [3:0]    cnt; //
wire [14:0]   bch_data; //15bit
reg [4:0]    data_a;
/// 
// 编码矩阵 G=[1 0 0 0 0 1 0 1 0 0 1 1 0 1 1;                   
//             0 1 0 0 0 1 1 1 1 0 1 0 1 1 0;                   
//             0 0 1 0 0 0 1 1 1 1 0 1 0 1 1;                   
//             0 0 0 1 0 1 0 0 1 1 0 1 1 1 0;                   
//             0 0 0 0 1 0 1 0 0 1 1 0 1 1 1];                  
//
 
always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
        begin
        cnt<=4'd0;
        bch_dataout<=1'b0;
        end
    else if((cnt==4'd14)||(en_bch==1'b0))
        begin
        cnt<=4'd0;
        bch_dataout<=bch_data[14];
        end
    else
        begin 
        cnt<=cnt+1'd1;
        bch_dataout<=bch_data[14-cnt];
        end
    end
 
    
always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
        datain<=5'd0;
    else if(en_bch==1'b0)
        datain<=5'd0;
    else if(cnt<=5'd4)
        datain[4-cnt]<=bch_datain;
    else
        datain[4:0]<=datain[4:0];
    end
    
always@(posedge clk)
    begin
    if(rst_n==0)
        data_a=5'd0;
    else if(en_bch==1'b0)
        data_a=5'd0;
    else if(cnt==5'd5)
        data_a=datain;
    else
        data_a=data_a;
    end
 
 assign bch_data[14:10] = data_a[4:0];
 assign bch_data[9] = data_a[4]^data_a[3]^data_a[1];
 assign bch_data[8] = data_a[3]^data_a[2]^data_a[0];                     
 assign bch_data[7] = data_a[4]^data_a[3]^data_a[2];                     
 assign bch_data[6] = data_a[3]^data_a[2]^data_a[1];                     
 assign bch_data[5] = data_a[2]^data_a[1]^data_a[0];                     
 assign bch_data[4] = data_a[4]^data_a[3]^data_a[0];                    
 assign bch_data[3] = data_a[4]^data_a[2]^data_a[1];                    
 assign bch_data[2] = data_a[3]^data_a[1]^data_a[0];                    
 assign bch_data[1] = data_a[4]^data_a[3]^data_a[2]^data_a[1]^data_a[0];
 assign bch_data[0] = data_a[4]^data_a[2]^data_a[0];                    
    
endmodule

2、5bit并行


`timescale 1ns/1ps

module bch5_15(
input clk, 
input rst_n, 
input en_bch, 
input [4:0] bch_datain, //5bit

output reg[14:0] bch_dataout //15bit
);
///
// 编码矩阵 G=[1 0 0 0 0 1 0 1 0 0 1 1 0 1 1;
//             0 1 0 0 0 1 1 1 1 0 1 0 1 1 0;
//             0 0 1 0 0 0 1 1 1 1 0 1 0 1 1;
//             0 0 0 1 0 1 0 0 1 1 0 1 1 1 0;
//             0 0 0 0 1 0 1 0 0 1 1 0 1 1 1];
///
 
 
 always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
          bch_dataout[14:0]<=15'd0;
    else if(en_bch==1'b1)
    begin
        bch_dataout[14]<=bch_datain[4];
        bch_dataout[13]<=bch_datain[3];
        bch_dataout[12]<=bch_datain[2];
        bch_dataout[11]<=bch_datain[1];
        bch_dataout[10]<=bch_datain[0];
        bch_dataout[9]<=bch_datain[4]^bch_datain[3]^bch_datain[1];
        bch_dataout[8]<=bch_datain[3]^bch_datain[2]^bch_datain[0];
        bch_dataout[7]<=bch_datain[4]^bch_datain[3]^bch_datain[2];
        bch_dataout[6]<=bch_datain[3]^bch_datain[2]^bch_datain[1];
        bch_dataout[5]<=bch_datain[2]^bch_datain[1]^bch_datain[0];
        bch_dataout[4]<=bch_datain[4]^bch_datain[3]^bch_datain[0];
        bch_dataout[3]<=bch_datain[4]^bch_datain[2]^bch_datain[1];
        bch_dataout[2]<=bch_datain[3]^bch_datain[1]^bch_datain[0];
        bch_dataout[1]<=bch_datain[4]^bch_datain[3]^bch_datain[2]^bch_datain[1]^bch_datain[0];
        bch_dataout[0]<=bch_datain[4]^bch_datain[2]^bch_datain[0];
    end
    else
        bch_dataout<=15'b0000000000000000;
    end
endmodule

3、每次进入2bit,2bit2bit1bit


`timescale 1ns/1ps

module bch5_15(
input clk, 
input rst_n, 
input en_bch, 
input [1:0] bch_datain, //5bit

output reg[14:0] d_bch_dataout //15bit
);
///
// 编码矩阵 G=[1 0 0 0 0 1 0 1 0 0 1 1 0 1 1;
//             0 1 0 0 0 1 1 1 1 0 1 0 1 1 0;
//             0 0 1 0 0 0 1 1 1 1 0 1 0 1 1;
//             0 0 0 1 0 1 0 0 1 1 0 1 1 1 0;
//             0 0 0 0 1 0 1 0 0 1 1 0 1 1 1];
///
reg [4:0] datain;
reg [14:0] bch_dataout;
reg  [2:0] cnt; 
always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
        cnt<=3'd0;
    else if((cnt==3'd7)||(en_bch==1'b0))
        cnt<=3'd0;
    else
        cnt<=cnt+3'd1;
    end
 

 always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
        datain<=5'd0;
    else if(en_bch==1'b1)
        case(cnt)
        3'd0: begin datain[4]<=bch_datain[1]; datain[3]<=bch_datain[0];         end
        3'd1: begin datain[2]<=bch_datain[1]; datain[1]<=bch_datain[0];         end
        3'd2: begin datain[0]<=bch_datain[1];         end                                     
        default: begin datain<=datain;             end
        endcase        
    else
        bch_dataout<=1'd0;
    end    

 always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
        bch_dataout<=15'd0;
    else if(en_bch==1'b1)
        case(cnt)
        3'd0: begin bch_dataout[14]<=bch_datain[1]; bch_dataout[13]<=bch_datain[0];  end                                                          
        3'd1: begin bch_dataout[12]<=bch_datain[1]; bch_dataout[11]<=bch_datain[0];  end                                                           
        3'd2: begin bch_dataout[10]<=bch_datain[1]; bch_dataout[9]<=datain[4]^datain[3]^datain[1]; bch_dataout[8]<=datain[3]^datain[2]^datain[0]; bch_dataout[7]<=datain[4]^datain[3]^datain[2];                                                            
 bch_dataout[6]<=datain[3]^datain[2]^datain[1]; bch_dataout[5]<=datain[2]^datain[1]^datain[0];                                                             
 bch_dataout[4]<=datain[4]^datain[3]^datain[0]; bch_dataout[3]<=datain[4]^datain[2]^datain[1];                                        
 bch_dataout[2]<=datain[3]^datain[1]^datain[0]; bch_dataout[1]<=datain[4]^datain[3]^datain[2]^datain[1]^datain[0];                                       
 bch_dataout[0]<=datain[4]^datain[2]^datain[0];   end                                     
        default: begin bch_dataout<=bch_dataout;                                                               end
        endcase        
    else
        bch_dataout<=15'd0;
    end          
 
 always@(posedge clk or negedge rst_n)
    begin
    if(rst_n==0)
        d_bch_dataout<=15'd0;
    else if(en_bch==1'b1 && cnt==3'd0)
        d_bch_dataout<=bch_dataout;
    else
        d_bch_dataout<=d_bch_dataout;
    end    

endmodule

matlab对比:


%% BCH编解码
%% 参数
n = 15;                                                                    % 信息比特+监督比特
t = 1;                                                                     % 纠错能力
k = 5;                                                                    % 要求的信息bit数
L = 16;
%%编码矩阵
G=[1 0 0 0 0 1 0 1 0 0 1 1 0 1 1; 
   0 1 0 0 0 1 1 1 1 0 1 0 1 1 0; 
   0 0 1 0 0 0 1 1 1 1 0 1 0 1 1; 
   0 0 0 1 0 1 0 0 1 1 0 1 1 1 0; 
   0 0 0 0 1 0 1 0 0 1 1 0 1 1 1];
%% 发送序列data与编码endata
data_in = 0;
%data_b = zeros(1,L);
syms i j;
for i = 1:1:31
    data_in = data_in + 1;
    data_a = bitget(data_in,1:16); %数据变为16位,每个时钟进2,8个时钟编码一次
    data_b = zeros(1,L);
    for j = 1:1:8
    data_b = [data_a(2*j),data_a(2*j-1),data_b(1:14)];
    end
    data_c = data_b(12:16);
   % data_d = fliplr(data_c);
    data_d=mod(data_c*G,2);
    disp('数据:');
    disp(data_c);
    disp('编码后的序列为:');
    disp(data_d);

    %画图
    subplot(3,1,1)
    stairs(data_a)
    axis([0 L -0.2 1.2])
    title('原始数据');

    subplot(3,1,2)
    stairs(data_d)
    axis([0 L -0.2 1.2])
    title('编码后的数据');

    dir=0;
    dout_b = (bit2dec(data_d,dir,15));
    dout_descrambler(i) = dout_b;


    fid=fopen('data0.m','wt');%自动生成.m文件
    input_b = dout_descrambler; %input
    for i = 1:length(input_b)
        yn_bin = input_b(i);
        if( yn_bin < 0 )
            yn_bin = yn_bin + 2^width;                  %转换为补码
        end
        fprintf( fid,'%s',dec2hex(yn_bin,4) );  %将数据写入文本 dec2hex(yn_bin,4)
        %     fprintf( fid,'%d',xn_bin);
        fprintf( fid,'\n' );
    end
    fclose(fid);




end

function [y] = bit2dec(t,dir,WIDTH)
%x为二进制数,dir
y = 0;
% for i = 1:64
%     if(dir == 1)
%         y = y + t(i)*2^(i-1);
%     else
%         y = y + t(i)*2^(64-i);
%     end
% end

for i = 1:WIDTH
    if(dir == 1)
        y = y + t(i)*2^(i-1);
    else
        y = y + t(i)*2^(WIDTH-i);
    end
end

end

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值