扰码解扰码器设计Word格式文档下载.docx
《扰码解扰码器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《扰码解扰码器设计Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
常用的扰码器的实现可采用小m序列进行。
扰码器是在发端使用移位寄存器产生m序列,然后将信息序列跟m序列做模二加,其输出即为加扰码的随即序列。
解扰码是在接收机端使用相同的扰码序列与收到的被扰信号模二加,将原信息得到恢复。
本文设计的扰码和解扰码器采用FPGA实现。
与传统的电路设计方法相比,PLD(ProgrammableLogicDevice,PLD)具有功能强大、开发周期短、投资风险小、产品上市速度快、灵活性高、可反复编程修改、易于升级、保密性能好、开发工具智能化等特点。
特别是FPGA(FieldProgrammableGateArray)以其集成度高,开发灵活,成本适中,可完成极其复杂的时序与组合逻辑电路功能,适应于高速、高密度的高端数字逻辑电路设计的优点,使其成为当今硬件设计的首选方式之一。
图1为利用FPGA开发应用程序的流程图:
图1FPGA开发流程图使用CPLD可以轻松实现m序列信号发生器,对信息序列进行扰码和解扰码。
本文采用VerilogHDL语言,利用ALTERA公司的QuartusII7.1软件工具进行各功能模块的编程和仿真。
图2为利用FPGA实现扰码和解扰码器的框图。
接收端同步信息提取发射端发端m序列发生器信息序列解扰码输出扰码序列输出本地m序列发生器图2FPGA实现扰码和解扰码器的框图如图所示,待发送的信息序列与发端产生的m序列进行模二加(扰码),扰码序列通过传输信道传送到接受端,接受端通过同步模块提取位定时信息,驱动本地m序列发生器产生与发端一样的m序列,然后再跟接受到的扰码序列进行模二加,恢复原来信息。
m序列具有类似于随机信号较好的自相关特性。
m序列由线反馈移位寄存器加权产生,其原理图如图3所示。
根据反馈系数的取值不同,电路可以产生出各种具有不同特性的数字序列。
对于一定的移位寄存器级数r,存在一些特殊的Ci取值,使得输出序列的周期达到最长,即为。
这样的序列被称为最长线性反馈移位寄存器序列,即m序列。
采用VerilogHDL语言编程实现。
图3m序列产生原理图作为测试用,本文设计了一个5级31位的m序列发生器,其输出的m伪随机序列作为待扰码的信息序列;
设计了一个级数可调的m序列发生器作为扰码序列,通过外部拨码开关选择级数,以满足不同系统对稳定性的要求。
采用QuartusII7.1软件工具实现的顶层文件如图4所示。
图4扰码和解扰码器顶层文件其中NRZ_in为信息输入,yaoma_out为扰码后序列输出,yaoma_in为解码器输入,jishu3.0为m序列发生器级数选择(415级),NRZ_out为内部产生的用于测试数据用的m序列,out_dat为解码后输出,mmm为扰码m序列输出。
仿真图如图5所示。
图5系统仿真图将程序下载到EPM3256ACPLD上运行,得到了很好的效果。
本设计的扰码解扰码器在CPLD上实现,简单灵活,适用性强并且可以随意定制,具有很大的应用价值。
参考文献1齐洪喜,陆颖.VHDL电路设计实用教程.北京:
清华大学出版社,20042王兴亮.数字通信原理与计数.西安电子科技大学出版社.2003附录1.顶层文件源程序:
moduletop(clk_in,/时钟输入,若频率高可调用下面ALWAYS进行分频,修改CNT参数即可NRZ_out,/系统内部产生的NRZ码输出NRZ_in,/NRZ码输入yaoma_out,/编码后扰码输出yaoma_in,/解码时扰码输入out_dat,/解码后数据输出jishu,/M序列级数选择8-4-2-1,总共有154级RST,/复位输入mmm);
/扰码用的M序列输出inputclk_in;
inputRST;
inputNRZ_in;
input3:
0jishu;
inputyaoma_in;
outputNRZ_out;
outputyaoma_out;
outputout_dat;
outputmmm;
regclk_33;
/分频后时钟wirem;
/中间变量,接受M序列产生的M序列reg7:
0cnt;
/分频计数assignmmm=m;
/扰码用的M序列输出assignyaoma_out=NRZ_inm;
/NRZ码与M序列异或,进行扰码assignout_dat=yaoma_inm;
/扰码输入与M序列异或,进行解码nrzu0(.clk(clk_in),/数据输入时钟.outdata(NRZ_out),/输出数据.rst(RST),/启动信号);
mmu1(.clk(clk_in),/数据输入时钟.outdata(m),/输出数据.rst(RST),/启动信号.jishu(jishu),/级数选择);
always(posedgeclk_in)beginif(!
RST)cnt=8h0;
elsebegincnt=cnt+1;
if(cnt=33)begincnt=8h0;
clk_33=clk_33;
endendendendmodule2.m序列发生器,级数可选。
modulemm(clk,/数据输入时钟outdata,/输出数据rst,/启动信号jishu,/级数选择);
inputclk;
inputrst;
outputoutdata;
/输出信号reg15:
0shift_buf;
/M序列产生的N位移位寄存器assignoutdata=shift_buf0;
/M序列输出always(posedgeclk)beginif(!
rst)shift_buf=16b1111111111111000;
/15位初始为111111*elsebegincase(jishu)15:
/15级beginshift_buf14=shift_buf0shift_buf14;
shift_buf0=shift_buf1;
shift_buf1=shift_buf2;
shift_buf2=shift_buf3;
shift_buf3=shift_buf4;
shift_buf4=shift_buf5;
shift_buf5=shift_buf6;
shift_buf6=shift_buf7;
shift_buf7=shift_buf8;
shift_buf8=shift_buf9;
shift_buf9=shift_buf10;
shift_buf10=shift_buf11;
shift_buf11=shift_buf12;
shift_buf12=shift_buf13;
shift_buf13=shift_buf14;
end14:
/14级beginshift_buf13=shift_buf0shift_buf13;
end13:
/13级beginshift_buf12=shift_buf0shift_buf12;
end12:
/12级beginshift_buf11=shift_buf0shift_buf11;
end11:
/11级beginshift_buf10=shift_buf0shift_buf10;
end10:
beginshift_buf9=shift_buf0shift_buf9;
end9:
beginshift_buf8=shift_buf0shift_buf8;
sh