资源描述
通信系统中串行数据交织器的设计
一、 设计原理
1、交织器原理
交织器是通信编码中抗突发干扰的一种重要手段,将突发干扰产生的分布集中的误码分散到信息数据中,以便采用纠错编码的方法进行纠错。本项目设计一个行列交织器,其框架图图如图1所示,PN码发生器模拟数据源产生串行数据,按行写入一m行n列的RAM中,写满后按列读出。为避免数据丢失,需使用两个这样的RAM交替读写。这里统一m和n都选4,即两个4╳4 RAM。
图1 串行数据交织器整体框架图
2、 程序设计原理
本实验制作一个通信系统中的串行数据交织器,其设计原理图如图1所示。程序整体由三个子模块构成:100KHz分频模块,利用FPGA上50MHz的晶振分频得到,作为产生伪随机码和读写RAM的时钟;伪随机码发生器模块,以16个数为一周期,模拟数据源产生串行数据;读写RAM模块,按行写入一4行4列的RAM中,写满后按列读出。为避免数据丢失,需使用两个这样的RAM交替读写,从而实现交织。电路图如图2所示:
图2 电路原理图
二、源程序代码
//顶层模块
module interleaver(endout,out,clk_50M);
input clk_50M;
output[0:0] endout,out;
wire clk;
wire[3:0] k;
wire[0:0] pn16;
divider U1(clk,clk_50M);
pn U2(clk,pn16);
array U3(endout,out,clk,pn16,k);
endmodule
//分频器 (50MHz--100KHz)
module divider(clk,clk_50M);
output clk;
input clk_50M;
reg clk;
reg[23:0] cnt;
always @(posedge clk_50M)
begin
if(cnt==249)
begin
cnt<=0;
clk<=~clk;
end
else
cnt<=cnt+1; //计数
end
endmodule
//pn16(伪随机码发生器,以16个数为一周期)
module pn(clk,pn16);
input clk;
output[0:0] pn16;
reg q0;
reg q1;
reg q2;
reg q3;
wire set1;
wire SYNTHESIZED_WIRE_0;
wire SYNTHESIZED_WIRE_1;
assign SYNTHESIZED_WIRE_1 = 0;
always@(posedge clk )
begin
if (!set1)
begin
q0 = 1;
end
else
begin
q0 = SYNTHESIZED_WIRE_0;
end
end
always@(posedge clk)
begin
begin
q1 = q0;
end
end
always@(posedge clk)
begin
begin
q2 = q1;
end
end
always@(posedge clk)
begin
begin
q3 = q2;
end
end
assign SYNTHESIZED_WIRE_0 = q3 ^ q2;
assign set1 = q0 | q2 | q1 | q3 | SYNTHESIZED_WIRE_1;
assign pn16 = q3;
endmodule
//array(使用两个数组,作为两个4╳4RAM)
module array(endout,out,clk,pn16,k);
input clk;
input[0:0] pn16;
output[0:0] out,endout;
output[3:0] k;
reg[3:0] k,i;
reg[0:0] out,endout;
reg array1[15:0];
reg array2[15:0];
reg[1:0] j,flag;
initial
begin
i<=0;
j<=0;
k<=-1;
flag<=0;
end
always@(posedge clk)
begin
if(k==15)
begin
k<=0;
end
else
k<=k+1;
if(i==15) //用循环产生4╳4数组,即4╳4 RAM
begin
i<=0;
flag=~flag;
end
else
i<=i+1;
if(j==3)
j<=0;
else
j<=j+1;
if(!flag)
begin
array1[i]<=pn16; //伪随机码写入array1
out<=array2[i]; //按行读出array2中的数据给out(未交织)
if(i<4) //按列读出array2中的数据给endout(交织后的)
endout<=array2[0+4*j];
else if(i<8)
endout<=array2[1+4*j];
else if(i<12)
endout<=array2[2+4*j];
else
endout<=array2[3+4*j];
end
else
begin
array2[i]<=pn16; //伪随机码写入array2
out<=array1[i]; //按行读出array1中的数据给out(未交织)
if(i<4) //按列读出array1中的数据给endout(交织后的)
endout<=array1[0+4*j];
else if(i<8)
endout<=array1[1+4*j];
else if(i<12)
endout<=array1[2+4*j];
else
endout<=array1[3+4*j];
end
end
endmodule
三、仿真结果
1、分屏器模块仿真结果如图3所示:
图3 分屏器模块仿真结果
2、伪随机码发生器模块仿真结果如图4所示:
图4 伪随机码发生器模块仿真结果
3、 最终仿真输出结果如图5、图6所示:
图5 第一个周期
图6 最终输出结果
仿真结果分析:
1、 如图5所示,在第一个循环周期,伪随机码写入array1,同时按行读出array2到out,按列读出array2到endout,但由于此时array2里面的单元都为0,所以在第一个周期里,输出out(未交织)和endout(交织后)都为0。
2、 如图6所示,结果为实现了交织功能。
未交织的out输出为:
0001 0011 0101 1110 0010 0110 1011 1100,即
0 0 0 1 0 0 1 0
0 0 1 1 0 1 1 0
0 1 0 1 1 0 1 1
1 1 1 0 1 1 0 0
交织后的endout输出为:
01 0011 0101 1110 0011 0101 1110 0010 ,即
0 0 0 1 0 0 1 1
0 0 1 1 0 1 0 1
0 1 0 1 1 1 1 0
1 1 1 0 0 0 1 0
如此可见,endout实现了按列读出,即设计实现了交织功能。
四、实验结果
利用示波器观察交织前后的波形,如图7所示:
图7 实验结果
五、实验总结
本实验内容为制作一个通信系统中串行数据交织器。由于对Verilog和Quartus II 软件、ModuleSim仿真软件的使用较熟悉,对用Verilog HDL语言来编写程序较熟练,因此在明白实验原理后,设计的实现就感觉较上一个实验简单。
但是,此次实验也并不是如鱼得水的。实验过程中也遇到了一些小问题。起初,对此次交织器的原理不是很清楚,对其程序实现方案也不清晰。后来认真听了老师的解说,自己课后也在图书馆查阅了相关资料。经过自己的思考,最终明白了整个电路的原理。第二,刚开始搭建好电路进行观察时,示波器没有输出正确的波形。后面把DE2板和示波器表笔换了,波形就出来了,并且同时输出了交织前和交织后的波形,说明本次设计取得了成功。
通过自己课下的努力和钻研,最终较快较好地成功完成了实验,这给了我极大的兴趣和信心。从对交织器毫无预先知识的状态,到一步一步查找资料并尝试连接,确实在课下花了很多时间和心思。但看着自己制作的成果,深感一切都值得。本次实验让我深深体会到,单纯学习理论知识是不行的,只有勤于动手,将所学的知识运用到实际当中,才能真正理解和掌握知识。在接下去的学习中,我将不断完善知识面,设计更为复杂的电路。
14 / 14
展开阅读全文