西南交通大学信息科学与技术学院通信工程专业工程实习报告——(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)begincount=1'b0;clk1=1'b0;endelseif(count63)begincount=count+1'b1;endelsebegincount=1'b0;clk1=~clk1;endendmoduleM序列产生模块modulePN_Seq(clk1,reset_n,dataoutm);inputclk1;inputreset_n;outputdataoutm;reg[7:1]c;always@(posedgeclk1ornegedgereset_n)beginif(!reset_n)c=7'b1000000;elsebeginc[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];endendassigndataoutm=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//endalways@(posedgeclkornegedgereset_n)beginif(!reset_n)//beginaddress_data1=7'b011_1111;//000_0000;//定义初值相位address_data2=7'b000_0000;//111_0011;//定义初值0endelse//beginaddress_data1=address_data1+7'b000_0001;//地址依次加一address_data2=address_data2+7'b000_0001;endendalways@(posedgeclkornegedgereset_n)beginif(!reset_n)address_data=7'b000_0000;//赋初值elseif(!dataoutm)address_data=address_data2;//如果m序列输出为0,则为address_data2值elseif(dataoutm)address_data=address_data1;else;endassignaddress=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)beginif(!reset_n)beginLUT[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[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;LUT[32]=127;LUT[33]=121;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[122]=248;LUT[123]=250;LUT[124]=251;LUT[125]=252;LUT[126]=253;LUT[127]=255;endendassigndataout=LUT[address];endmoduleLUT[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)beginif(!reset_n)begincounter_value[6:0]=7'b000_0000;//赋初值middata[7:0]=8'b00000000;//寄存器赋初值endelsebegincounter_value=counter_value+7'b000_0001;//时钟沿依次加一if(counter_value==7'b010_0000)beginmiddata[7:0]=data[7:0];//如果读到的值等于32,则取采样值endelsebeginmiddata[7:0]=middata[7:0];//如果没有读到32,则取0值endendendassigndataout[0]=~middata[7];//寄存器assigndataout[1]=~middata[7];assigndataout[2]=~middata[7];assigndataout[3]=~middata[7];assigndataou