您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > BCH编解码器的设计和实现
【题目介绍】我们小组做的题目是BCH编解码器的设计和实现。系统分为四部分:1.单片机串并变换2.(7,4)BCH编码器3.FSK调制发射和FSK解调4.(7,4)BCH解码器首先,计算机通过串口向单片机发送串行ASCII码数据,单片机把这些串行数据进行串并变换后,把每个8位的ASCII码并行送入(7,4)BCH编码器,8位并行数据在编码后变为14位的串行数据,FSK调制模块将编码后的数据发射,然后解调模块进行接收(中途没有经过无线信道,因为无法模拟),解调后得到编码后的数据,送给(7,4)BCH解码器进行解码,然后解码器将解码得到的8位ASCII码送给单片机,单片机将并行ASCII码进行并串变换后,将串行数据送入计算机串口,这时,在屏幕上将显示接收到的ASCII码。【分工】****************************【编码模块原理】编码方式:将信息码多项式i(x)升n-k次幂后除以生成多项式g(x),然后将所得余式置于升幂后的信息多项式i(x)之后。可以用下式表示:)()()()()(xgxrxqxgxixknr(x)为监督码多项式系统循环码多项式为:)()()(xrxixxckn要得到监督位,关键要进行多项式除法,可以用带反馈的线性移位寄存器来实现。(n,k)BCH码生成多项式g(x)=1+g1x+g2x2+...+gn-k-1xn-k-1+xn-k(n,k)BCH码编码电路:若前n-k次移位只是用于将信息码元输入移位寄存器,还需n-k次移位才能输出监督码元,其间存在n-k位间隙。通过时钟控制开关可以使编码过程流畅,不存在时间间隙。编码器的开关动作如下:1到k个时钟节拍,信息比特直接输出(S2置于2)同时计算余式——监督码,每当一个“1”移出寄存器进入反馈线,相当于从被除式中减去除式。k+1到n个时钟节拍,监督码位输出(S2置于1),断开移位寄存器的反馈线(S1--off)(7,4)BCH码生成多项式g(x)=1+x+x3一次编码过程产生4位信息码元和3位监督码元,3位监督码指示的8种校正子图样中,一种代表无误码,其余7种能纠正一位误码。(7,4)BCH码编码电路:编码器的开关动作如下:1到4个时钟节拍,信息比特直接输出(S2置于2)同时计算余式——监督码。5到7个时钟节拍,监督码位输出(S2置于1),断开移位寄存器的反馈线(S1--off)【编码模块系统框图】clk时钟节拍reset是来自单片机的数据有效信号(脉冲信号)din_v[7..0]是单片机向FPGA发出的并行信号dout是编码后的串行信号,头三位为高电平帧信号当reset的上升沿到来时,读取单片机发出的并行数据信号din_v[7..0],首先产生3位高电平信号送至dout。然后启动编码电路,8位信息码分两组进行编码,历时14个时钟节拍,加上帧信号共17个时钟节拍。reset信号上升沿的识别reset上升沿的识别捕捉是启动编码过程的关键,若采用同于捕捉时钟信号上升沿的方法(ifreset’eventandreset=’1’),会导致上升沿的嵌套捕捉,不能通过编译。用两路信号Q1,Q2分别在时钟的上升沿和下降沿采集reset信号ProcessbeginWaituntilclk'eventandclk='1';Q1=reset;Endprocess;ProcessbeginWaituntilclk'eventandclk='0';Q2=reset;Endprocess;判断reset上升沿的标准是(Q1xorQ2)='1')andreset='1'即Q1,Q2不等且reset='1'时。Reset上升沿出现在时钟的高电平,Q1,Q2不等状态恰好卡住时钟信号上升沿Reset上升沿出现在时钟的低电平Q1,Q2不等状态卡住时钟信号下降沿编码的控制信号往往是要靠reset上升沿起动,而后在时钟沿时有相应动作。倘若要先判断时钟沿的来临(比如上升沿),再判断是否有Q1,Q2不等的状态,有一半的概率会捕捉不到reset上升沿,因为显然Q1,Q2不等状态以0.5的概率卡住时钟信号下降沿。为了使判断Q1,Q2状态不受到时钟沿的限制,要先判断是否有Q1,Q2不等的状态,然后判断时钟沿的来临。If(((Q1xorQ2)='1')andreset='1')then。。。。Elsif(clk'EVENTandclk=‘1’)then。。。。Endif;din_v[7..0]并行信号转换成编码电路的串行输入从单片机送入FPGA的是8位并行信号,为了满足移位寄存器的串行操作。必须转换成串行信号。在编码过程的每个时钟节拍,8位信号逐次向前移位,取出头位,即为串行信号移位条件:信息码输出时移位If(((Q1xorQ2)='1')andreset=‘1’)thenbufferv=din_v;Elsif(clk'eventandclk='1')thenIf(workk=‘1’)thenIf(vdin=‘1’)thenbufferv(6downto0)=bufferv(7downto1);endif;Endif;Endif;帧头信号的产生由于从单片机发过来的并行数据是一帧一帧间断的,dout不是一直都输出有效编码信号,为了使解码器能够识别出每一帧,必须在有效编码信号前添加一个“帧头”。采取的“帧头”是连续发三个“1”,然后是14个时钟节拍的编码输出信号。用一个计数变量countt控制三个节拍的帧头reset上升沿来到时,countt就开始启动计数,由于电路的反馈作用,countt的初值不是“000”故选用了“011”“100”“101”这三个状态dout输出高电平。在时钟下降沿的时候对countt进行计数,在时钟上升沿的时候利用count状态来判断相应操作。If(((Q1xorQ2)=‘1’)andreset=‘1’)thencountt=001;flag1='1';//flag1表示countt计数已启动Elsif(clk'eventandclk='0')thenIf(flag='1'andflag1=‘1’)thencountt=countt+1;Endif;If(countt=101)thencountt=110;flag1='0';Endif;Endif;If(clk'eventandclk=‘1’)thenCasecounttisWhen001=flag='1';When010=flag='1';dout帧头countt帧头节拍When011=flag='1';dout='1';When100=flag='1';dout='1';When101=flag='0';。。。Whenothers=dout=。。。;。。。Endcase;Endif;开关S1,S2等控制信号的产生vdin移位寄存器反馈控制信号vdin=‘1’,构成反馈环,信息码输出vdin=‘0’,断开反馈环,监督码输出workks编码工作信号workks=‘1’,编码的14个节拍中workks=‘0’,其余输入的串行信号为00010001,得到信息码0001。监督码011,不编码期间dout=0cout是循环周期为7的计数信号,1,2,4,3节拍输出信息码,6,7,5节拍输出监督码。帧头信息码0001监督码011【解码模块系统框图】在这个大实验中,我主要负责了(7,4)BCH解码器的实现,下面我也主要做关于解码器的总结。【理论介绍】该BCH译码器实际上是基于错误图样识别的译码器,也叫做梅吉特译码器,它的原理图如下所示:错误图样识别器是一个具有n-k各输入端的逻辑电路,原则上可采用查表的方法,根据校正子找到错误图样,利用循环码的特性可以简化识别电路。梅吉特译码器特别适合纠正t=2个随机独立错误的纠错码。(7,4)循环汉明码的生成多项式是1)(3DDDg,相应的梅吉特译码器如下图所示:但是由于这种电路译一组码共需2n个节拍,必须等第一组码元移出缓存器后才能接收第二组,因此只能间歇的工作,为了使译码连续,实际电路必须再加以个校正子计算电路,;两个除法电路并联,交替工作。(7,4)循环码完整译码器电路如下图所示:解码器各门的状态和时钟节拍的关系门1:clk在1-5、8-12、15-18时处于打开状态,表示输入的数据打入缓存门2:clk在8-1215-18时处于打开状态,表示选通第一路做校正子计算门3:为门2的反,表示选通第二路做校正子计算门4:clk在1-815-18时处于打开状态,表示选择第一路的校正子用于校正运算门5:为门4的反,表示选择第二路的校正子做校正运算帧识别问题由于从单片机发过来的并行数据是一帧一帧的,为了使解码器能够顺利的识别出每一帧,必须在编码之后,每个帧前面添加一个“帧头”以便于解码器准确的探测帧。在这个实验中,我们采取的“帧头”就是在信息数据前面连续发三个“1”,这样,在解码端,在探测帧的时候,发现连续的三个“1”,则认为有一个帧到来。经过FPGA的仿真,帧识别问题可以通过这种方法成功的解决。软件仿真的结果:输入有一位误码时:可见,对于一位误码情形,(7,4)BCH解码器能够正确的纠错。附录:解码器源程序(VHDL)libraryIEEE;useIEEE.std_logic_1164.ALL;useieee.std_logic_unsigned.all;entitydecoderisport(clk,din:instd_logic;dout:outstd_logic_vector(7downto0);ready:outstd_logic);enddecoder;architecturedecoderaofdecoderissignalbuf:std_logic_vector(3downto0);signalgate1,gate2,in_b,out_b,enable,dout1,dout2:std_logic;signals1,s2:std_logic_vector(2downto0);signalout_buf:std_logic_vector(7downto0);signaldin_buf:std_logic;--串行输入数据的寄存器signaldetect_buf:std_logic;begindetect_buf=din;ready=enable;--4级缓存器cache:process(clk)beginwaituntilclk'eventandclk='1';ifenable='1'thendin_buf=din;ifin_b='1'thenbuf=buf(2downto0)&din_buf;endif;endif;endprocesscache;--校正子计算电路syndrome:process(clk)beginwaituntilclk'eventandclk='1';ifenable='1'then--如果gate1为1,则选通第一路ifgate1='1'thens1(0)=s1(2)xordin_buf;s1(1)=s1(0)xors1(2);s1(2)=s1(1);s2(0)=s2(2);s2(1)=s2(0)xors2(2);s2(2)=s2(1);elses2(0)=s2(2)xordin_buf;s2(1)=s2(0)xors2(2);s2(2)=s2(1);s1(0)=s1(2);s1(1)=s1(0)xors1(2);s1(2)=s1(1);endif;endif;endprocesssyndrome;output:process(clk)beginwaituntilclk'eventandclk='1';ifout_b='1'thencasegate2iswhen'1'=out_buf=out_buf(6downto0)&((s1(0)and(nots1(1))ands1(2))xorbuf(3));whenothers=out_b
本文标题:BCH编解码器的设计和实现
链接地址:https://www.777doc.com/doc-2900088 .html