4.10 发射主控单元

4.10.1 主控单元的工作任务

 4.10.2 主控单元的状态机设计

 

 

 

 

程序:

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;//请求发射处理器开始工作信号,与PHY_TXSTART同时拉高21个电平;
    input DATA_CONF;//待处理数据输入确认信号,与数据输入同时拉高;
    input [7:0] DATA_IN;//待处理数据;
    input MAC_CLK;//MAC层数据输入时钟,与工作模式有关,分别为1.25MHz、1.875MHz、2.5MHz、3.75MHz、5MHz、7.5MHz、10MHz、11.25MHz;
    input SYS_CLK;//系统时钟,频率为20MHz
    input MCU_RST;//异步复位时钟;
    input GLB_RST;//全局异步复位时钟;
    
    output PHY_RST;//发射处理器初始化信号;
    output [11:0] LENGTH;//待处理数据帧长输出;
    output [5:0] RATE;//待处理数据传输速率输出;
    output [2:0] TXPWR;//发射机发射功率输出;
    output SHORT_ACK;//shotr_generator的工作信号,拉高161个时钟;
    output LONG_ACK;//long_generator的工作信号,拉高161个时钟;
    output SIG_ACK;//signal_generator的开始工作信号,拉高1个时钟
    output DATA_REQ;//向上位机接口模块发送的数据传输请求信号,依SIG_ACK拉高一个时钟;
    output DATA_START;//Data_generator开始工作信号,比第一个符号的数据送入提前两个周期,拉高一个时钟;
    output [7:0] DATA_OUT;//待处理数据输出,输出至Data_generator;
    output DATA_DV;//待处理信号输出有效端口,随数据输出同步拉高;
    output FFT_SET;//FFTpro初始化信号,完成FFTpro模式配置工作;
    output FFT_EN_Q;//FFTpro处理开始信号,触发一个符号数据的IFFT变换
    output [3:0] RATE_CON;//Data_generator所需的传输速率控制信号,用于对数据编码与调制的控制;
    output [6:0] SCRAM_SEED;//Data_generator的扰码器所需的移位寄存器初始化向量;



    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.

//counter for buffer addresses generation
counter21 U_TXPAR_BUFADDR (			      
    .Q(TXPAR_BUFADDR),                    //transmit parameters buffer address signal
    .CLK(MAC_CLK),
    .THRESH0(THRESH1),                    //transmit parameters buffer over signal
    .CE(TXSTART_REQ),
    .SCLR(GLB_RST_H)); 

//initialize  PHY_RST,LENGTH,RATE,TXPWR
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;                  //transmit parameters buffer(12bits LENGTH ;6bits RATE;3bits TXPWR;)
          PHY_RST<=1;                    //transmit initialize signal
          RST_CON<=0;                    //The signal helping generate PHY_RST
          BUF_OVER<=0;                   //The register for the transmit parameters buffer over signal
          LENGTH<=0;                     //transmit parameters: data length
          RATE<=0;                       //transmit parameters: data rate
          TXPWR<=0;                      //transmit parameters: transmit power
      end
    else
      begin
          if (TXSTART_REQ)                //transmit parameters are buffered into TXPAR_BUF by  
            begin								 //control of TXSTART_REQ  
              TXPAR_BUF[TXPAR_BUFADDR]<=PHY_TXSTART;//21bits的PHY_TXSTART装载到TXPAR_BUF;
            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)                      //transmit parameters buffer over signal(21)
            BUF_OVER<=1;                    //The register for the transmit parameters buffer over signal
          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 output

//The main counter for transmit sequences (320计数器)
main_counter U_MAIN_COUNTER (				       
    .Q(MCOUNTER),                                  //U_MAIN_COUNTER outputs
    .CLK(SYS_CLK),
    .CE(MCOUNTER_CE),                              //U_MAIN_COUNTER enable signal
    .SCLR(RST));

//The counter to generate FFT_EN signals											  
counter_80 U_COUNT80 (
    .Q(COUNT80),                                   //U_COUNT80 outputs
    .CLK(SYS_CLK),
    .THRESH0(FFT_EN),
    .CE(COUNT80_CE),
    .SCLR(RST));

always @ (negedge MCU_RST or posedge SYS_CLK)	   
    if (!MCU_RST)								 
      begin
          MCOUNTER_CE<=0;
          N_SYM_FFT<=0;                           //Counter for the number of symbols to help generate FFT_EN signal, add one bit as the sign bit
          SHORT_ACK<=0;
          LONG_ACK<=0;
          SIG_ACK<=0;
          FFT_SET<=0;
          COUNT80_CE<=0;
          FFT_EN_Q<=0;                            //FFTpro处理开始信号,触发一个符号数据的IFFT变换
          FFT_EN_Q1<=0;
          SCRAM_SEED<=0;                          //Data_generator的扰码器所需的移位寄存器初始化向量;
          RATE_CON<=0;                            //Data_generator所需的传输速率控制信号,用于对数据编码与调制的控制;
      end
else
  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;
            //数据速率(6、9、12、18、24、36、48、54);参考Rate域的内容及相应的调制方式表格(P46)
            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==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 (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 (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),
    .THRESH0(DATA_TXSTART),
    .CE(COUNT_DATA_CE),
    .SCLR(RST));
									 
counter_30 U_COUNT30 (					 //The counter to generate DATA_REQ signals
    .Q(COUNT30),
    .CLK(MAC_CLK),
    .THRESH0(REQ),
    .CE(COUNT30_CE),
    .SCLR(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;
  end

else
  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
      
  end

endmodule

仿真图形:

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值