软件无线电报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、概述 (2)
1、扩频通信的概念及特点 (2)
2、总体框图及设计要求 (2)
二、模块设计及仿真 (3)
1、时钟模块 (3)
2、发射模块 (5)
3、卷积模块 (7)
4、扩频模块 (8)
5、极性变换与内插模块 (10)
6、FIR低通滤波模块 (11)
三、总体设计调试及结果的Matlab验证 (12)
四、实验中遇到的问题及解决方案 (14)
1、发射模块输出首位时延问题 (14)
2、卷积码并串转换后的输出问题 (15)
3、扩频PN码与卷积输出码的对齐问题 (17)
4、毛刺问题 (17)
一、概述
1、扩频通信的概念及特点
扩展频谱通信系统(Spread Spectrum Communication System )是指将待传输信息的频谱用某个特定的扩频函数扩展后成为宽频带信号,送入信道中传输,接收端再利用相应手段将其解扩,从而获取传输信息的通信系统。
扩频信号是不可预测的伪随机的宽带信号;它的带宽远大于欲传输信息(数据)带宽;具有类似于噪声的随机特性等。
直接序列扩频(DSSS)是扩频通信方式中的一种,实现简单,应用广泛。
2、总体框图及设计要求
本实验是基于FPGA 的直接序列扩频发射机的设计与仿真。
实验中以QuartusII 7.2 为设计和仿真工具,各模块采用Verilog HDL 设计并封装,顶层使用图形设计方式,最后得到的仿真结果使用Matlab 描点来绘制出波形。
实验框图如图1-1所示,实验要求如下:
①待发射信息采用循环读ROM 的方式,ROM 中存储固定的200bit 信息。
②卷积采用(2.1.7)码,卷积后速率翻倍(并串转换)。
卷积编码生成多项式为)171,133(;编码效率2/1=R ;约束长度7=K 。
③扩频码采用KASAMI 码,生成多项式为)4(231==n m ; )8(4352==n m ;m1和m2的初相(,...,...011011a a a a a a a a n n n n --):0101 10100101
④内插0值 ,一个码片插7个0,速率变为16.32M 。
⑤成型滤波器采用16阶FIR 低通滤波器
图1-1 系统方框图
二、模块设计及仿真
根据实验框图,可将本实验设计分成六个模块:时钟模块,发射模块,卷积模块,扩频模块,极性变换与内插模块,FIR低通滤波模块。
所有的模块都采用全局reset信号低脉冲清零方式,即当reset信号低电平有效,所有的计数器和输出全部清零,同时对部分寄存器置位。
reset信号在仿真开始16.32m时钟周期的第一个周期内产生。
设计时采用逐级联调的方式,每设计好一个模块就进行级联仿真。
各模块的详细设计及仿真如下:
1、时钟模块
从实验框图可以看出,本实验总共需要用到16.32m、2.04m、8k和4k共四种频率的时钟信号,由于机器只提供16.32m时钟信号,所以需要分频输出另外三种频率信号。
时钟模块采用了同步设计思想,即分频时钟全部都在机器提供的16.32m时钟基础上进行分频产生,这样可以尽量保证不同时钟频率间的同步,使其跳变沿尽量对齐,为后面的码片对齐和消除毛刺打好基础。
时钟模块的Verilog语言描述如下:
//Description of clock
module clock (clk16_32m,clk2_04m,clk8k,clk4k,reset); //时钟模块
input clk16_32m,reset; //输入为机器提供的16.32M时钟和全局清零信号reset
output clk2_04m,clk8k,clk4k; //分频后输出2.04m,8k和4k的时钟信号
reg clk2_04m,clk8k,clk4k;
reg[1:0] count1; //2.04m分频时钟计数器
reg[9:0] count2; //8k分频时钟计数器
reg[10:0] count3; //4k分频时钟计数器
always @(negedge clk16_32m or negedge reset) //产生2.04M时钟
begin
if(reset==0) //reset全局清零信号,低电平有效
begin
count1<=0;
clk2_04m<=0;
end
else case(count1)
3'd3:begin
count1<=0;
clk2_04m<=~clk2_04m;
end
default:
count1<=count1+1;
endcase
end
always @(negedge clk16_32m or negedge reset) //产生8k时钟
begin
if(reset==0) //reset全局清零信号,低电平有效
begin
count2<=0;
clk8k<=0;
end
else case(count2)
11'd1019:begin
count2<=0;
clk8k<=~clk8k;
end
default:
count2<=count2+1;
endcase
end
always @(negedge clk16_32m or negedge reset) //产生4k时钟
begin
if(reset==0) //reset全局清零信号,低电平有效
begin
count3<=0;
clk4k<=1; //4k时钟初始化输出为高电平,
//可以使rom模块输出无时延,详见后述
end
else case(count3)
12'd2039:begin
count3<=0;
clk4k<=~clk4k;
default:
count3<=count3+1;
endcase
end
endmodule
时钟模块的时序仿真图如图1-1所示,其中输出4k时钟第一个周期的波形仿真如图1-2所示。
仿真时16.32m时钟一个周期为20ns,在仿真开始由于有reset信号会使时钟输出延迟一个16.32m时钟周期,所以4k时钟的第一个周期跳变沿应该在81.62us处,由图1-1中所示可以看出三个输出时钟基本对齐,且延迟不大。
图2-1-1 时钟模块输出波形图
图2-1-2 时钟模块输出4k时钟一个周期波形图
2、发射模块
发射模块由rom地址产生模块和rom模块共同组成。
其中rom地址产生模块产生0~199共200个地址,并循环计数,rom模块中存入200 bits的信息,通过地址的改变,在时钟跳变沿输出发射信息。
rom地址产生模块的Verilog语言描述如下
//Description of rom_address
module rom_address(address, clk4k, reset);
input clk4k, reset; //输入4k时钟和全局清零信号reset
output [7:0] address; //输出0~199共200个地址,用8位二进制寄存器保存
reg [7:0] address;
always @(negedge clk4k or negedge reset)
begin
if(reset==0) //reset为全局清零信号,低电平有效
begin
address<=0;
end
else case(address)
199:address<=0; //地址值到199时归零,实现循环计数
default:
address<=address+1;
endcase
end
endmodule
rom模块中的信息储存在rom.mif文件中,如图2-1所示,使用Quartus提供的电路产生rom模块,与rom地址模块级联后的方框图如图2-2所示,级联后的仿真波形如图2-3所示。
图2-2-1 rom.mif文件中的信息
图2-2-2 rom地址产生模块和rom模块级联图
图2-2-3 rom地址产生模块和rom模块级联后的仿真波形图
3、 卷积模块
卷积模块采用(2.1.7)码,编码效率2/1=R ,约束长度7=K 。
生成多项式为(133,171)。
卷积后进行并串转换,先输出133卷积码,后输出171卷积码。
卷积电路图如图3-1所示,时序仿真如图3-2所示。
考虑到同步设计思想,尽量使用原始时钟的分频输出,故对于4kbps 的信息码输入和8kbps 的卷积码输出,分别采用两种速率的时钟,这样可以尽量保证产生较小的时延,更利于码片对齐。
通过对不同时钟沿的采样和输出,所得到的卷积输出结果不同,详见后述。
这里采用在4k 时钟上升沿采样输入数据,在8k 时钟下降沿输出卷积码,可以获得正确的卷积输出。
卷积模块的Verilog 语言描述如下 //Description of convolute
module convolute(cout,cin,clk4k,clk8k,reset);
input cin,clk4k,clk8k,reset; //输入待发射信息和时钟信号及全局清零信号 output cout; //卷积进行串并转换后再输出
reg [5:0] temp; //卷积移位寄存器
reg [1:0] out; //卷积码寄存器,并行2位 reg tag,cout; //tag 标志位,可以保证先输出133卷积码,后输出171卷积码
always @ (posedge clk4k or negedge reset) //4k 上升沿采样信息 begin if(reset==0) //全局清零信号reset begin temp<=0; out<=0; end else begin temp[5:1]<=temp[4:0]; temp[0]<=cin;
out[0]<=temp[5]^temp[4]^temp[2]^temp[1]^cin; //133卷积码生成多项式为x^6+ x^5+ x^3+ x^2+ 1
out[1]<=temp[5]^temp[2]^temp[1]^temp[0]^cin; //171卷积码生成多项式为 x^6+ x^3+ x^2+ x^1+ 1 end end
always @ (negedge clk8k or negedge reset) //8k 下降沿输出并串转换后的卷积码 begin if(reset==0) //reset 全局清零信号 begin tag<=0; //tag 初始化置位为0,可保证先输出133卷积码
cout<=0;
end
else case(tag) //采用case 语句代替if else 嵌套,以提高并行性和节省资源 0:begin cout<=out[0]; tag<=~tag; end 1:begin cout<=out[1]; tag<=~tag; end endcase end endmodule
图2-3-1 卷积编码电路图
图2-3-2 卷积编码及并串转换后的输出波形图
4、 扩频模块
扩频模块是本设计的重点,扩频码采用KASAMI 码,生成多项式为m1=23(n=4), m2=435(n=8);m1和m2的初相(,...,...011011a a a a a a a a n n n n --):0101 10100101。
扩频码产生电路如图2-4-1所示。
扩频码产生模块输出的PN 序列与上一级卷积输出进行异或,为了减小毛刺,采用D 触发器锁存输出,级联电路如图2-4-2所示,扩频后的输出波形如图2-4-3所示。
扩频码产生模块的Verilog 语言描述如下
输入信息
4kbps
输出信息
8kbps
//Description of kasami
module kasami(m,clk2_04m,reset); //kasami码生成模块
input clk2_04m,reset; //输入为2.04m时钟和全局清零信号reset
output m; //输出m序列
reg [3:0] m1; //kasami码1寄存器
reg [7:0] m2; //kasami码2寄存器
reg indata,temp;
reg m;
always @(negedge clk2_04m or negedge reset)
begin
if(reset==0) //全局信号reset,低电平有效
begin
indata<=0; //初始化清零,kasami码寄存器置初相
m1<=4`b0101;
m2<=8`b10100101;
end
else
begin
m<=m1[3]^m2[7];
m1<=m1<<1;
m2<=m2<<1;
m1[0]<=m1[0]^m1[3]; //kasami码1生成多项式为1+x+x^4
m2[0]<=m2[1]^m2[2]^m2[3]^m2[7];
//kasami码2生成多项式为1+x^2+x^3+x^4+x8 end
end
endmodule
图2-4-1 扩频码产生电路图
图2-4-2 扩频电路级联图
图2-4-3 扩频后的输出波形仿真
5、极性变换与内插模块
极性变换是将扩频输出变为双极性码,即将0变换为001,1变换为111。
内插是在2.04m 双极性码中插入7个0码片,总速率变为16.32m。
由于这两个模块并不复杂,故可以合并为一个模块。
该模块仿真波形如图2-5所示,其Verilog语言描述如下
//Description of reverse_insert
module reverse_insert(out,in,clk16_32m,reset);
input in,clk16_32m,reset; //输入为上级扩频输出,时钟16.32m,全局信号reset
output [2:0] out; //输出16.32m码片每秒的信息,每个码片由3比特组成
reg [2:0] count;
reg [2:0] out;
always @(negedge clk16_32m or negedge reset)
begin
if (reset==0) //reset全局清零信号,低电平有效
begin
out<=0;
count<=0;
end
else case(count) //采用case语句,提高系统运行的并行性
4: begin //2.04m时钟周期的中间时刻进行数据采样和极性变换
out<=in?3'b111:3'b001; //将1变为111,将0变为001
count<=count+1;
end
7: begin
out<=0;
count<=0;
end
default:begin
out<=0;
count<=count+1;
end
endcase
end
endmodule
图2-5 极性变换与内插模块仿真波形
6、FIR低通滤波模块
本模块采用老师所提供的低通滤波器即可
三、总体设计调试及结果的Matlab验证
总体设计采用方块图的方式,在顶层建立.bdf文件,通过上面各个模块产生的方块图,直接在顶层模块中调用即可,总体级联方框图如图3-1所示。
由于上面的分模块设计方案中都是采用的逐级联调的方法(即每做好一个模块就与上一级模块一起进行级联调试),这样对于总体级联调试就比较容易了。
级联之后进行波形仿真,如图3-2所示。
对上述输出结果通过Matlab进行描点画图,可得到如图3-3所示的波形图,从该图中可以看出,经fir基带成型滤波器后的输出波形基本符合要求。
总体设计框图,即去掉所有其他的输出而只留下输入和最终输出管脚的总设计图,如图3-4所示。
图3-1 总体级联框图
图3-2 总体级联波形仿真图
图3-3 输出结果通过Matlab描点画图
图3-4 总体设计框图
四、实验中遇到的问题及解决方案
1、发射模块输出首位时延问题
对于发射模块信息输出,第一位输出的时延可能会对后面的卷积以及以后的模块产生较大影响。
我经过仿真发现,时钟模块中的4k时钟输出初始化电平的高低会使发射模块输出的信息产生不同的时延;发射模块中的rom地址产生模块里,地址输出信息输出的时钟跳变沿不同对rom模块的信息输出也会产生不同的时延。
从上面的mif文件截图中可以得到,rom输出信息的前六位应该为011010,下面对四种不同情况下的输出进行仿真
①4k时钟初始化输出为低电平,地址模块上升沿输出地址信息时,会产生半个码片的时延(4k时钟的半个周期),如图4-1-1所示
②4k时钟初始化输出为低电平,地址模块下降沿输出地址信息时,同样会产生半个码片的时延(4k时钟的半个周期),如图4-1-2所示
③4k时钟输出初始化为高电平,地址模块上升沿输出地址信息时,会产生一个码片的时延(4k时钟的一个周期),如图4-1-3所示
④4k时钟输出初始化为高电平,地址模块下降沿输出地址信息时,则rom输出刚好为第一个码片,无时延,为正确输出信息。
如图4-1-4所示
图4-1-1 4k时钟初始化输出为低电平,地址模块上升沿输出地址信息
图4-1-2 4k时钟初始化输出为低电平,地址模块下降沿输出地址信息
图4-1-3 4k时钟输出初始化为高电平,地址模块上升沿输出地址信息
图4-1-4 4k时钟输出初始化为高电平,地址模块下降沿输出地址信息
2、卷积码并串转换后的输出问题
卷积码由并行2位输出变换为串行1位输出,我使用的是tag标志位来实现并串转换。
当tag=0时,输出133卷积码;当tag=1时,输出171卷积码。
而tag的初始化是由全局清零信号reset控制的,初始化的值为0,这样理论上可以保证了并串转换后的输出是先输出133卷积码。
具体的并串转换部分Verilog语言描述如下
always @ (negedge clk8k or negedge reset) //8k时钟下降沿输出并串转换后的卷积码begin
if(reset==0)
begin //reset全局清零信号
tag<=0;
cout<=0;
end
else case (tag)
0:begin //tag=0时输出133卷积码
cout<=out[0];
tag<=~tag;
end
1:begin //tag=1时输出171卷积码
cout<=out[1];
tag<=~tag;
end
endcase
end
但实际仿真过程中却遇到了问题,如图5-2-1所示。
由卷积编码电路可得卷积码的基本生成矩阵为
G=[1 1 0 1 1 1 1 1 0 0 1 0 1 1 ]
根据rom模块的输出信息
romout=0 1 1 0 1 0 1 1 0 0 1 0 …
可以得到卷积后的并行输出为
out[0]=0 1 1 1 1 1 1 0 …(133卷积码)
out[1]=0 1 0 0 1 0 0 0 …(171卷积码)
按照先输出133卷积码的顺序,则输出结果应该为
cout=0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 ……
若按照先输出171卷积码的顺序,则输出结果应该为
cout=0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0
从图4-2-1中可以看出卷积后的并行输出是正确的,只不过由于采样时间的不同,产生了半个码片的偏移。
但并串转换之后的输出却顺序却是先输出的171卷积码,后输出的131卷积码,这与设计的初衷正好相反。
所以考虑到把tag初始化的值设为1,然后进行仿真,则刚好可以得到正确的结果,如图4-2-2所示。
图4-2-1 tag初始化为0时卷积后并串转换输出波形
图4-2-2 tag初始化为1时卷积后并串转换输出波形
分析原因,我觉得问题可能是由于输入数据的采样时刻和输出数据的时刻的不同所导致。
于是,我将tag初始化值重新设为0,然后分别改变输入数据的采样时刻和输出数据的
时刻的跳变沿,进行仿真,结果如图4-2-3,图4-2-4,图4-2-5和图4-2-6所示。
由仿真结果可以看出,初始化tag=0时,只有在4k上升沿采样输入数据,才能得到正确的卷积结果,即先输出133卷积码,后输出171卷积码。
比较图4-2-5和4-2-6可以看出,在8k时钟上升沿输出数据会产生了两个半个码片周期(8k时钟的半个周期)的时延,这对后面的扩频对齐会产生影响。
而在8k时钟下降沿输出虽然会产生三个码片的时延,但由于输出码片刚好与8k时钟周期对齐,有利于后续扩频码的对齐。
另外,输出初始时刻的初始化值对接收解扩影响不大。
综合考虑,选取在4k上升沿采样数据,在8k下降沿输出卷积码。
仿真结果如图4-2-5所示。
图4-2-3 tag=0,4k下降沿采样,8k上升沿输出
图4-2-4 tag=0,4k下降沿采样,8k下降沿输出
图4-2-5 tag=0,4k上升沿采样,8k下降沿输出
图4-2-6 tag=0,4k上升沿采样,8k上升沿输出
3、扩频PN码与卷积输出码的对齐问题
扩频PN码与卷积输出码尽量对齐,这是必要的,也是必须的。
要做到这一点,我的解决方案是尽量保证时钟的对齐,这从图2-1-2中可以看出,各时钟基本对齐,延时不超过16.32m时钟的半个周期。
同时,从上一个问题的解决方案中可以看到,对于扩频输出,只要延时是8k时钟周期的整数倍,则对扩频影响不大,仅仅只是多了一个码片的开头部分而已(开始时刻多输出一两个码片对接收影响不大,接收方会通过CRC等各种校验方式来判别所接收的是否为有用信息)。
而如果像图4-2-3和4-2-6那样,在8k时钟上升沿输出扩频码,则会产生半个8k时钟码片的延时,这样就不利于对齐。
4、毛刺问题
毛刺的产生对输出结果会产生影响,不利于接收机正确接收信息,故应当尽量避免和减小毛刺。
减小毛刺的方法有很多,由于FIR滤波器是16阶同时采样,不可避免的会产生毛刺,所以我主要针对前面各模块进行毛刺的减小设计,主要解决方案是:第一,尽量采用系统原始时钟作为模块的输入时钟。
由于数据采样和输出大都是在跳变沿进行,如果跳变沿不能有效对齐的话,就很可能产生较大毛刺甚至输出错误信息。
所以,我在设计时钟模块时都是采用的系统时钟进行分频,这样可以尽量保证分频后各时钟跳变沿的对齐。
同时,在卷积模块中,由于4k和8k时钟相对于16.32m时钟而言比较长,容易产生偏移,故在进行卷积时采用双时钟,在4k上升沿采样信息位,在8k下降沿输出并串转换后的卷积码,这样也能减小一些可能产生的毛刺。
第二,卷积输出和kasami码输出进行异或之后经过D触发器进行锁存,这样数据只在时钟跳变沿发生改变,从而可以减少一些由于电平不稳定产生的毛刺。
第三,整体级联调试的时候,发现极性变换和内插模块的输出结果以及最终的输出结果产生了较大的毛刺。
极性变换和内插模块的输出在从1变为111时产生的毛刺比较大,仿真波形如图4-4-1所示。
将并行输出信息进行放大之后如图4-4-2所示。
从图中可以看出,由于内插后输出3bit位的低位(rout[0])超前于高两位(rout[1] 和rout[2]),所以内插输出结果在111前后各产生了几个ns的毛刺。
分析原因,我觉得问题可能处在极性变换采样时间上。
由于本模块的驱动时钟是16.32m,count为模8计数器,每产生一个输出的时间等于2.04m时钟的一个周期。
采样是在count=0时进行,即在2.04m时钟周期开始时刻进行采样,具体代码如下
case(count)
0: begin //2.04m时钟周期的开始进行数据采样和极性变换
out<=in?3'b111:3'b001; //将1变为111,将0变为001
count<=count+1;
end
由于2.04m时钟周期初始时刻数据并未完全稳定,可能会产生毛刺,所以我将采样时间改为2.04m时钟周期的中间进行:
case(count)
4: begin //2.04m时钟周期的中间时刻进行数据采样和极性变换
out<=in?3'b111:3'b001; //将1变为111,将0变为001
count<=count+1;
end
经过这样的处理之后进行波形仿真,可以看到,极性变换输出111前后的毛刺明显减小了许多,同时最终的输出结果的毛刺也减小了不少,如图4-4-3所示。
图4-4-1 采样时间为4.02m时钟周期初始时刻的仿真波形(总体图)
图4-4-2 采样时间为4.02m时钟周期初始时刻的仿真波形(负极性变换局部放大图)图4-4-3 采样时间为4.02m时钟周期中间时刻的仿真波形。