BCH编解码器的设计和实现Word文件下载.docx

上传人:b****5 文档编号:8485334 上传时间:2023-05-11 格式:DOCX 页数:19 大小:315.92KB
下载 相关 举报
BCH编解码器的设计和实现Word文件下载.docx_第1页
第1页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第2页
第2页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第3页
第3页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第4页
第4页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第5页
第5页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第6页
第6页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第7页
第7页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第8页
第8页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第9页
第9页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第10页
第10页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第11页
第11页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第12页
第12页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第13页
第13页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第14页
第14页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第15页
第15页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第16页
第16页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第17页
第17页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第18页
第18页 / 共19页
BCH编解码器的设计和实现Word文件下载.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

BCH编解码器的设计和实现Word文件下载.docx

《BCH编解码器的设计和实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《BCH编解码器的设计和实现Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。

BCH编解码器的设计和实现Word文件下载.docx

Waituntilclk'

eventandclk='

1'

;

Q1<

=reset;

Endprocess;

0'

Q2<

判断reset上升沿的标准是(Q1xorQ2)='

)andreset='

即Q1,Q2不等且reset='

时。

Reset上升沿出现在时钟的高电平,Q1,Q2不等状态恰好卡住时钟信号上升沿

Reset上升沿出现在时钟的低电平Q1,Q2不等状态卡住时钟信号下降沿

编码的控制信号往往是要靠reset上升沿起动,而后在时钟沿时有相应动作。

倘若要先判断时钟沿的来临(比如上升沿),再判断是否有Q1,Q2不等的状态,有一半的概率会捕捉不到reset上升沿,因为显然Q1,Q2不等状态以0.5的概率卡住时钟信号下降沿。

为了使判断Q1,Q2状态不受到时钟沿的限制,要先判断是否有Q1,Q2不等的状态,然后判断时钟沿的来临。

If(((Q1xorQ2)='

)andreset='

)then

Elsif(clk'

EVENTandclk=‘1’)then

Endif;

◆din_v[7..0]并行信号转换成编码电路的串行输入

从单片机送入FPGA的是8位并行信号,为了满足移位寄存器的串行操作。

必须转换成串行信号。

在编码过程的每个时钟节拍,8位信号逐次向前移位,取出头位,即为串行信号

移位条件:

信息码输出时移位

If(((Q1xorQ2)='

)andreset=‘1’)then

bufferv<

=din_v;

)then

If(workk=‘1’)then

If(vdin=‘1’)then

bufferv(6downto0)<

=bufferv(7downto1);

endif;

◆帧头信号的产生

由于从单片机发过来的并行数据是一帧一帧间断的,dout不是一直都输出有效编码信号,为了使解码器能够识别出每一帧,必须在有效编码信号前添加一个“帧头”。

采取的“帧头”是连续发三个“1”,然后是14个时钟节拍的编码输出信号。

dout帧头

countt帧头节拍

用一个计数变量countt控制三个节拍的帧头

reset上升沿来到时,countt就开始启动计数,由于电路的反馈作用,countt的初值不是“000”故选用了“011”“100”“101”这三个状态dout输出高电平。

在时钟下降沿的时候对countt进行计数,在时钟上升沿的时候利用count状态来判断相应操作。

If(((Q1xorQ2)=‘1’)andreset=‘1’)then

countt<

="

001"

flag1<

='

//flag1表示countt计数已启动

Elsif(clk'

)then

If(flag='

andflag1=‘1’)then

countt<

=countt+1;

Endif;

If(countt="

101"

110"

If(clk'

eventandclk=‘1’)then

Casecounttis

When"

=>

flag<

010"

011"

dout<

100"

Whenothers=>

dout<

=。

Endcase;

◆开关S1,S2等控制信号的产生

vdin移位寄存器反馈控制信号

vdin=‘1’,构成反馈环,信息码输出

vdin=‘0’,断开反馈环,监督码输出

workks编码工作信号

workks=‘1’,编码的14个节拍中

workks=‘0’,其余

输入的串行信号为00010001,得到信息码0001。

监督码011,不编码期间dout=0

cout是循环周期为7的计数信号,1,2,4,3节拍输出信息码,6,7,5节拍输出监督码。

【解码模块系统框图】

在这个大实验中,我主要负责了(7,4)BCH解码器的实现,下面我也主要做关于解码器的总结。

【理论介绍】

该BCH译码器实际上是基于错误图

样识别的译码器,也叫做梅吉特译码器,它的原理图如下所示:

错误图样识别器是一个具有n-k各输入端的逻辑电路,原则上可采用查表的方法,根据校正子找到错误图样,利用循环码的特性可以简化识别电路。

梅吉特译码器特别适合纠正t<

=2个随机独立错误的纠错码。

(7,4)循环汉明码的生成多项式是

,相应的梅吉特译码器如下图所示:

但是由于这种电路译一组码共需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;

entitydecoderis

port(clk,din:

instd_logic;

dout:

outstd_logic_vector(7downto0);

ready:

outstd_logic);

enddecoder;

architecturedecoderaofdecoderis

signalbuf:

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:

begin

detect_buf<

=din;

ready<

=enable;

--4级缓存器

cache:

process(clk)

waituntilclk'

ifenable='

then

din_buf<

ifin_b='

then

buf<

=buf(2downto0)&

din_buf;

endif;

endif;

endprocesscache;

--校正子计算电路

syndrome:

process(clk)

begin

ifenable='

--如果gate1为1,则选通第一路

ifgate1='

s1(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);

else

=s2

(2)xordin_buf;

=s1

(2);

endif;

endprocesssyndrome;

output:

ifout_b='

casegate2is

when'

=>

out_buf<

=out_buf(6downto0)&

((s1(0)and(nots1

(1))ands1

(2))xorbuf(3));

whenothers=>

((s2(0)and(nots2

(1))ands2

(2))xorbuf(3));

endcase;

endprocessoutput;

--采集帧以及设置各个门的进程

clock:

process(clk)

variablecount:

integerrange0to20;

variableshit:

integerrange0to2;

--探测帧,设置enable信号

--探测到帧时,将计数器清零,准备计数

ifenable='

ifdetect_buf='

caseshitis

when0=>

shit:

=1;

when1=>

=2;

when2=>

=0;

enable<

endcase;

else

shit:

count:

gate1<

gate2<

in_b<

out_b<

else

casecountis

when4=>

in_b<

when7=>

out_b<

gate1<

when11=>

gate2<

when14=>

when19=>

count:

in_b<

=out_buf;

whenothers=>

=count;

=count+1;

endprocessclock;

enddecodera;

【单片机接口】

单片机用于实现电脑(串口)与FPGA(并口)之间的数据通信。

主要利用了8051单片机的串行口方式1的收发功能。

端口设置:

P3.0(RXD):

串口收(自电脑串口)

P3.1(TXD):

串口发(向电脑串口)

P0.0:

给FPGA的数据有效信号(电平翻转时刻取数据)

P1:

并口发(向FPGA)

P0.1:

自FPGA的数据有效信号(电平翻转下降延取数据)

P2:

并口收(自FPGA)

串口通信的波特率设置为1200b/s,对于时钟振荡频率为11.059MHz的单片机,定时器T1工作在模式2,初值为E8H。

串行口控制字SCON=50H。

即采用方式1、SM2=0、REN=1、TI=RI=0。

接收电脑的串口数据采用中断方式,向电脑串口发送数据采用查询方式。

具体的,从电脑串口到FPGA并口的通信:

RXD口(P3.0)一直接收来自电脑串口的数据(SCON寄存器中REN位置1),每收完一帧数据(收到9位数据),则将收到的前8位数据装入串行口的SBUF寄存器,最后一位作为停止位存入RB8(SCON.2),并置位RI。

RI=1后,进入中断服务程序。

在判断引起中断位为Ri后(否则,Ti清0,中断返回),Ri清0,将串行口的缓冲寄存器SBUF寄存器中数据发到P1口,一定延时后(确保FPGA取走数据有效),P0.0口电平翻转,中断返回。

至此从电脑串口到FPGA并口的一帧数据通信完成,等待下一次RI=1,开始下一次通信过程。

从FPGA并口到电脑串口的通信:

单片机主程序一直循环检测P0.1口电平,当电平变为0且之前电平为1时,将P2口数据发到单片机串行口寄存器SBUF中,单片机自动开始向电脑串口发送一帧串行数据及存在RB8(SCON.2)中的停止位。

至此从FPGA并口到电脑串口的数据通信完成,程序继续循环检测P0.1口电平

主程序流程图中断服务程序流程图

org0000h

ajmpmain

org0023h

ajmpsbr1

org0150H

main:

movtmod,#22h;

串口初始化

movtl1,#0e8h

movth1,#0e8h

movpcon,#00h

movscon,#50h

setbtr1

setbea

setbes

loop:

jnbp0.1,$

jbp0.1,$;

判断P0.1口下降沿

movsbuf,p2;

从P2口收并口信号

sjmploop

org0200h

sbr1:

jbri,sin

clrti

reti

sin:

clrri

movp1,sbuf;

p1口发并口信号

movr0,#10h;

延时

djnzr0,$

cplp0.0;

P0.0口电平翻转

end

【FSK调制与解调】

1.FSK调制

FSK是最简单的一种数字调制手段。

通常调制信号为一列串行码流,根据每时刻信息比特的取值不同,输出不同频率的波形。

最简单的做法是:

输入调制信号为S(n),S(n)=1时,输出一个频率的方波;

S(n)=0时,输出另一频率的方波。

VHDL代码为:

RF<

=(DinandFreq_h)or((notDin)andFreq_low);

其中Din为输入调制信号,Freq_h为频率较高的一方波,Freq_low为频率较低的一方波,RF为以调波输出。

2.FSK解调

FSK解调也十分方便。

我采取的作法是:

以欲解调信号的时钟周期为周期,对接收到的FSK信号进行计数,若该周期内计数结果小于门限,则认定该周期为0码,否则为1码。

(包括调制部分)

libraryieee;

useieee.std_logic_1164.all;

entityFSK_sendis

port(

Din:

instd_logic;

Freq_h:

Freq_low:

FSK_out:

outstd_logic;

S_clk:

clr:

Dout:

outstd_logic

);

endFSK_send;

architectureModuleofFSK_sendis

signalRF:

signalS_clkh:

signalS_clkv:

signalS_delay:

signalclk:

signalclear:

signalcount:

std_logic_vector(4downto0);

---------------------------------------------------------------------------

FSK_out<

=RF;

process(Freq_h,S_clk)

begin

if(S_clk'

eventandS_clk='

then

S_clkh<

=notS_clkh;

if(Freq_h'

eventandFreq_h='

thenS_delay<

=S_clkh;

thenS_clkv<

=S_delay;

endprocess;

clear<

=S_delayxorS_clkv;

clr<

=clear;

process(RF)

if(clear='

thencount<

00000"

elsif(RF'

eventandRF='

process(S_clk)

thenDout<

=count(4)orcount(3)orcount

(2);

endModule;

3.仿真结果

【完成情况】

我们小组在整个实验过程中,完成了(7,4)BCH编码器与解码器,单片机串口通信程序以及FSK调制解调模块的设计工作。

各模块在单独工作时,效果令人满意。

在实验结束时,我们完成了(7,4)BCH编码器与解码器,单片机串口通信程序(即PC机与实验板的联机调试实验)连接调试,最初时我们的系统漏码情况比较严重,请仔细检查发现问题出自编码模块中一个状态机逻辑方面的问题,漏码问题得以解决。

由于时间有限,我们没能完成FSK调制解调模块的连接,但是这个部分比较简单,我们认为基本没有什么问题。

总体来说,通过这次实验我们得到很大收获。

我们用VHDL实现了(7,4)BCH编码器与解码器、FSK调制解调器;

编写了串口通信的PC机程

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2