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/1psmodule bch5_15(
input         clk,
input         rst_n,
input         en_bch,
input         bch_datain, //5bitoutput 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)beginif(rst_n==0)begincnt<=4'd0;bch_dataout<=1'b0;endelse if((cnt==4'd14)||(en_bch==1'b0))begincnt<=4'd0;bch_dataout<=bch_data[14];endelsebegin cnt<=cnt+1'd1;bch_dataout<=bch_data[14-cnt];endendalways@(posedge clk or negedge rst_n)beginif(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;elsedatain[4:0]<=datain[4:0];endalways@(posedge clk)beginif(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;elsedata_a=data_a;endassign 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/1psmodule bch5_15(
input clk,
input rst_n,
input en_bch,
input [4:0] bch_datain, //5bitoutput 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)beginif(rst_n==0)bch_dataout[14:0]<=15'd0;else if(en_bch==1'b1)beginbch_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];endelsebch_dataout<=15'b0000000000000000;end
endmodule

3、每次进入2bit,2bit2bit1bit

`timescale 1ns/1psmodule bch5_15(
input clk,
input rst_n,
input en_bch,
input [1:0] bch_datain, //5bitoutput 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)beginif(rst_n==0)cnt<=3'd0;else if((cnt==3'd7)||(en_bch==1'b0))cnt<=3'd0;elsecnt<=cnt+3'd1;endalways@(posedge clk or negedge rst_n)beginif(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];         end3'd1: begin datain[2]<=bch_datain[1]; datain[1]<=bch_datain[0];         end3'd2: begin datain[0]<=bch_datain[1];         end                                     default: begin datain<=datain;             endendcase        elsebch_dataout<=1'd0;end    always@(posedge clk or negedge rst_n)beginif(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;                                                               endendcase        elsebch_dataout<=15'd0;end          always@(posedge clk or negedge rst_n)beginif(rst_n==0)d_bch_dataout<=15'd0;else if(en_bch==1'b1 && cnt==3'd0)d_bch_dataout<=bch_dataout;elsed_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:31data_in = data_in + 1;data_a = bitget(data_in,1:16); %数据变为16位,每个时钟进2,8个时钟编码一次data_b = zeros(1,L);for j = 1:1:8data_b = [data_a(2*j),data_a(2*j-1),data_b(1:14)];enddata_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; %inputfor i = 1:length(input_b)yn_bin = input_b(i);if( yn_bin < 0 )yn_bin = yn_bin + 2^width;                  %转换为补码endfprintf( fid,'%s',dec2hex(yn_bin,4) );  %将数据写入文本 dec2hex(yn_bin,4)%     fprintf( fid,'%d',xn_bin);fprintf( fid,'\n' );endfclose(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
% endfor i = 1:WIDTHif(dir == 1)y = y + t(i)*2^(i-1);elsey = y + t(i)*2^(WIDTH-i);end
endend

BCH编码(15,5)1bit串行,5bit并行相关推荐

  1. 串行测试 并行测试_如何通过CircleCI测试并行性增加构建时间

    串行测试 并行测试 by Karel Rochelt 卡雷尔·罗切尔特(Karel Rochelt) 如何通过CircleCI测试并行性增加构建时间 (How to boost build time ...

  2. 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...

  3. 51单片机之IO口扩展——74HC595芯片串行转并行实验

    我们都知道通信从大的方面有两种:串行和并行.串行的最大优点是占用总线少,但是传输速率低:并行恰恰相反,占用总线多,传输速率高.市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来 ...

  4. 同步、异步 与 串行、并行的区别

    同步.异步: 指的是能否开启新的线程.同步不能开启新的线程,异步可以. 串行.并行: 指的是任务的执行方式.串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个.并行指的是多个任务可以同 ...

  5. java sync和async区别_GCD中串行、并行与async、sync的区别

    * author:conowen@大钟 * E-mail:conowen@hotmail.com 队列由一个或多个任务组成,当这些任务要开始执行时,系统会分别把他们分配到某个线程上去执行. 串行队列. ...

  6. AsyncTask——AsyncTask串行and并行

    一.前言 AsyncTask,相信你不会陌生,也许你很幸运,早已了解了AsyncTask这个家伙挖的坑,也许你已经被坑过了,也许你没坑了,然而还没有发觉. 本次笔者将带大家一起来看下AsyncTask ...

  7. 串行、并行、并发,别再傻傻分不清了!

    开足码力,码动人生,微信搜索[ 程序员大帝 ],关注这个一言不合就开车的的代码界老司机 本文 GitHub上已经收录 https://github.com/BeKingCoding/JavaKing ...

  8. 并发、并行、同步、异步、进程,线程、串行、并行?一文弄懂八大概念

    并发.并行.同步.异步.进程,线程.串行.并行?一文弄懂八大概念 参考博文:并发.并行.串行.同步.异步的区别? java多线程详解(并发,并行,同步) 文章目录 并发.并行.同步.异步.进程,线程. ...

  9. 串行测试 并行测试_什么是并行测试,为什么要采用它?

    串行测试 并行测试 随着技术的进步,随着组织从手动测试转向Selenium测试自动化 ,测试解决方案变得比以往更具可扩展性. 但是,大多数组织仍在努力的领域之一是可并行运行多个测试的可伸缩性. 许多公 ...

最新文章

  1. 16_python_面向对象
  2. 浅谈单片机程序设计中的“分层思想”
  3. 再理下系统分层架构模式
  4. linux sftp命令连接数,linux记录sftp命令
  5. JavaScript学习随记——数组二
  6. 程序员怎样锻炼编程思维(学习方法)
  7. 从浏览器输入地址到渲染出网页这个过程发生了什么?
  8. 如何打造自己强大的气场?
  9. 解决 【git checkout -b dev origin/dev】报错的问题
  10. sass 自定义函数
  11. 14的虚拟机可以用在15上面吗_【Linux虚拟机】在Windows上安装Linux虚拟机
  12. git获取特定的commit
  13. 2020年河南对口升学计算机类专业课试卷,2009年河南对口升学计算机专业试卷专业课...
  14. SpreadJS 15.1 ~【SpreadJS 15.0】
  15. 常用数据下载网站汇总
  16. 玉溪第一座智能变电站,造国际一流智能配电网,机器人来运维
  17. PWM整流器仿真。 在simulink中搭建了PWM整流器,采用电压电流双闭环控制,实现了网侧电压与电流同相位
  18. 红米手机计算机软件,详解红米手机连接电脑方法
  19. 组合投资的风险与收益概述
  20. littlefs系列:Technical Specification

热门文章

  1. Jupyter notebook 报错 500 : Internal Server Error的解决方法
  2. 解决ubantu里面报错findfont: Font family ['sans-serif'] not found. Falling back to Bitstream Vera Sans
  3. node.js在2018年能继续火起来吗?我们来看看node.js的待遇情况
  4. 2011-2019 历届蓝桥杯——本科B组C/C++组别所有试题——详解大全
  5. 错排公式的理解与推导(转载)
  6. JAVA初级工程师面试36问(一)
  7. 查询分析器里查看执行计划
  8. troubleshooting之解决YARN队列资源不足导致的application直接失败
  9. coursera android,Coursera
  10. html手机端下拉菜单代码,jQuery手机移动端下拉列表选择代码