软件无线电报告 扩频通信基带_第1页
软件无线电报告 扩频通信基带_第2页
软件无线电报告 扩频通信基带_第3页
软件无线电报告 扩频通信基带_第4页
软件无线电报告 扩频通信基带_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件无线电实验报告基于 FPGA 的直接序列扩频发射机的设计姓 名: 学 号: 联系电话: 班 级: 指导老师: 完成时间:2017-03-22 目录一、概述31、扩频通信的概念及特点32、总体框图及设计要求4二、模块设计及仿真51. 时钟模块52. 数据产生模块73. 卷积模块104. 扩频模块115. 极性变换与内插模块136. FIR低通滤波模块14三、总体设计调试及结果的Matlab验证14四、实验中遇到的问题及解决方案191. 发射模块输出第一帧的首位缺失,后面帧正常发射192. 卷积码输出问题193. 扩频PN码与卷积输出码的对齐问题204. 毛刺和亚稳态问题20一、概述1、扩频通

2、信的概念及特点Ø 定义扩展频谱通信,简称扩频通信,是一种信息传输方式,其信号所占有的频带宽度远大于所传信息必需的最小带宽。Ø 理论基础(即为何采用扩频通信)根据香农公式:C = W×Log2(1+S/N)式中:C-信息的传输速率 S-有用信号功率 W-频带宽度 N-噪声功率由式中可以看出:为了提高信息的传输速率C,可以从两种途径实现,既加大带宽W或提高信噪比S/N。换句话说,当信号的传输速率C一定时,信号带宽W和信噪比S/N是可以互换的,即增加信号带宽可以降低对信噪比的要求,当带宽增加到一定程度,允许信噪比进一步降低,有用信号功率接近噪声功率甚至淹没在噪声之下也是

3、可能的。扩频通信就是用宽带传输技术来换取信噪比上的好处,这就是扩频通信的基本思想和理论依据。Ø 扩频方式扩频系统包括以下几种扩频方式:直接序列扩频,跳频扩频,跳时扩频,宽带线性调频我们只研究其中的直接序列扩频Ø 直接序列扩频所谓直接序列扩频, 就是:l 发射端:直接用具有高码率的扩频码序列对信息比特流进行调制, 从而扩展信号的频谱;l 接收端: 用与发送端相同的扩频码序列进行相关解扩, 把展宽的扩频信号恢复成原始信息。举例:l 发射端:将"1"用11000100110,而将"0"用00110010110去代替,这个过程就实现了扩频,l

4、 接收端:把收到的序列是11000100110就恢复成"1"是00110010110就恢复成"0",这就是解扩。Ø 扩频的好处:1. 速率高:像上面这个例子中信源速率就被提高了11倍(一个周期内原来发送一个比特,现在发送11个比特);2. 保密性强:参考前面的香农公式,扩频之后带宽增加,导致信噪比减小,小到信号完全淹没在噪声中,这样对其他同频段电台的接收不会形成干扰,信号也就不容易被发现,进一步检测出信号就更难,所以有非常高的隐蔽性,非常适合保密通信,特别适合应用于军事领域的通信;2、总体框图及设计要求本实验是基于FPGA的直接序列扩频发射机的

5、设计与仿真。实验中以QuartusII 11.0 为设计工具,modelsim为仿真工具,各模块采用Verilog HDL设计并封装,最后得到的仿真结果使用Matlab描点来绘制出波形。实验框图如图1-1所示,实验要求如下:待发射信息采用循环读ROM的方式,ROM中存储固定的250bit信息。卷积采用(2.1.7)码,卷积后速率翻倍(并串转换)。卷积编码生成多项式为;编码效率;约束长度。扩频码采用KASAMI码,生成多项式为; ;m1和m2的初相():0101 10100101内插0值 ,一个码片插7个0,速率变为32.64M。成型滤波器采用16阶FIR低通滤波器 图2-1-1 系统方框图二、

6、模块设计及仿真根据实验框图,可将本实验设计分成六个模块:时钟模块,数据产生模块,卷积模块,扩频模块,极性变换与内插模块,FIR低通滤波模块。所有的模块都采用全局rst_n(低电平有效)信号低脉冲清零方式,即当rst_n信号低电平有效,所有的计数器和输出全部清零,同时对部分寄存器置位。rst_n信号在仿真开始32.64m时钟周期的第一个周期内产生。设计时采用逐级联调的方式,每设计好一个模块就进行级联仿真。各模块的详细设计及仿真如下:1. 时钟模块从实验框图可以看出,本实验总共需要用到32.64m、4.08m、16k和8k共四种频率的时钟信号,由于输入为32.64m时钟信号,所以需要分频输出另外三

7、种频率信号。我采用PLL,输入时钟为32.64m,输出为4.08m、16k和8k,IP核配置如下:1) Tools->Megawizard Plug-In Manager图2-2-12) 选择PLL核配置如下:图2-2-23) 配置输入时钟和运行模式(normal mode):Normal mode下输入时钟和输出时钟保持边沿对其。图2-2-34) 配置输出时钟与输出使能:图2-2-45) 最后配置好后生成的例化程序如下:1. PLLPLL_inst (2. .inclk0 ( inclk0_sig ),3. .c0 ( c0_sig ),4. .c1 ( c1_sig ),5. .c2

8、 ( c2_sig )6. );6) 仿真如下图2-2-5 时钟8K,16K对比(时序仿真)图2-2-6 时钟4.08M和32.64M对比(时序仿真)(注:图中的时钟没有完全对其是因为时序仿真加了延时信息)2. 数据产生模块数据产生模块由rom地址产生模块和rom模块共同组成。其中rom地址产生模块产生0249共250个地址,并循环计数,rom模块中存入250 bits的信息,通过地址的改变,在时钟跳变沿输出发射信息。1) rom地址产生模块的Verilog语言描述如下:1. always (posedge clk_8k or negedge rst_n)2. /复位信号3. if(rst_n

9、 =1'd0)4. begin 5. addr_r <= 'b0;6. rden <= 1'd0;7. source_data_valid_r <= 1'd0;8. End9. /加1计数器到MAX_ADDR=24910. else if(addr_r < MAX_ADDR)11. begin12. addr_r <= addr_r+8'd1;13. source_data_valid_r <=1'b1;14. rden <=1'b1;15. end16. else 17. begin18. ad

10、dr_r <= 'd0;19. end2) rom模块中的信息储存在rom_256.mif文件中,使用Quartus提供的IP核产生rom模块,配置如下: 图2-2-7 ROM配置图2-2-8 端口配置,深度配置3) 初始化ROM用mif格式文件初始化,格式如下代码。1. WIDTH=1;2. DEPTH=250;3. ADDRESS_RADIX=UNS;4. DATA_RADIX=UNS;5. CONTENT BEGIN 6. 0:1; 7. 1:1; 8. 2:1; 9. 3:0; 10. 4:1; 11. /后面省略共250个数可以使用matlab程序生成随机数(注意最后六

11、位置零,因为FEC初始相位六位)1. close all;2. clear all;3. width=1;4. depth=250;5. data=randn(1,250)>0;6. data(end-5:end)=0;7. fid=fopen('initial_data.txt','w');8. fprintf(fid,'%dn',data);9. /按照格式写入对应的深度,宽度,格式等信息10. fid=fopen('ram_256.mif','w+');11. fprintf(fid,'WIDT

12、H=%d;n',width);12. fprintf(fid,'DEPTH=%d;n',depth);13. fprintf(fid,'ADDRESS_RADIX=UNS;n');14. fprintf(fid,'DATA_RADIX=UNS;n');15. fprintf(fid,'CONTENT BEGIN n');16. for i=1:depth17. fprintf(fid,'%d:%d; n',i-1,data(i);18. end19. fprintf(fid,'END; n'

13、);20. fclose(fid);图2-2-9 数据初始化RTL视图4) 仿真时序图2-2-10 时序仿真结果和matlab结果对比(首部)图2-2-11 时序仿真结果和matlab结果对比(尾部)5) 将仿真数据导出来和matlab对比分析图2-2-12 时序仿真结果和matlab结果对比(一帧数据)3. 卷积模块卷积模块采用(2.1.7)码,编码效率,约束长度。生成多项式为(133,171)。卷积后进行并串转换,先输出133卷积码,后输出171卷积码。卷积电路图如图2-3-1所示,时序仿真如图2-3-2所示。1) Verilog代码输入考虑到同步设计思想,尽量使用原始时钟的分频输出,故对

14、于8kbps的信息码输入和16kbps的卷积码输出,分别采用两种速率的时钟,这样可以尽量保证产生较小的时延,更利于码片对齐。通过对不同时钟沿的采样和输出,所得到的卷积输出结果不同,这里采用在8k时钟上升沿采样输入数据,在16k时钟下降沿输出卷积码,可以获得正确的卷积输出。卷积模块的Verilog语言描述如下1. always (posedge clk_8k or negedge rst_n)2. if (rst_n = 1'b0)3. begin4. fec_in <=7'd0;5. fec_out <=2'd0;6. end7. else if (in_v

15、alid_r = 1'd1)8. begin9. fec_in <= fec_in5:0,in_data_r;10. /卷积码生成11. fec_out<=fec_in0+fec_in2+fec_in3+fec_in5+fec_in6,fec_in0+fec_in1+fec_in2+fec_in3+fec_in6;12. end13. else14. begin15. fec_in <= 7'd0;16. fec_out <= 2'd0;17. end2) 卷积原理图示(2,1,7)卷积码生成器的:图2-3-1 卷积码 (2,1,7)对应的生成多

16、项式:,所以得到生成元为: ,3) 仿真结果对比图2-3-2时序仿真结果和matlab结果对比(首部)图2-3-3时序仿真结果和matlab结果对比(一帧数据)4. 扩频模块扩频模块是本设计的重点,扩频码采用KASAMI码,生成多项式为m1=23(n=4), m2=435(n=8);m1和m2的初相():0101 10100101。扩频码产生电路如图2-4-1所示。扩频码产生模块输出的PN序列与上一级卷积输出进行异或,为了减小毛刺,采用D触发器锁存输出,扩频后的输出波形如图2-4-3所示。扩频码产生模块的Verilog语言描述如下1. always (posedge clk_4_08M or

17、negedge rst_n)2. if (rst_n = 1'b0)3. begin4. m1 <= 4'b0101;5. m2 <= 8'b10100101;6. kasami_code <= 'd0;7. kasami_valid <= 'd0;8. count <= 'd0;9. kasami_last <= 1'b0;10. End11. /255周期12. else if (count = count_254)13. begin14. m1 <= 4'b0101;15. m2 &

18、lt;= 8'b10100101;16. count <= 'd0;17. kasami_last <= 1'b1;18. kasami_code <= m13+m27;19. kasami_valid <= 1'b1;20. End21. /扩频码产生22. else if (fec_out_valid_r1 = 1'b1)23. begin24. m1 <= m12:0,m10+m13;25. m2 <= m26:0,m21+m22+m23+m27;26. kasami_code <= m13+m27;27.

19、 kasami_valid <= 1'b1;28. count <= count+1'b1;29. kasami_last <= 1'b0;30. end31. else32. begin33. kasami_code <= 1'b0;34. kasami_valid <= 1'b0;35. kasami_last <= 1'b0;36. end图2-4-1 扩频码产生电路图图2-4-2 扩频电路模块接口扩频后的仿真对比:图2-4-3时序仿真结果和matlab结果对比(首部)图2-4-4时序仿真结果和matla

20、b结果对比(一帧数据)5. 极性变换与内插模块极性变换是将扩频输出变为双极性码,即将0变换为001,1变换为111。内插是在4.08m双极性码中插入7个0码片,总速率变为32.64m。由于这两个模块并不复杂,故可以合并为一个模块。该模块仿真波形如图2-5-1所示,其Verilog语言描述如下1. always (posedge clk_32_64M or negedge rst_n)2. if (rst_n = 1'b0)3. begin4. reverse_out_w <= 3'b0;5. reverse_out_valid_w <= 1'b0;6. co

21、unt <= 'd0;7. end8. else if (count = count_7)9. begin10. count <= 'd0;11. reverse_out_valid_w <= 1'b1;12. reverse_out_w <= 3'b0;13. end14. else if(kpm_code_valid_r1 =1'b1)15. begin16. reverse_out_valid_w <= 1'b1;17. count <= count+3'd1;18. /计数到0做极性变换,其他计

22、数1-7插零19. case(count)20. 0: reverse_out_w <= (kpm_code_r1)? 3'b001:3'b111;21. default: reverse_out_w <= 3'b0;22. endcase23. end24. else25. begin26. reverse_out_w <= 3'b0;27. reverse_out_valid_w <= 1'b0;28. end图2-5-1 极性变换与内插模块仿真波形(一帧数据)6. FIR低通滤波模块本模块采用老师所提供的低通滤波器即可,注意

23、观察到上一级的输出有毛刺,为了避开毛刺,FIR模块采用上升沿检测。三、总体设计调试及结果的Matlab验证1) 联合调试采用时序仿真,选择仿真器件为Cyclone IV E,引脚分配集中在bank4如下:图3-1 引脚分配2) 编译之后的资源占用图3-2总体资源占用3) 设计RTL视图图3-3 RTL视图,六个模块4) 时序约束,主要包括四个时钟约束主要包括时钟余量,建立时间余量和保持时间余量图3-4 时钟约束,时钟余量图3-5建立/保持时间余量结论:静态时序分析正常,最高时钟可达98.04M,满足要求。5) 时序仿真结果图3-6 时序仿真各个模块输出结果6) Matlab仿真代码 将时序仿真

24、的结果写到txt,和matlab对比,因为只靠人手动对比开头和结尾不一定能保证数据的正确性。1. close all;2. clear all;3.4. % 初始化250个数5. load('initial_data.txt');6. % 对比数据产生模块250个数据7. load('source_data.txt');8. error_source=source_data(1:250)-initial_data;9. 10. % fec11. d_trellis = poly2trellis(7,133 171); 12. d_source = convenc

25、(initial_data,d_trellis);13. 14. % 对比fec数据15. load('fec_out.txt');16. index_fec=0;17. error_fec=d_source-fec_out(1+index_fec*500:500+index_fec*500);18. 19. %kasami 255 生成多项式m1=23(n=4), m2=435(n=8) 20. %初始相位0101 1010010121. m1= 0 1 0 1;22. m2= 1 0 1 0 0 1 0 1;23. kasami_out=zeros(1,255);24. f

26、or i = 1: 255 25. kasami_out(1,i) = mod(m1(1)+m2(1) , 2); 26. x_1 = mod(m1(1) + m1(4) , 2); 27. m1 = m1(2:end),x_1; 28. x_2 = mod(m2(1) + m2(5)+ m2(6)+ m2(7) , 2); 29. m2 = m2(2:end),x_2; 30. end31. %扩频32. kpm_out=zeros(500,255);33. for i = 1:50034. for j = 1:25535. kpm_out(i,j)=mod(kasami_out(j)+d_

27、source(i),2);36. end37. end38. kpm_out2=zeros(1,255*500);39. kpm_out2=reshape(kpm_out',1,500*255);40. 41. % 对比matlab数据和仿真数据42. load('kpm_code.txt');43. kpm_code=kpm_code'44. index_kpm=0;45. error_kpm=kpm_out2-kpm_code(1+index_kpm*500*255:index_kpm*500*255+500*255);46. error_kpm_not=f

28、ind(error_kpm = 0);47. 48. % 将0映射成-1,1映射成149. I=find(kpm_out2=0);50. kpm_out2(I)=7;51. 52. % 插零53. insert_out= zeros(1,8*length(kpm_out2);54. 55. for i=1:8*length(kpm_out2)56. if(mod(i,8)=1)57. insert_out(i)=kpm_out2(fix(i/8)+1);58. else59. insert_out(i)=0;60. end61. end62. 63. %量化3bit64. reverse_ou

29、t2=dec2bin(insert_out,3);65. 66. %验证映射和插零67. reverse_out_matlab=insert_out;68. J=find(reverse_out_matlab=7);69. reverse_out_matlab(J)=111;70. 71. load('reverse_out.txt');72. index_reverse=2;73. error_reverse=reverse_out_matlab'-reverse_out(1+500*255*8*index_reverse:500*255*8*(index_rever

30、se+1);74. error_reverse_sum=sum(error_reverse);仿真结果:图3-7 matlab对比数据数据产生error_source为0,卷积error_fec为零,扩频error_kpm为零,交织和插零之后数据太多,matlab无法显示所有数据,所以对error_reverse_sum求和,结果为零,说明该模块也正确无误。总共验证了连续三帧的数据结果正确。7) FIR联调结果绘图将FIR模块用上之后,16bit数据导出转换成带符号整数,matlab绘图如下:图3-8 matlab绘图四、实验中遇到的问题及解决方案1. 发射模块输出第一帧的首位缺失,后面帧正常

31、发射数据初始化我是同时产生读地址和读使能信号,由于初始地址是0,在地址开始加1的时候再把读使能置1,导致了读使能在地址为1的时候才开始,导致读取ROM的数据也是从地址1开始,但是不影响第二帧的输出。评估问题,该问题可以通过把地址初始值置为-1,或者将程序最开始的触发信号作为读使能。代码如下:1. /产生读地址和使能信号2. always (posedge clk_8k or negedge rst_n)3. if(rst_n =1'd0)4. begin 5. addr_r <= -8'd1;6. rden <= 1'd0;7. source_data_valid_r <= 1'd0;8. end9. else if(addr_r=-8'd1 | addr_r < MAX_ADDR)10. begin11. addr_r <= addr_r+8'd1;12. source_data

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论