基于FPGA的psk调制.docx
《基于FPGA的psk调制.docx》由会员分享,可在线阅读,更多相关《基于FPGA的psk调制.docx(17页珍藏版)》请在冰豆网上搜索。
基于FPGA的psk调制
西南交通大学
信息科学与技术学院
通信工程专业
工程实习报告
——(psk调制解调器的FPGA实现)课题设计报告
年级:
2010
学号:
20100147
姓名:
刘妍
专业:
通信工程
二零一三年七月
一、(psk调制解调器的FPGA实现)总体设计
基本原理
PSK调制原理
相移键控(PSK):
一种用载波相位表示输入信号信息的调制技术。
移相键控分为绝对移
相和相对移相两种。
以未调载波的相位作为基准的相位调制叫作绝对移相。
以二进制调相
为例,取码元为“1”时,调制后载波与未调载波同相;取码元为“0”时,调制后载波与未调载波反相;“1”和“0”时调制后载波相位差180度。
PSK调制原理图:
PSK解调原理
2PSK信号的解调只能用相干解调一种形式。
解调原理框图及波形如图所示:
二、详细设计
顶层模块
modulebpsk(
clk,
reset_n,
clk_DA,
blank_DA_n,
sync_DA_n,
dataout,
dm_out
);
inputclk;
inputreset_n;
outputclk_DA;
outputblank_DA_n;
outputsync_DA_n;
output[7:
0]dataout;
output[7:
0]dm_out;
wire[6:
0]address;
wiredataoutm;
wireclk1;
wire[7:
0]dataout;
counterCOUNTER(
.clk(clk),
.reset_n(reset_n),
.count(count),
.clk1(clk1)
);
PN_SeqPN_SEQ(
.clk1(clk1),
.reset_n(reset_n),
.dataoutm(dataoutm)
);
ControllerCONTROLLER(
.clk(clk),
.reset_n(reset_n),
.dataoutm(dataoutm),
.address(address),
.clk_DA(clk_DA),
.blank_DA_n(blank_DA_n),
.sync_DA_n(sync_DA_n)
);
LookUpTableLOOKUPTABLE(
.clk(clk),
.reset_n(reset_n),
.address(address),
.dataout(dataout)
);
depskdepsk(
.clk(clk),
.reset_n(reset_n),
.data(dataout),
.dataout(dm_out)
);
endmoduleendmodule
分频模块
modulecounter(clk,reset_n,count,clk1);
inputclk,reset_n;
outputclk1;
output[6:
0]count;
regclk1;
reg[6:
0]count;
parameterN=128;
always@(posedgeclkornegedgereset_n)
if(!
reset_n)
begin
count<=1'b0;
clk1<=1'b0;
end
elseif(count<63)
begin
count<=count+1'b1;
end
else
begin
count<=1'b0;
clk1<=~clk1;
end
endmodule
M序列产生模块
modulePN_Seq(clk1,reset_n,dataoutm);
inputclk1;
inputreset_n;
outputdataoutm;
reg[7:
1]c;
always@(posedgeclk1ornegedgereset_n)
begin
if(!
reset_n)
c<=7'b1000000;
else
begin
c[2]<=c[1];
c[3]<=c[2];
c[4]<=c[3];
c[5]<=c[4];
c[6]<=c[5];
c[7]<=c[6];
c[1]<=c[2]^c[3]^c[4]^c[7];
end
end
assigndataoutm=c[7];
endmodule
控制器模块
moduleController(
clk,
reset_n,
dataoutm,
address,
clk_DA,
blank_DA_n,
sync_DA_n
);
inputclk;
inputreset_n;
inputdataoutm;
output[6:
0]address;
outputclk_DA;
outputsync_DA_n;
outputblank_DA_n;
reg[6:
0]address_data1;
reg[6:
0]address_data2;
reg[6:
0]address_data;
//always@(dataoutm)
//begin
//case(dataoutm)
//1'b0:
begin
//address_data=address_data2;
//end
//1'b1:
begin
//address_data=address_data1;
//end
//default:
begin
//address_data=5'bzzzzz;
//end
//endcase
//end
always@(posedgeclkornegedgereset_n)
begin
if(!
reset_n)//
begin
address_data1<=7'b011_1111;//000_0000;//定义初值相位
address_data2<=7'b000_0000;//111_0011;//定义初值0
end
else//
begin
address_data1<=address_data1+7'b000_0001;//地址依次加一
address_data2<=address_data2+7'b000_0001;
end
end
always@(posedgeclkornegedgereset_n)
begin
if(!
reset_n)
address_data<=7'b000_0000;//赋初值
elseif(!
dataoutm)
address_data<=address_data2;//如果m序列输出为0,则为address_data2值
elseif(dataoutm)
address_data<=address_data1;
else
;
end
assignaddress=address_data;
assignclk_DA=clk;
assignblank_DA_n=1'b1;
assignsync_DA_n=1'b1;
endmodule
查找表模块
moduleLookUpTable(
clk,
reset_n,
address,
dataout,
);
inputclk;
inputreset_n;
input[6:
0]address;
output[7:
0]dataout;
reg[7:
0]LUT[0:
127];
always@(posedgeclkornegedgereset_n)
begin
LUT[34]<=115;
LUT[35]<=109;
LUT[36]<=103;
LUT[37]<=97;
LUT[38]<=91;
LUT[39]<=85;
LUT[40]<=79;
LUT[41]<=73;
LUT[42]<=68;
LUT[43]<=62;
LUT[44]<=57;
LUT[45]<=52;
LUT[46]<=47;
LUT[47]<=42;
LUT[48]<=38;
LUT[49]<=33;
LUT[50]<=29;
LUT[51]<=25;
LUT[52]<=22;
LUT[53]<=19;
LUT[54]<=15;
LUT[55]<=13;
LUT[56]<=10;
LUT[57]<=8;
LUT[58]<=6;
LUT[59]<=4;
LUT[60]<=3;
LUT[61]<=2;
LUT[62]<=1;
LUT[63]<=1;
LUT[64]<=0;
LUT[65]<=1;
LUT[66]<=1;
LUT[67]<=2;
LUT[68]<=3;
LUT[69]<=4;
LUT[70]<=6;
LUT[71]<=8;
if(!
reset_n)
begin
LUT[0]<=255;
LUT[1]<=254;
LUT[2]<=253;
LUT[3]<=252;
LUT[4]<=251;
LUT[5]<=250;
LUT[6]<=248;
LUT[7]<=246;
LUT[8]<=244;
LUT[9]<=241;
LUT[10]<=239;
LUT[11]<=235;
LUT[12]<=232;
LUT[13]<=229;
LUT[14]<=225;
LUT[15]<=221;
LUT[16]<=216;
LUT[17]<=212;
LUT[18]<=207;
LUT[19]<=202;
LUT[20]<=197;
LUT[21]<=192;
LUT[22]<=186;
LUT[23]<=181;
LUT[24]<=175;
LUT[25]<=169;
LUT[26]<=163;
LUT[27]<=157;
LUT[28]<=151;
LUT[29]<=145;
LUT[30]<=139;
LUT[31]<=133;
LUT[32]<=127;
LUT[33]<=121;
LUT[122]<=248;
LUT[123]<=250;
LUT[124]<=251;
LUT[125]<=252;
LUT[126]<=253;
LUT[127]<=255;
end
end
assigndataout=LUT[address];
endmodule
LUT[72]<=10;
LUT[73]<=13;
LUT[74]<=15;
LUT[75]<=19;
LUT[76]<=22;
LUT[77]<=25;
LUT[78]<=29;
LUT[79]<=33;
LUT[84]<=57;
LUT[85]<=62;
LUT[86]<=68;
LUT[87]<=73;
LUT[88]<=79;
LUT[89]<=85;
LUT[90]<=91;
LUT[91]<=97;
LUT[92]<=103;
LUT[93]<=109;
LUT[94]<=115;
LUT[95]<=121;
LUT[96]<=127;
LUT[97]<=133;
LUT[98]<=139;
LUT[99]<=145;
LUT[100]<=151;
LUT[101]<=157;
LUT[102]<=163;
LUT[103]<=169;
LUT[104]<=175;
LUT[105]<=181;
LUT[106]<=186;
LUT[107]<=192;
LUT[108]<=197;
LUT[109]<=202;
LUT[110]<=207;
LUT[111]<=212;
LUT[112]<=216;
LUT[113]<=221;
LUT[114]<=225;
LUT[115]<=229;
LUT[116]<=232;
LUT[117]<=235;
LUT[118]<=239;
LUT[119]<=241;
LUT[120]<=244;
LUT[121]<=246;
解调模块
moduledepsk(
clk,
reset_n,
data,
dataout,
);
inputclk;
inputreset_n;
input[7:
0]data;
output[7:
0]dataout;
reg[6:
0]counter_value;
reg[7:
0]middata;
always@(posedgeclkornegedgereset_n)
begin
if(!
reset_n)
begin
counter_value[6:
0]<=7'b000_0000;//赋初值
middata[7:
0]<=8'b00000000;//寄存器赋初值
end
else
begin
counter_value<=counter_value+7'b000_0001;//时钟沿依次加一
if(counter_value==7'b010_0000)
begin
middata[7:
0]<=data[7:
0];//如果读到的值等于32,则取采样值
end
else
begin
middata[7:
0]<=middata[7:
0];//如果没有读到32,则取0值
end
end
end
assigndataout[0]=~middata[7];//寄存器
assigndataout[1]=~middata[7];
assigndataout[2]=~middata[7];
assigndataout[3]=~middata[7];
assigndataout[4]=~middata[7];
assigndataout[5]=~middata[7];
assigndataout[6]=~middata[7];
assigndataout[7]=~middata[7];
endmodule
三、结果测试
Psk调制部分功能仿真
Psk调制部分时序仿真
PSK调制解调功能仿真
PSK调制解调时序仿真
PSK调制解调FPGA实现开发板验证