⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wddc_module.v

📁 数字下变频的Verilog程序
💻 V
字号:
`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// Company: // Engineer://// Create Date:    16:55:39 04/23/07// Design Name:     // Module Name:    WDDC// Project Name:   // Target Device:  // Tool versions:  // Description:// To make full use of fc=fs/4 & HB filter ,here we do the polyphase decimator filter without IP core .// we use only one HB filter to implement the IQ filter output and simplify the NCO and mixer of frequency.//  --->     -->I---->>//           -->Q---->>	the figure means the two branch of polyphase decimation filter do not add together but just //                      output their data seperately as output of the I way filtered data and Q way filtered data .//                      By this idea, we carry out the IQ filter output just with one HB filter.// Dependencies:// // Revision:// Revision 0.01 - File Created// Additional Comments: // ////////////////////////////////////////////////////////////////////////////////module wddc_module(CLK, CE, AD_DIN, IQ_DOUT, DV );//------------------Ports Declaration-------------------------------------------	input 		    CLK;	input 		    CE;	input	  [13:0] AD_DIN;	output  [31:0] IQ_DOUT;   reg     [31:0] IQ_DOUT = 32'b0;		output          DV;	//	input           BF_CLK;//	input  [12:2]   BF_ADDR;//	input  [3:0]    WIQ_REN;// output [15:0]   IQDtoPCI;//IQ data to PCI    //	output          WIQ_INT;//Interrupt source register for WIQ.//	output          WIQ_INTHF;//Interrupt source status register for WIQ   //-----------------Inner Signals Declaration -----------------------------------	reg				[1:0]  stateflag = 2'b0;	reg				[13:0] XIN = 0; 		reg 	signed  	[13:0] DX00 = 0;	//x(0)	reg 	signed 	[13:0] DX02 = 0;	reg 	signed  	[13:0] DX04 = 0;	reg	signed	[13:0] DX06 = 0;	reg	signed 	[13:0] DX08 = 0;	reg 	signed	[13:0] DX10 = 0;	reg	signed	[13:0] DX12 = 0;	reg	signed	[13:0] DX14 = 0;	reg	signed	[13:0] DX16 = 0;	reg	signed	[13:0] DX18 = 0;	reg	signed	[13:0] DX20 = 0;	reg	signed	[13:0] DX22 = 0;	reg	signed	[13:0] DX24 = 0;	reg	signed	[13:0] DX26 = 0;	reg	signed	[13:0] DX28 = 0;	reg	signed	[13:0] DX30 = 0;	reg	signed	[13:0] DX32 = 0;	reg	signed	[13:0] DX34 = 0;	reg	signed	[13:0] DX36 = 0;	reg	signed	[13:0] DX38 = 0;	reg	signed	[13:0] DX40 = 0;	reg	signed	[13:0] DX42 = 0;	reg	signed	[13:0] DX44 = 0;	reg	signed	[13:0] DX46 = 0;	reg	signed	[13:0] DX48 = 0;	reg	signed	[13:0] DX50 = 0;	//x(50)	reg     			[13:0] DX01 = 0;	//x(1)	reg     			[13:0] DX03 = 0;	reg     			[13:0] DX05 = 0;	reg    			[13:0] DX07 = 0;	reg    			[13:0] DX09 = 0;	reg     			[13:0] DX11 = 0;	reg     			[13:0] DX13 = 0;	reg     			[13:0] DX15 = 0;	reg     			[13:0] DX17 = 0;	reg     			[13:0] DX19 = 0;	reg     			[13:0] DX21 = 0;	reg     			[13:0] DX23 = 0;	reg     			[13:0] DX25 = 0;	//x(25)	wire    			[15:0] A00;		//a(0) == a(50)	wire    			[15:0] A02;		//a(2) == a(48)	wire    			[15:0] A04;	wire				[15:0] A06;	wire				[15:0] A08;	wire				[15:0] A10;	wire				[15:0] A12;	wire				[15:0] A14;	wire				[15:0] A16;	wire				[15:0] A18;	wire				[15:0] A20;	wire				[15:0] A22;	wire				[15:0] A24;	reg             State = 1'b0;	reg	  [14:0] SUMA00,SUMA02,SUMA04,SUMA06,SUMA08,SUMA10,SUMA12,SUMA14,SUMA16,SUMA18,SUMA20,SUMA22,SUMA24;	wire    [30:0] MULT00,MULT02,MULT04,MULT06,MULT08,MULT10,MULT12,MULT14,MULT16,MULT18,MULT20,MULT22,MULT24;	reg	  [30:0] SUM_MULT_0,SUM_MULT_1,SUM_MULT_2,SUM_MULT_3,SUM_MULT_4,SUM_MULT_5;	reg	  [30:0] SUM_MULT_A,SUM_MULT_B,SUM_MULT_C,SUM_MULT_X,SUM_MULT_Y;	reg	  [30:0] MULT24_D1,MULT24_D2; 	reg     [30:0] SUM = 0; //I way summary.		reg     [2:0]  flag = 3'b0;	reg     [30:0] I_DOUT=0;	reg     [15:0] Q_DOUT=0;	//=========================================================================	always @(posedge CLK)	  //fnco/fs = 1/4		begin			if(CE)				begin					if(stateflag == 2'b00)						begin							XIN  <= AD_DIN;							stateflag <= 2'b01;						end					else if(stateflag == 2'b01)						begin							XIN  <= ~AD_DIN + 1'b1;							stateflag <= 2'b10;						end					else if(stateflag == 2'b10)						begin			    							XIN  <= ~AD_DIN + 1'b1;							stateflag <= 2'b11;						end					else						begin							XIN  <= AD_DIN;							stateflag <= 2'b00;						end				end		end//-------------------- polyphase decimator filter ----------------------------	//Delay part	always @(posedge CLK)	   if(CE)	      begin		     if(State == 1'b0)			    begin					DX01   <= XIN;	//Delay Line					DX03   <= DX01;				   DX05   <= DX03;					DX07   <= DX05; 					DX09   <= DX07;					DX11   <= DX09;					DX13   <= DX11;						DX15   <= DX13;					DX17   <= DX15;						DX19   <= DX17;						DX21   <= DX19;					DX23   <= DX21;					DX25   <= DX23;					        					State <= 1'b1;				end			 else			    begin					DX00   <= XIN;					DX02   <= DX00;					DX04   <= DX02; 										DX06   <= DX04;					DX08   <= DX06;					DX10   <= DX08;					DX12   <= DX10;					DX14   <= DX12;					DX16   <= DX14;					DX18   <= DX16;					DX20   <= DX18;					DX22   <= DX20;					DX24   <= DX22;					DX26   <= DX24;					DX28   <= DX26;										DX30   <= DX28;					DX32   <= DX30;					DX34   <= DX32;					DX36   <= DX34;					DX38   <= DX36;					DX40   <= DX38;					DX42   <= DX40;					DX44   <= DX42;					DX46   <= DX44;					DX48   <= DX46;					DX50   <= DX48;					State <= 1'b0;						if(flag != 3'b110)					   flag <= flag + 1'b1;				end		    		  end	    else		  begin		     State <= 1'b0;			  flag  <= 3'b0;		  end//----------------I way data output part ( NO.1 branch of polyphase decimation filter)--------------	always @(posedge CLK)		begin			SUMA00 <= DX00 + DX50;	//DX00、DX02、……、DX50 need to be Set "reg signed [13:0]". 			SUMA02 <= DX02 + DX48;			SUMA04 <= DX04 + DX46;			SUMA06 <= DX06 + DX44;			SUMA08 <= DX08 + DX42;			SUMA10 <= DX10 + DX40;			SUMA12 <= DX12 + DX38;			SUMA14 <= DX14 + DX36;			SUMA16 <= DX16 + DX34;			SUMA18 <= DX18 + DX32;			SUMA20 <= DX20 + DX30;			SUMA22 <= DX22 + DX28;	 			SUMA24 <= DX24 + DX26;	//			end		assign  A00 = 16'h0002;	assign  A02 = 16'hfff8;	assign  A04 = 16'h0014;	assign  A06 = 16'hffd3;	assign  A08 = 16'h0059;	assign  A10 = 16'hff5f;	assign  A12 = 16'h0112;	assign  A14 = 16'hfe42;	assign  A16 = 16'h02c0;	assign  A18 = 16'hfbae;	assign  A20 = 16'h0702;	assign  A22 = 16'hf322;	assign  A24 = 16'h2880;		firmultiply modFIRMultiply0( 			.CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA00),          .B_IN(A00),			.P_OUT(MULT00) 			); 	firmultiply modFIRMultiply2( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA02),          .B_IN(A02),			.P_OUT(MULT02) 			); 	firmultiply modFIRMultiply4( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA04),          .B_IN(A04),			.P_OUT(MULT04) 			); 		firmultiply modFIRMultiply6( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA06),          .B_IN(A06),			.P_OUT(MULT06) 			);		firmultiply modFIRMultiply8( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA08),          .B_IN(A08),			.P_OUT(MULT08) 			);	firmultiply modFIRMultiply10( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA10),          .B_IN(A10),			.P_OUT(MULT10) 			);	firmultiply modFIRMultiply12( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA12),          .B_IN(A12),			.P_OUT(MULT12) );	firmultiply modFIRMultiply14( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA14),          .B_IN(A14),			.P_OUT(MULT14) 			);		firmultiply modFIRMultiply16( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA16),          .B_IN(A16),			.P_OUT(MULT16) 			);		firmultiply modFIRMultiply18( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA18),          .B_IN(A18),			.P_OUT(MULT18) 			);	firmultiply modFIRMultiply20( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA20),          .B_IN(A20),			.P_OUT(MULT20) );	firmultiply modFIRMultiply22( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA22),          .B_IN(A22),			.P_OUT(MULT22) );	firmultiply modFIRMultiply24( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN(SUMA24),          .B_IN(A24),			.P_OUT(MULT24) 			);		always @(posedge CLK)						//加法树		begin			SUM_MULT_0 <= MULT00 + MULT02;			SUM_MULT_1 <= MULT04 + MULT06;			SUM_MULT_2 <= MULT08 + MULT10;			SUM_MULT_3 <= MULT12 + MULT14;			SUM_MULT_4 <= MULT16 + MULT18;			SUM_MULT_5 <= MULT20 + MULT22;			MULT24_D1  <= MULT24;			SUM_MULT_A <= SUM_MULT_0 + SUM_MULT_1;			SUM_MULT_B <= SUM_MULT_2 + SUM_MULT_3;			SUM_MULT_C <= SUM_MULT_4 + SUM_MULT_5;			MULT24_D2  <= MULT24_D1;			SUM_MULT_X <= SUM_MULT_A + SUM_MULT_B;			SUM_MULT_Y <= SUM_MULT_C + MULT24_D2;			SUM		  <= SUM_MULT_X + SUM_MULT_Y;		end//-----------Q way data output part ( NO.2 branch of polyphase decimation filter) --------------------------------	 //use shift operation instead of this multiplier  below/*		assign  A25 = 16'h4000; 	firmultiply modFIRMultiply4( 	      .CLK_IN(CLK),			.CE_IN(CE),			.A_IN({{2{DX5[13]}},DX5[12:0]}), //symbol extend         .B_IN(A25),			.P_OUT(MULT5)); 	 always @(posedge CLK)		 if(CE)			begin			   MULT4D  <= MULT4;	  //need to be delayed 1 clock period			   MULT5D1 <= MULT5;	  //need to be delayed 4 clock period			   MULT5D2 <= MULT5D1;			   MULT5D3 <= MULT5D2;			   MULT5D  <= MULT5D3; 			end*/	 //{{use shift operation  to get Q_DOUT from DX5 instead of	multiplier: modFIRMultiply4	 reg    [30:0]  DX5E,DX5ES,Q_DX5ES1;	 reg    [15:0]  Q_DX5ES,Q_DX5ES2,Q_DX5ES3,Q_DX5ES4,Q_DX5ES5,Q_DX5ES6;	 	 always@(posedge CLK)	 	begin			//symbol extend to 32 bit to ensure the balance of Magnitude of I and Q way. 			DX5E     <= {{18{DX25[13]}},DX25[12:0]};			DX5ES    <= DX5E << 14;   //because A5 = 16'h4000			Q_DX5ES1 <= DX5ES+{16'b0,~DX5ES[30],{13{DX5ES[30]}}};			Q_DX5ES2 <= Q_DX5ES1[30:15];			Q_DX5ES3 <= Q_DX5ES2;			Q_DX5ES4 <= Q_DX5ES3;				Q_DX5ES5 <= Q_DX5ES4;			Q_DX5ES6 <= Q_DX5ES5; 			Q_DX5ES  <= Q_DX5ES6;	 		end	 //}}//----------------------------- IQ filtered data output ---------------------------------------------	 always @(posedge CLK) 	 	begin	 		I_DOUT <= SUM+{16'b0,~SUM[30],{13{SUM[30]}}}; 	 		Q_DOUT <= Q_DX5ES;		end	 always @(posedge CLK) 	 	begin	  	   IQ_DOUT <= {Q_DOUT,I_DOUT[30:15]};	 		end
      
			 assign DV = ((flag == 3'b110) ? ~State : 1'b0);  // data valid signal//------------------- IQ Data Buffer --------------------------------------------------   //	//generate write address of DPRAM //	reg  [11:0] lADDRA_WDDC = 12'b0;//	wire         lenal,lenah;//	reg          lenal_d=0;//	reg          lenah_d=0;//	reg          lwiq_intl=0;//	reg          lwiq_inth=0;//	wire [15:0] lwi_lb,lwq_lb,lwi_hb,lwq_hb,lwiq_lb,lwiq_hb;//	always @(posedge CLK)//	   begin		  //	      if(DV)//		        lADDRA_WDDC <= lADDRA_WDDC + 1'b1;		  		  //	   end//   assign lenal = ~lADDRA_WDDC[11];//	assign lenah =  lADDRA_WDDC[11];//	//buffer IQ data to BF537,Low Block//	dpram2k_ip modWI_LB (//		.clka(CLK),//		.addra(lADDRA_WDDC[10:0]),//		.ena(lenal),				  	//		.wea(DV),//		.dina(IQ_DOUT[15:0]),//		//		.clkb(BF_CLK),//		.addrb(BF_ADDR),	//		.enb(WIQ_REN[0]),//		.doutb(lwi_lb) //	 	);//		//   dpram2k_ip modWQ_LB (//		.clka(CLK),//		.addra(lADDRA_WDDC[10:0]),//		.ena(lenal),				  	//		.wea(DV),//		.dina(IQ_DOUT[31:16]),//		//		.clkb(BF_CLK),//		.addrb(BF_ADDR),	b//		.enb(WIQ_REN[1]),//		.doutb(lwq_lb) //	 	);//		//	//buffer IQ data to BF537,High Block//	dpram2k_ip modWI_HB (//		.clka(CLK),//		.addra(lADDRA_WDDC[10:0]),//		.ena(lenah),				  	//		.wea(DV),//		.dina(IQ_DOUT[15:0]),//		//		.clkb(BF_CLK),//		.addrb(BF_ADDR),	//		.enb(WIQ_REN[2]),//		.doutb(lwi_hb) //	 	);//		//   dpram2k_ip modWQ_HB (//		.clka(CLK),//		.addra(lADDRA_WDDC[10:0]),//		.ena(lenah),				  	//		.wea(DV),//		.dina(IQ_DOUT[31:16]),//		//		.clkb(BF_CLK),//		.addrb(BF_ADDR),	//		.enb(WIQ_REN[3]),//		.doutb(lwq_hb) //	 	);//   //	always @(posedge CLK)//	   begin//		   lenal_d <= lenal;//			lenah_d <= lenah;//			lwiq_intl <= (lenal_d & lenah);//			lwiq_inth <= (lenah_d & lenal);//		end//	//	assign lwiq_lb = WIQ_REN[1] ? lwq_lb : lwi_lb;//	assign lwiq_hb = WIQ_REN[3] ? lwq_hb : lwi_hb;//	assign IQDtoPCI = (WIQ_REN[1]|WIQ_REN[0]) ? lwiq_lb : lwiq_hb;//	//	assign WIQ_INT = lwiq_intl|lwiq_inth;//	assign WIQ_INTHF = lenal;//0-low block ready,1-high block ready. endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -