西南交通大学信息科学与技术学院通信工程专业通信工程实验报告年级:通信3班学号:20112330姓名:韩乃明专业:通信工程二零一五年一月实验一BDPSK调制解调器设计一、实验目的⒈学习BDPSK原理的硬件实现方法。⒉学习用VerilogHDL硬件描述语言建模时序逻辑电路的能力。二、实验内容⒈设计BDPSK调制器和解调器根据BDPSK调制解调原理,设计其调制解调器的外引脚和内部结构。用MicorsoftVisio软件分别画出调制器和解调器的外引脚图和内部结构图。必须采用模块化设计方法。⒉用VerilogHDL建模根据你设计的调制器和解调器的引脚和结构,用VerilogHDL进行建模。能够根据连续输入的二进制数据,正确实现BDPSK调制和解调。⒊仿真用ModelSim软件仿真你的设计,得到波形并分析结果。能够正确实现BDPSK调制和解调。⒋开发板验证在开发板上进行设计验证,用示波器观测实验结果。三、实验结果⒈BDPSK调制器和解调器的外引脚图和内部结构图。(MicrosoftVisio中截图)调制器外引脚图:调制器内结构图:解调器外引脚图:2.功能仿真和时序仿真结果的波形。(ModelSim中截图)4.BDPSK调制器模块和解调器模块的VerilogHDL代码及注释。(手写)2.1分频模块:moduleDIV_50M_HZ(clk,reset_n,clk_odd);inputclk,reset_n;outputclk_odd;regclk_odd;reg[7:0]count;parameterN=63;//通过修改N的数值,实现对输入时钟的任意分频always@(posedgeclk)//本次为64分频if(!reset_n)begincount=1'b0;clk_odd=1'b0;endelseif(countN/2-1)begincount=count+1'b1;endelsebegincount=1'b0;clk_odd=~clk_odd;endendmodule2.2伪随机序列发生模块:modulePN_Seq(clk,reset_n,dataout);inputclk;inputreset_n;outputdataout;reg[7:1]c;always@(posedgeclkornegedgereset_n)beginif(!reset_n)beginc[7]=2'b01;//复位过程中,对移位寄存器的各位置初值。c[6]=2'b00;c[5]=2'b00;c[4]=2'b00;c[3]=2'b00;c[2]=2'b00;c[1]=2'b00;endelse//复位完成,移位寄存器开始工作。beginc[7]=c[6];//在时钟触发下,数据依次移位。c[6]=c[5];c[5]=c[4];c[4]=c[3];c[3]=c[2];c[2]=c[1];c[1]=(c[2]^c[3]^c[4]^c[7]);endendassigndataout=c[7];endmodule2.3差分编码模块:modulediff_code(clk,a,reset_n,b);inputclk;inputa;inputreset_n;outputb;regb;regpre_code;always@(posedgeclkornegedgereset_n)beginif(!reset_n)beginpre_code=0;b=0;endelsebeginb=(a==0)?pre_code:~pre_code;pre_code=b;endendendmodule2.4载波控制模块:moduleController(clk,reset_n,data_in,address,clk_DA,blank_DA_n,sync_DA_n);inputclk;inputreset_n;inputdata_in;outputreg[4:0]address;outputclk_DA;//数模转换器控制信号outputblank_DA_n;//数模转换器控制信号outputsync_DA_n;//数模转换器控制信号reg[4:0]address_data;reg[4:0]address_data_reg;always@(posedgeclkornegedgereset_n)beginif(!reset_n)beginaddress_data=5'b00000;address_data_reg=5'b10000;endelsebegincase(data_in)1'b0:beginaddress_data=address_data+1;end1'b1:beginaddress_data_reg=address_data_reg+1;endendcaseaddress=(data_in==0)?~address_data:address_data_reg;endendassignclk_DA=clk;assignblank_DA_n=1'b1;assignsync_DA_n=1'b1;endmodule2.5查找表模块:moduleLookUpTable(clk,reset_n,address,dataout,);inputclk;inputreset_n;input[4:0]address;output[7:0]dataout;reg[7:0]LUT[0:31];reg[7:0]dataout;always@(posedgeclkornegedgereset_n)beginif(!reset_n)beginLUT[0]=76;//用C编程计算出的查找表采样值填在这里LUT[1]=88;LUT[2]=99;LUT[3]=109;LUT[4]=117;LUT[5]=123;LUT[6]=126;LUT[7]=127;LUT[8]=126;LUT[9]=123;LUT[10]=117;LUT[11]=109;LUT[12]=99;LUT[13]=88;LUT[14]=76;LUT[15]=64;LUT[16]=52;LUT[17]=40;LUT[18]=29;LUT[19]=19;LUT[20]=11;LUT[21]=5;LUT[22]=2;LUT[23]=1;LUT[24]=2;LUT[25]=5;LUT[26]=11;LUT[27]=19;LUT[28]=29;LUT[29]=40;LUT[30]=52;LUT[31]=64;endelsebegindataout=LUT[address];endendendmodule实验二HDB3编码器设计一、实验目的⒈学习HDB3编码原理的硬件设计方法。⒉学习用VerilogHDL硬件描述语言建模较复杂时序逻辑电路的能力。⒊学习FPGA设计中的Testbench(测试平台)方法。二、实验内容⒈设计编码器用VerilogHDL建模HDB3编码模块,按照实验说明中的顺序依次实现“加V”、“补B”和“单双极性变换”步骤,使编码器能正确、稳定地工作。⒉编写测试平台用VerilogHDL编写编码器的Testbench文件,指定编码器的输入为表1中的数据。⒊仿真用ModelSim软件仿真你的设计,得到波形并分析结果。能够正确实现HDB3编码。⒋开发板验证利用教师提供的嵌入式逻辑分析仪文件,在开发板上进行设计验证,用SignalTapⅡ观测实验结果。三、实验结果1.功能仿真和时序仿真结果的波形。(ModelSim中截图)功能仿真时序仿真2.开发板验证后的波形。(SignalTapⅡ中截图)3.HDB3编码器的VerilogHDL代码及注释。(手写)1.1加V模块:modulehdb3_plug_v(inputi_rst_n,//异位复位信号,低电平有效inputi_clk,//时钟信号inputi_data,//基带数据输入output[1:0]o_plug_v_code//插V之后的编码输出);//定义输出信号o_data的缓存reg[1:0]r_plug_v_code;reg[3:0]r_plug_v_code_h;reg[4:0]r_plug_v_code_l;reg[2:0]r_data_shift;assigno_plug_v_code={r_plug_v_code_h[3],r_plug_v_code_l[3]};//always进程,对输入的基带数据进行移位寄存always@(posedgei_clk,negedgei_rst_n)beginif(!i_rst_n)beginr_data_shift=3'b111;endelsebeginr_data_shift={r_data_shift[1:0],i_data};endend//always进程,判断输入的基带数据是否有4个连续的0,如果有则执行插入V操作always@(posedgei_clk,negedgei_rst_n)beginif(!i_rst_n)beginr_plug_v_code_h=4'b0000;r_plug_v_code_l=4'b0000;endelsebeginif(1'b0==i_data&&r_data_shift==3'b000&&3'b000==r_plug_v_code_h[2:0])begin//检测到4个连续的0,则插入Vr_plug_v_code_h={r_plug_v_code_h[2:0],1'b1};r_plug_v_code_l={r_plug_v_code_l[2:0],1'b0};endelseif(1'b1==i_data)beginr_plug_v_code_h={r_plug_v_code_h[2:0],1'b0};r_plug_v_code_l={r_plug_v_code_l[2:0],1'b1};endelsebeginr_plug_v_code_h={r_plug_v_code_h[2:0],1'b0};r_plug_v_code_l={r_plug_v_code_l[2:0],1'b0};endendendendmodule1.2加B模块:modulehdb3_plug_b(inputi_rst_n,inputi_clk,input[1:0]i_plug_v_code,//插入V之后的编码输入output[2:0]o_plug_b_code//插入B之后的编码输出);//定义输出信号o_data的缓存reg[1:0]r_plug_b_code;reg[4:0]r_plug_b_code_h;reg[4:0]r_plug_b_code_l;reg[2:0]r_data_shift;regr_not_0_parity;assigno_plug_b_code={r_plug_b_code_h[4],r_plug_b_code_l[4]};//always进程判断连续两个V之间的非0符号的奇偶性always@(posedgei_clk,negedgei_rst_n)beginif(!i_rst_n)beginr_not_0_parity=1'b0;endelsebeginif(2'b10==i_plug_v_code)r_not_0_parity=1'b0;elseif(2'b01==i_plug_v_code)r_not_0_parity=~r_not_0_parity;endend//always进程根据连续两个V之间非0符号的奇偶性,如果为偶数,则进行插入B操作always@(posedgei_clk,negedgei_rst_n)beginif(!i_rst_n)beginr_plug_b_code_h=5'b00000;r_plug_b_code_l=5'b00000;endelsebeginif(2'b10==i_plug_v_code&&1'b0