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

📄 transmit_mcu.v

📁 基于Xilinx+FPGA的OFDM通信系统基带设计-程序
💻 V
字号:
module TX_MCU(PHY_TXSTART,TXSTART_REQ,DATA_CONF,DATA_IN,MAC_CLK,SYS_CLK,                 MCU_RST,GLB_RST,PHY_RST,LENGTH,RATE,TXPWR,SHORT_ACK,LONG_ACK,                 SIG_ACK,DATA_REQ,DATA_START,DATA_OUT,DATA_DV,FFT_SET,FFT_EN_Q,			        RATE_CON,SCRAM_SEED);    input PHY_TXSTART;    input TXSTART_REQ;    input DATA_CONF;    input [7:0] DATA_IN;    input MAC_CLK;    input SYS_CLK;    input MCU_RST;    input GLB_RST;    output PHY_RST;    output [11:0] LENGTH;    output [5:0] RATE;    output [2:0] TXPWR;    output SHORT_ACK;    output LONG_ACK;    output SIG_ACK;    output DATA_REQ;    output DATA_START;    output [7:0] DATA_OUT;    output DATA_DV;    output FFT_SET;    output FFT_EN_Q;    output [3:0] RATE_CON;    output [6:0] SCRAM_SEED;    wire [4:0] TXPAR_BUFADDR;          //transmit parameters buffer address signal    wire THRESH1;                      //transmit parameters buffer over signal    wire [8:0] MCOUNTER;               //U_MAIN_COUNTER outputs    wire [6:0] COUNT80;                //U_COUNT80 outputs    wire FFT_EN;                       //signal for FFT transform starting    wire [4:0] COUNT_DATA;             //U_COUNT_DATA outputs    wire DATA_TXSTART;			    //the signal for starting the DATA field transmission    wire [4:0] COUNT30;                //U_COUNT30 outputs    wire REQ;			              //the signal asking for the Data Octs from MAC    wire GLB_RST_H;                    //Reset signal for IP core U_TXPAR_BUFADDR     wire RST;                          //Reset signal for IP cores except U_TXPAR_BUFADDR    reg [20:0] TXPAR_BUF;              //transmit parameters buffer    reg PHY_RST;                       //transmit initialize signal    reg [11:0] LENGTH;			    //transmit parameters: data length    reg [5:0] RATE;				    //transmit parameters: data rate    reg [2:0] TXPWR;			    //transmit parameters: transmit power    reg MCOUNTER_CE;                   //U_MAIN_COUNTER enable signal    reg BUF_OVER;				    //The register for the transmit parameters buffer over signal    reg SHORT_ACK;				    //short sequences transmission start signal    reg LONG_ACK;				    //Long sequences transmission enable signal    reg SIG_ACK; 				    //Signal field process start signal    reg FFT_SET;                       //FFTPro module initialize signal    reg COUNT80_CE;                    //U_COUNT80 enable signal    reg FFT_EN_Q;                      //register of signal FFT_EN    reg [13:0] N_SYM_FFT;	         //Counter for the number of symbols to help generate FFT_EN signal, add one bit as the sign bit    reg COUNT_DATA_CE;                 //U_COUNT_DATA enable signal    reg COUNT30_CE;                    //U_COUNT30 enable signal    reg [13:0] N_SYM_DATA;	         //Counter for the number of symbols to help generate DATA_REQ signal, add one bit as the sign bit    reg DATA_REQ;                      //Register for signal REQ     reg [7:0] DATA_BUF;                //The input buffer for DATA_IN    reg DATA_RDY;                	    //The signal indicationg that DATA have been inputted    reg DATA_START;             	    //The signal enable DATA_generator    reg [7:0] DATA_OUT;                //DATA output register    reg DATA_DV;                	    //The signal indicationg  DATA valid     reg RST_CON;                       //The signal helping generate PHY_RST        reg [3:0] RATE_CON;			    //RATE_CON is used for DATA_generator to control its coding and mapping    reg [6:0] SCRAM_SEED;		    //The signal for scrambler of DATA_generator to initialize its LSFR    reg FFT_EN_Q1;    reg SHORT_ACK1;    assign GLB_RST_H=~GLB_RST;                    assign RST=~MCU_RST;//TXSTART_REQ is enabled to convert the transmitter into transmit state.//The transmit parameters are buffered.counter21 U_TXPAR_BUFADDR (			      //counter21 for buffer addresses generation    .Q(TXPAR_BUFADDR),    .CLK(MAC_CLK),    .Q_THRESH1(THRESH1),    .CE(TXSTART_REQ),    .AINIT(GLB_RST_H)); always @ (negedge GLB_RST or posedge MAC_CLK)	   if (!GLB_RST)						//These signals can only be reset by the global reset	   begin								 //signal but not PHY_RST.  TXPAR_BUF<=0;  PHY_RST<=1;  RST_CON<=0;  BUF_OVER<=0;  LENGTH<=0;  RATE<=0;  TXPWR<=0;  endelse  begin  if (TXSTART_REQ)                //transmit parameters are buffered into TXPAR_BUF by      begin								 //control of TXSTART_REQ      TXPAR_BUF[TXPAR_BUFADDR]<=PHY_TXSTART;    end    if	(TXSTART_REQ && !RST_CON)	//RST_CON will be set 1 to prevent PHY_RST from getting low again    begin    PHY_RST<=0;						 //transmit initialize    RST_CON<=1;    end  else if (!TXSTART_REQ)    RST_CON<=0;  if (!PHY_RST)						 //PHY_RST gets low(valid) for 1 clock    PHY_RST<=1;  if (THRESH1)    BUF_OVER<=1;  else    BUF_OVER<=0;  if (BUF_OVER)						 //BUF_OVER will get high for one clock after transmit     begin								 //parameters are buffered.    LENGTH<=TXPAR_BUF[20:9];		 //Transmit parameters will be put out by the control of    RATE<=TXPAR_BUF[8:3];			 //BUF_OVER    TXPWR<=TXPAR_BUF[2:0];    end  else if (!TXSTART_REQ) 								     TXPAR_BUF<=0;						 //When output is finished, TXPAR_BUF will be cleared.     end//transmit control signals generation and outputmain_counter U_MAIN_COUNTER (				 //The main counter for transmit sequences     .Q(MCOUNTER),    .CLK(SYS_CLK),    .CE(MCOUNTER_CE),    .ACLR(RST));													//The counter to generate FFT_EN signalscounter_80 U_COUNT80 (    .Q(COUNT80),    .CLK(SYS_CLK),    .THRESH1(FFT_EN),    .CE(COUNT80_CE),    .ACLR(RST));always @ (negedge MCU_RST or posedge SYS_CLK)	   if (!MCU_RST)								   begin  MCOUNTER_CE<=0;  N_SYM_FFT<=0;  SHORT_ACK<=0;  LONG_ACK<=0;  SIG_ACK<=0;  FFT_SET<=0;  COUNT80_CE<=0;  FFT_EN_Q<=0;  FFT_EN_Q1<=0;  SCRAM_SEED<=0;  RATE_CON<=0;  endelse  begin  if (BUF_OVER)        			    //if BUF_OVER is enabled, the U_MAIN_COUNTER will be started     begin								 //as well as the transmission of short sequences    MCOUNTER_CE<=1;    SHORT_ACK1<=1;    N_SYM_FFT<=TXPAR_BUF[20:9]+21;		     
	 //N_SYM_FFT will be set the number of length, add 21 for the service field,    //tail bits and signal field (2.75+18).    SCRAM_SEED<=7'b1011101;    case (TXPAR_BUF[8:3])                     // RATE_CON is from the vector of RATE.        6'd6 : RATE_CON<=4'b1101 ;	   6'd9 : RATE_CON<=4'b1111 ;	   6'd12: RATE_CON<=4'b0101 ;	   6'd18: RATE_CON<=4'b0111 ;	   6'd24: RATE_CON<=4'b1001 ;	   6'd36: RATE_CON<=4'b1011 ;	   6'd48: RATE_CON<=4'b0010 ;	   6'd54: RATE_CON<=4'b0011 ;      default: RATE_CON<=4'b0000 ;      endcase    end  	if(SHORT_ACK1)		SHORT_ACK1<=~SHORT_ACK1;  if (SHORT_ACK1)                              SHORT_ACK<=1;  if (MCOUNTER==161)              //"MCOUNTER==160" can stop the short sequences transmission    SHORT_ACK<=0;  if (MCOUNTER==160)					 //When MCOUNTER equals to 159, long sequences will begin to transmit     LONG_ACK<=1;						 //and stop after 161 clocks.   if (MCOUNTER==42)               //MCOUNTER==42 can enable the SIG_ACK which will be high for 1 clock    SIG_ACK<=1;  else if (SIG_ACK)    SIG_ACK<=~SIG_ACK;    if (MCOUNTER==116)					 //MCOUNTER==116 will initialize the FFTpro module to make it ready for    begin								 //process. U_COUNT80 will also be started for the output of FFT_EN. At     FFT_SET<=1;						 //the same time, the task of U_MAIN_COUNTER will be finished    COUNT80_CE<=1;    end  else if (FFT_SET)    FFT_SET<=~FFT_SET;  if (MCOUNTER==321)					 //When MCOUNTER==320, the task of U_MAIN_COUNTER will be finished.    begin								 //LONG_ACK will be also get low.    MCOUNTER_CE<=0;    LONG_ACK<=0;    end  if (FFT_EN)                                 //The FFT_EN is set into FFT_EN_Q and N_SYM_FFT is decreased by 18                                begin    FFT_EN_Q1<=1;    N_SYM_FFT<=N_SYM_FFT-18;    end  else    FFT_EN_Q1<=0;  if(FFT_EN_Q1)  	FFT_EN_Q<=1;  else if(FFT_EN_Q)  	FFT_EN_Q<=~FFT_EN_Q;  if (N_SYM_FFT==0 || N_SYM_FFT[13]==1'b1)    //If the N_SYM_FFT<=0, all the data have been transmitted, so U_COUNT80 will     COUNT80_CE<=0;						          //be stopped.  end//Generation of the signal DATA_REQ and completion of the DATA output//Notice: It works by clock MAC_CLK, so it will be descripped  //in another always block. counter_data U_COUNT_DATA (          //Counter for starting the DATA filed transmission    .Q(COUNT_DATA),    .CLK(MAC_CLK),    .Q_THRESH1(DATA_TXSTART),    .CE(COUNT_DATA_CE),    .ACLR(RST));									 counter_30 U_COUNT30 (					 //The counter to generate DATA_REQ signals    .Q(COUNT30),    .CLK(MAC_CLK),    .THRESH1(REQ),    .CE(COUNT30_CE),    .ACLR(RST));always @ (negedge MCU_RST or posedge MAC_CLK) 	   if (!MCU_RST)								   begin  COUNT_DATA_CE<=0;  N_SYM_DATA<=0;  COUNT30_CE<=0;  DATA_REQ<=0;  DATA_BUF<=0;  DATA_RDY<=0;  DATA_START<=0;  DATA_OUT<=0;  DATA_DV<=0;  endelse  begin								   if (BUF_OVER)						 //U_COUNT_DATA is started by BUF_OVER. After counting 30 clocks,    begin								 //DATA_REQ generation will be started.    COUNT_DATA_CE<=1;						     N_SYM_DATA<=TXPAR_BUF[20:9]+3;		//N_SYM_DATA will be also initialized.     end  if (DATA_TXSTART)                    //When DATA_TXSTART is high, COUNT30_CE will be started to      COUNT30_CE<=1;					      //generate the signal of  DATA_REQ.    						         if (COUNT_DATA==30)				      //When COUNT_DATA equals to 30, U_COUNT_DATA will be stopped and     begin								      //the signal DATA_START will be also get high for 1 clock to     COUNT_DATA_CE<=0;					   //start DATA_generator.    DATA_START<=1;    end  if (DATA_START==1)    DATA_START<=~DATA_START;  if (REQ)                             //REQ signal from U_COUNT30 will be output. At the same time,    begin								      //N_SYM_DATA will be decreased by 18 to count the data num.     DATA_REQ<=1;    N_SYM_DATA<=N_SYM_DATA-18;    end  else    DATA_REQ<=0;  if (N_SYM_DATA==0 || N_SYM_DATA[13]==1'b1)  //If the N_SYM_DATA<=0, all the data have been transmitted,      COUNT30_CE<=0;						          //so U_COUNT80 will be stopped    if (DATA_CONF)						 //DATA input will be buffered with the control of input signal    begin								 //DATA_CONF and the DATA_RDY will be get enabled to indicate     DATA_BUF<=DATA_IN;				 //DATA output can be started.    DATA_RDY<=1;    end  else    begin    DATA_BUF<=0;    DATA_RDY<=0;    end  if (DATA_RDY)						 //If the DATA_RDY is high, DATA will be outputted.    begin    DATA_OUT<=DATA_BUF;    DATA_DV<=1;    end  else    begin    DATA_OUT<=0;    DATA_DV<=0;    end        endendmodule

⌨️ 快捷键说明

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