




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、扩频发射机的设计实现与仿真一、 概述扩频通信是将待传输的信息数据用伪随机码调制, 实现频谱扩展后再传输, 接收端则采用同样的pn 码进行解调及相关处理, 恢复原始信息数据。直接序列扩频方式(dsss)作为扩频通信中的一种, 其扩频的实现方法比较容易, 电路的设备量小, 应用广泛, 本设计实现的是基于fpga的这种扩频方式的发射机。实验中以quartusii 7.2 为设计和仿真工具来实现直接序列扩频(dsss)扩频发射机,顶层采用图形设计方式, 而各模块基于verilog hdl设计,最后得到的仿真结果使用matlab来绘制出结果波形。基本框图如下:图1 发射机基本框图其中:(1) 待发射信息
2、采用循环读rom的方式,rom中存储固定的200bit信息。这200bit信息是对正弦函数进行采样得到的。(2) 卷积采用(2, 1, 7)卷积码,生成多项式为(133,171)。(3) 扩频模块采用扩频长度255 的kasami码,生成多项式为m1=23(n=4),m2=435(n=8)。m1和m2的初相为:m1=0101,m2=10100101。(4) 极性变换模块为3bit 量化模式。0->001,1->111。(5) 内插模块中内插0值,一个码片后插7个0。(6) 基带成型滤波器使用给出的16 阶的fir 滤波器模块。二、 详细设计1、模块划分基本上按照框图来进行模块的划分
3、。但首先要实现时钟模块,产生系统所需的各个时钟。待发射信息固化在rom中,也要设计rom的控制模块来循环发出待发射的数据。因此将整个系统划分为以下模块:时钟模块、地址控制模块、rom模块、卷积模块、扩频和变换模块、内插模块以及滤波器模块。其中滤波器模块已给出,直接使用即可。只对其余模块进行设计说明。这些模块除了rom是直接使用系统提供的标准模块外,别的都是用verilog hdl生成的。2、时钟模块整个系统所需时钟为4khz、8khz、2.04mhz、16.32mhz。使用一个全局时钟,为16.32mhz的两倍频即32.64mhz,而其他时钟都是从它分频得到的,这样各个时钟相对于主时钟的延时就
4、是相同的,可以更好的实现各时钟间的同步对齐。时钟设计中,使用寄存器来进行计数,在主时钟的下降沿计数,而在上升沿进行各个时钟的翻转,复位时全部分频计数器归零,同时各时钟也归零。完整代码如下/ clocks.vmodule clocks(clk3264, reset,clk1632, clk204, clk8, clk4);input clk3264, reset;output clk1632, clk204, clk8, clk4;/ 输出时钟寄存器reg clk1632, clk204, clk8, clk4;/ 分频计数器reg temp;reg 2:0 count204;reg 10:0
5、count8;reg 11:0 count4;/ 复位及分频计数器计数always (negedge clk3264 or negedge reset)beginif(reset)/复位,分频计数器清零begincount204 <= 0;count8 <= 0;count4 <= 0;endelse/ 分频计数器计数begintemp <= temp;/count204以8(4'b1000)进制计数if(count204 = 3'b111)count204 <= 0;elsecount204 <= count204 + 3'b1;/
6、count8以2040(11'b11111111000)进制计数if(count8 = 11'b11111110111)count8 <= 0;elsecount8 <= count8 + 11'b1;/count4以4080(12'b111111110000)进制计数if(count4 = 12'b111111101111)count4 <= 0;elsecount4 <= count4 + 12'b1;endend/产生时钟信号always (posedge clk3264 or negedge reset)begin
7、if(reset) / 复位,时钟输出寄存器清零beginclk1632 <= 0;clk204 <= 0;clk8 <= 0;clk4 <= 0;endelsebegin/ 产生16.32mhz的时钟信号clk1632 <= temp;/ 计数值达到7,即2*8分频,输出翻转,产生2.04mhz时钟if(count204 = 3'b111)clk204 <= clk204;/ 计数值达到2039,即2*2040分频,输出翻转,产生8khz时钟if(count8 = 11'b11111110111)clk8 <= clk8;/ 计数值达
8、到4079,即2*4080分频,输出翻转,产生4khz时钟if(count4 = 12'b111111101111)clk4 <= clk4;endendendmodule时序仿真得到的波形如下:图 2 时钟模块的时序仿真结果从仿真波形上可以看出,各个时钟的跳变沿达到了良好的对齐。3、地址控制模块地址控制模块使用4khz时钟驱动一个计数器来循环产生地址信息,使得rom中存储的待发射信息循环不断的输出。这里设置为在4khz时钟的下降沿输出地址信息。并且由reset信号来进行复位,复位时输出地址归零,重新开始地址输出的循环。代码如下:/ rom_ctrl.vmodule rom_ct
9、rl(clk4, reset, add);input clk4, reset;output 7:0 add;reg 7:0 add;always (negedge clk4 or negedge reset)beginif(reset)beginadd <= 0;endelsebeginif(add = 8'b11000111) /地址值到199时归零add <= 0;elseadd <= add + 8'b1;endendendmodule时序仿真得到的波形如下页图示:从仿真结果中可以明显看出,在4khz时钟的下降沿输出地址信息时会产生毛刺的不稳定现象,因此
10、在下一个模块从rom上读取信息时应在4khz时钟的上升沿读取,这样才可以获得正确而又稳定的数据。图 3 地址控制模块的时序仿真结果4、rom模块rom直接使用系统提供的标准模块即可。设置为200字长、1位宽。而对应rom中的存储信息的获取采用对正弦函数的采样获取。在matlab中编制.m文件采样正弦函数,将采得的数据信息存储为.txt文件,而后根据内存初始化文件(.mif文件)的格式,编制一个c语言小程序实现两者文件格式的转换。将转换后的.mif文件作为rom中的数据信息。rom中的200bit数据最后6位必须为0,所以可以采集194位数据。采集时使用16位的量化,故而需要13个采集点的数据,
11、实际采集15个点。matlab下采集数据的.m文件内容即matlab代码如下:%sinsampledata.m%采集15个点,每个点的数据为16位量化fi=10;%正弦函数频率为10kfs=150;%采集频率为150kn=15;fid=fopen('sinsampledata.txt','w');for i=1:n f=1+sin(2*pi*(fi/fs)*i+0.3*pi); f=round(f*32678); str=dec2bin(f); for j=1:16 %对于转换后二进制位数不足16位的,前边补零 if(length(str)<16) str
12、=strcat('0',str); end end fprintf(fid,'%s',str);end;fclose('all');在matlab中运行这个.m文件采集到的数据信息如图4所示。共采集到15个数据,即15*16=240个二进制数据。图 4 matlab中采集到的数据信息根据quartusii中.mif文件的格式,对上面用matlab采集到的二进制数据信息,编制c程序完成格式转换,得到.mif文件,c源代码如下: #include <stdio.h>#include <stdlib.h>void main()f
13、ile * infile;file * outfile;int i,j;char str20;infile = fopen("sinsampledata.txt", "r");outfile = fopen("rom_init.mif", "w");/若文件打开成功则开始转换,失败则提示if(infile = null)|(outfile = null)printf("文件不存在,请检查文件信息n");else/写入文件头信息fprintf(outfile, "width=1;ndep
14、th=200;naddress_radix=uns;ndata_radix=uns;ncontent beginn");for(i=0;i<194;i+)/字符串设置为“ 序号 : 值;”的格式sprintf(str, " %d : ", i);/将从sinsampledata.txt中读到的一位数据放入字符串尾部for(j=0;strj!='0'j+);strj+ = fgetc(infile);strj+ = ''strj+ = 'n'strj+ = '0'/将字符串str写入文件rom_i
15、nit.miffprintf(outfile, "%s", str);/剩余六位设置为0for(;i<200;i+)sprintf(str, " %d : ", i);for(j=0;strj!='0'j+);strj+ = '0'strj+ = ''strj+ = 'n'strj+ = '0'fprintf(outfile, "%s", str);/写入文件结束信息fprintf(outfile, "end;n");/关闭文件f
16、close(infile); fclose(outfile);printf("转换成功"); 编译运行该c程序,完成了文件的转换。生成的rom_init.mif文件用记事本打开如上边右图。用quartus打开该文件可看到文件中的数据被quartus正确读取了。图 5 采集转换后的数据被正确读取完成rom初始化文件后,可以对带发射信息部分进行联调。在quartus中建立dsss_test工程,使用图形设计方式在其中加入已经完成的地址控制模块,并且加入一个rom模块,将rom的初始化信息设置指向刚刚得到的rom_init.mif文件,编译该工程,并且测试,可得到结果波形,对照结
17、果波形可看出,这两个模块联调后,在4khz时钟的下降沿输出了地址信息,但地址信息有一些毛刺出现,而在4khz时钟的上升沿,输出端口的数据才发生变化。因此对于后面的模块,应该在4khz时钟的上升沿读取rom信息。图 6 地址生成模块与rom的联调和仿真5、卷积和串并模块此模块完成卷积功能,由双时钟控制,4khz控制输入,8k控制输出。由于rom模块在4khz时钟的上升沿输出数据信息,因此该模块在4khz时钟的上升沿进行卷积。利用6 单元的移位积存器实现(2,1,7)卷积码, 生成多项式为(133,171)。卷积后数据量翻倍,因此需要进行并串转换。在8khz的下降沿,通过对标志位sel的判断来决定
18、输出哪个值并输出数据。复位信号reset控制中间结果的清零和标志寄存器的复位。具体代码如下:/ juanji_chuanbing.vmodule juanji_chuanbing(clk4, clk8, reset, indata, outdata);input clk4, clk8, reset, indata;output outdata;reg outdata, sel;reg 5:0 temp;reg 1:0 data;always (posedge clk4 or negedge reset)beginif(reset)begintemp <= 0;data <= 0;e
19、ndelsebegintemp <= temp<<1;temp0 <= indata;/计算生成多项式为133(即1011011)的结果data0 <= temp5 temp3 temp2 temp0 indata;/计算生成多项式为171(即1111001)的结果data1 <= temp5 temp4 temp3 temp2 indata;endendalways (negedge clk8 or negedge reset)beginif(reset)beginsel <= 0;outdata <= 0;endelsebeginif(sel
20、)beginoutdata <= data0;sel <= sel;endelsebeginoutdata <= data1;sel <= sel;endendendendmodule对该模块进行时序仿真,得到的结果如下:图 7 卷积和串并模块的仿真结果6、直接序列扩频和极性变换模块这里我将直接序列扩频和极性变换放在了同一个模块中进行处理。由于上一模块在8khz的下降沿输出数据,而由时钟模块的仿真结果可看到,8khz时钟的下降沿和2.04mhz时钟的下降沿是对齐的,二者的上升沿也是对齐的。由卷积和串并模块仿真的结果可明显看到,数据在8khz时钟的下降沿输出,但有一定延时
21、,因此为取得正确而稳定的数据,该模块亦采用双时钟控制,在8khz时钟的上升沿获取数据,储存在寄存器里,而在2.04mhz时钟的下降沿进行扩频工作,这样经过寄存器的中转可以形成良好的数据同步,还可以有效的消除可能产生的毛刺。扩频采用扩频长度为255 的kasami码,kasami码生成多项式为23(n=4即1011)、435(n=8即10011101),初相m1=0101,m2=10100101。在2.04mhz时钟脉冲的下降沿进行计数器计数、寄存器m1和m2的移位、生成kasami序列和计算pn码。计数器进行255进制的计数,当计数值为127时输出数据,其他情况输出pn码。最后进行极性变换并输
22、出数据。完整代码如下:/ kuopin_bianhuan.vmodule kuopin_bianhuan(clk8, clk204, reset, indata, outdata);input clk8, clk204, reset, indata;output 2:0 outdata;reg 2:0 outdata;reg data, temp;reg 3:0 m1;reg 7:0 m2;reg pn;reg 7:0 count;/在8khz时钟上升沿获取数据always (posedge clk8 or negedge reset)beginif(reset)data <= 0;el
23、sedata <= indata;end/在2.04mhz时钟下降沿计算pn码并进行极性变换以输出数据always (negedge clk204 or negedge reset)beginif(reset) begin/复位,相位恢复至初相,输出均置零m1 <= 4'b0101;m2 <= 8'b10100101;pn <= 0;count <= 0;temp <= 0;outdata <= 0;endelsebegincount <= count + 8'b1;m13 <= m11 m10;m12:0 <
24、= m13:1;m27 <= m20 m22 m23 m24;m26:0 <= m27:1;pn <= m10 m20;/计数值达到254(8'b11111110)时清零,实现255进制计数if(count = 8'b11111110)count <= 0;/计数值达为127(8'b01111111)时输出data,否则输出pn码if(count = 8'b01111111)temp <= data;elsetemp <= pn;/极性变换outdata <= temp? 3'b111:3'b001;en
25、dendendmodule该模块的时序仿真结果如下:图 8 扩频和极性变换模块的仿真结果由仿真结果可明显看到,在count为127时,temp与pn码不再保持一致,而是中间输出一个data。7、内插模块内插模块完成码片的零值插入工作,每个码片后面插入7个0。设置一个8进制计数器,在16.32mhz时钟的下降沿进行计数,当计数值达到7的时候将前边寄存到的输入数据输出,否则输出0值,这样达到插入0值的目的。具体代码如下:/ neicha.vmodule neicha(clk1632, reset, indata, outdata);input clk1632, reset;input 2:0 in
26、data;output 2:0 outdata;reg 2:0 outdata;reg 2:0 count;always (negedge clk1632 or negedge reset)beginif(reset)begincount <= 0;outdata <= 0;endelsebegincount <= count + 3'b1;if(count = 3'b111)outdata <= indata;elseoutdata <= 0;endendendmodule对内插模块进行时序仿真,得到结果如图9所示:从图中可以看到,码片111和0
27、01之间被插入了7个0值。图 9 内插模块的仿真结果8、成型滤波器模块使用给出的fir基带成型滤波器模块即可。直接进行仿真,给出仿真结果如下:图 10 rir模块的仿真结果三、 系统级联及其仿真结果在各个模块分别设计好之后,即进行系统级联和仿真。在quartus中建立工程顶层设计采用图的设计方式,将前面做好的各个模块添加到该工程中,然后编译整个工程,进行时序仿真以得到仿真结果。同时对最后的结果放入matlab中绘图。原理图设计如图11所示:图 11 顶层设计图编译报告如下:图 12 成功编译仿真,可得到时序仿真结果如图13:图 13 级联后的仿真结果将此结果另存为.tbl文件,然后在matlab中建立.m文件,代码如下:% jieguoxianshi.mclear all;%以只读方式打开.tbl文件f1 = fopen('d:mysoftquartusiiquartusworksdsss_transmiterdsss_transmiter.tbl','r');data = fscanf(f1,'%s');fclose(f1);b = find(data = '='); %找出“”的下标num = lengt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中储粮求职必 备:中储粮面试题目及答案深度解读
- 初中教师面试实战模拟题库:教育行业的职业发展方向
- 粮油保管岗位深度面试问题库
- 家政服务行业保姆面试题库及答案解析
- 新媒体运营教学教案(1-2)认识新媒体
- 青海人才招聘系列:面试题目及答案详解
- 工业自动化工贸面试题及答案
- 学校地震安全知识培训课件
- 学写请假条课件
- 2025年智慧物流配送体系建设资金申请项目实施计划评估报告
- 2025年广西广投智能科技有限公司招聘笔试参考题库含答案解析
- 《细胞信号与分子通路》课件
- 《农村集中式生活污水分质处理及循环利用技术指南》
- 电商承揽合同范例
- 高一地质灾害课件
- 2024-2030年中国南美白对虾养殖市场规模分析及发展风险研究报告权威版
- 综合行政执法培训
- 白班阿姨合同范例
- 口腔门诊合作模式的合同范本
- 全国高中生物奥林匹克竞赛考试大纲
- 消防安全评估报告模板
评论
0/150
提交评论