BCH编解码器的设计和实现Word文档下载推荐.docx
- 文档编号:18323383
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:19
- 大小:315.92KB
BCH编解码器的设计和实现Word文档下载推荐.docx
《BCH编解码器的设计和实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《BCH编解码器的设计和实现Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
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机程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BCH 编解码器 设计 实现