ss_syn.asm

来自「这是我在ADSP tiger sharc 201上面实现的OFDM(标准是wim」· 汇编 代码 · 共 719 行 · 第 1/2 页

ASM
719
字号
	j7=j4+SAMPLE_SEQUENCE_LENGTH+0x10000 ;;//Sample3	
	lc0=SAMPLE_SEQUENCE_LENGTH-Path_Window_Length-1;;
	r7=0xffffffff;;
	.align_code 4;
	jump _debug_start_compare;;
	
	
	.align_code 4;		
	_debug_linkprot_mode_2:	
	j4=[ j31+Pointer0 ] ;;
	j4=j4+Path_Window_Length_syn ;;//指向天线数据Sample0 
	j5=j4+SAMPLE_SEQUENCE_LENGTH_SYN ;;//Sample1
	j6=j4+2*SAMPLE_SEQUENCE_LENGTH_SYN ;;//Sample2
	j7=j4+3*SAMPLE_SEQUENCE_LENGTH_SYN ;;//Sample3
	lc0=SAMPLE_SEQUENCE_LENGTH_SYN-Path_Window_Length_syn-1;;
	r7=0x0000ffff;;
	#ifdef DEBUG_MODE2_FRAME_DATA
	r7=0xffffffff;;
	#endif
	
	.align_code 4;
	_debug_start_compare:
		xr2=[j4+=1];;
	#ifdef DEBUG_MODE2_FRAME_DATA
		
		xr2=[ j31+FPGA_Slot_no ];;			
		xr2=pass r2;;
		.align_code 4;
		if xaeq;do,xr2=24;;
		r2=dec r2;;
		r1=4*SAMPLE_SEQUENCE_LENGTH_SYN;;
		r2=r2*r1(I);;
	#endif
		r6=1;;
		
		r3=[j5+=1];r2=r2+r6;;		
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
		r3=[j6+=1];r2=r2+r6;;
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
		r3=[j7+=1];r2=r2+r6;;
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
	
	.align_code 4;	
	_DEBUG_LINKPORT_COMP:
	
		r3=[j4+=1];r2=r2+r6;;		
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
		r3=[j5+=1];r2=r2+r6;;		
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
		r3=[j6+=1];r2=r2+r6;;
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
		r3=[j7+=1];r2=r2+r6;;
		r3=r3 and r7;;
		comp(r3,r2);;
		if NAEQ, jump _DEBUG_LINKPORT_ERROR;;
		
		.align_code 4;
		jump _DEBUG_LINKPORT_RIGHT;;
		
		.align_code 4;
		_DEBUG_LINKPORT_ERROR:
		xr0=1;;				
		#ifdef DEBUG_AD3
		[ j31 + Stop_Linkport_AD3]=xr0;; //stop signal		
		#endif
		#ifdef DEBUG_AD1		
		[ j31 + Stop_Linkport_AD1 ]=xr0;;
		#endif
		.align_code 4;		
		nop;nop;nop;lc0=0;;
		.align_code 4;
		jump run_error;;
		
		.align_code 4;
		jump _DEBUG_LINKPORT_ERROR;;
	
	.align_code 4;
	_DEBUG_LINKPORT_RIGHT:	
	.align_code 4;
	if nlc0e, jump _DEBUG_LINKPORT_COMP;;
	.align_code 4;
	jump _ONE_INTR_END;;
#endif 
//end of DEBUG_LINKPORT///////////////////////////////////////////

 ///////////////////////////function body here////////////////////////////////////
#ifdef DEBUG_GEN_DATA
 //generate antenna data for debug BEGIN
	//step1 : normalization;
	// already use matlab to normalization;
	j4=I1;;	
	k4=Q1;;
	j5=IQ1;;	
	r0=[j4+=1];r4=[k4+=1];;
	r8=0xffff0000;r7=r7 xor r7;;
	r6=2147483647.00;;//2^31-1	
	lc0=1152;;
	.align_code 4;
	start_data_change:		
		//step2 : combine to packed 16Q 16I;
		fr0=r0*r6;;
	    fr4=r4*r6;;
	    r1=fix fr0;;
	    r3=fix fr4;;
		r4=r3 and r8; r0=lshift r1 by -16;;//fetch the high 16 bits
		
		r4= r4 or r0;;// I Q combination;
		[j5+=1]=xr4;;
		r0=[j4+=1];r4=[k4+=1];;
	if nlc0e, jump start_data_change;;
	//generate antenna data for debug END
#endif //endif DEBUG_GEN_DATA
///////////////////////////////////////////////
	///compare linkport mode to jump////////////
	xr0= [ j31+linkport_mode_bak ];;	
	xr1=2;;
	comp(r0,r1);;
	.align_code 4;
	if xaeq,jump _move_data_to_next_slot;;
	
	//mode 1
	/////////////////////move this frame tail data to the next frame Head/////////
	.align_code 4;
	_move_data_to_next_frame:
	j4=[ j31+Pointer0 ];;//this frame data ;
	j4=j4+SAMPLE_SEQUENCE_TAIL_OFF;;//this frame data tail;
	lc0=(Path_Window_Length-16)/4;			j5=[ j31+Pointer1 ];;//the next frame data ;
	j6=j4+0x10000;							k4=j5;;
	j7=j4+SAMPLE_SEQUENCE_LENGTH;;			
	j8=j4+0x10000+SAMPLE_SEQUENCE_LENGTH;;	
	xr3:0=q[j4+=4];							k6=k4+0x10000;;
		xr7:4=q[j6+=4];;					k7=k4+SAMPLE_SEQUENCE_LENGTH;;	
			xr11:8=q[j7+=4];;				k8=k4+0x10000+SAMPLE_SEQUENCE_LENGTH;;	
				xr15:12=q[j8+=4];;
	.align_code 4;
	_move_data:
		q[k4+=4]=xr3:0;xr3:0=q[j4+=4];;
		q[k6+=4]=xr7:4;xr7:4=q[j6+=4];;		
		q[k7+=4]=xr11:8;xr11:8=q[j7+=4];;
	.align_code 4;			
	if nlc0e,jump _move_data;q[k8+=4]=xr15:12;xr15:12=q[j8+=4];;	
	
	.align_code 4;
	_MOVE_DATA_END:
	/////////////////////move end///////////////////////////////////////
	// a Floating32 complex conjute  multiple.
	//r11=1.0;;r10=2.0;;//a=r11 + j* r10
	//xr13=3.0;;xr12=4.0;;//b=r13 + j* r12
	//yr12=xr13;;
	//yr13=xr12; fr16=r10*r12;;
	//fr17=r11*r13;;
	//fr18=r16+r17,fr19=r16-r17;;// Real=xfr18,Imag=yfr19;
	
	//two codes corr with one frame ant-data 	
	//.align_code 4;
	//_test_xcorrs:
	//r31=1;;
	.align_code 4;call _xcorrs_two_codes_one_frame;;
			
	nop;;
	//到此为止,x路得到一个峰,y路得到一个峰.
	nop;;
    .align_code 4;jump _NOT_SYNC;;
    
    .align_code 4;
    _SYNC:
    //如果已经搜到一个符合条件的码字,下面接连5帧都应该继续匹配该码字以确认.
    //这样x路码字=已搜索到的码字;y路码字=未搜索的码字.
    //xr31 is the sync linkport_timing;
    //config linkport_timing
    [ j31 + linkport_timing ]=xr31;;
    
 	//config SYNC signal to EQU DSP	
 		
    //change intr to 2 symbol:
    //change linkport :
    #ifdef DEBUG_AD3
    xr0=1;;
    [ j31 + Stop_Linkport_AD3]=xr0;; 	
    #endif
    xr0=2;;
    [ j31+ LINKPORT_MODE ]=xr0;;
    [ j31+ linkport_mode_bak ]=xr0;;
    .align_code 4;jump 	_LOAD_TCB_TO_RECEIVE_DATA(NP);;	
	//give a signal to start AFC:
	.align_code 4; jump _ONE_INTR_END(NP);;    		 	
	
	.align_code 4;
	_NOT_SYNC:
    
	
	.align_code 4; jump _ONE_INTR_END(NP);;
	
	//if mode 2:
	.align_code 4;
	_move_data_to_next_slot :
	j4=[ j31+Pointer0 ];;//this frame data ;
	j4=j4+SAMPLE_SEQUENCE_TAIL_OFF_SYN;;//this frame data tail;
	lc0=Path_Window_Length_syn/4;			j5=[ j31+Pointer1 ];;//the next frame data ;
	j6=j4+SAMPLE_SEQUENCE_LENGTH_SYN;							k4=j5;;
	j7=j4+2*SAMPLE_SEQUENCE_LENGTH_SYN;;			
	j8=j4+3*SAMPLE_SEQUENCE_LENGTH_SYN;;	
	xr3:0=q[j4+=4];							k6=k4+SAMPLE_SEQUENCE_LENGTH_SYN;;
		xr7:4=q[j6+=4];;					k7=k4+2*SAMPLE_SEQUENCE_LENGTH_SYN;;	
			xr11:8=q[j7+=4];;				k8=k4+3*SAMPLE_SEQUENCE_LENGTH_SYN;;	
				xr15:12=q[j8+=4];;
	.align_code 4;
	_move_slot_data:
		q[k4+=4]=xr3:0;xr3:0=q[j4+=4];;
		q[k6+=4]=xr7:4;xr7:4=q[j6+=4];;		
		q[k7+=4]=xr11:8;xr11:8=q[j7+=4];;	
	.align_code 4;			
	if nlc0e,jump _move_slot_data;q[k8+=4]=xr15:12;xr15:12=q[j8+=4];;	
	
	//check AFC_enable to start AFC
	
	
    .align_code 4;
    _ONE_INTR_END:
    
    j0=[ j31 + Pointer0 ];;
	j1=[ j31 + Pointer1 ];; 
	[ j31 + Pointer0 ] = j1 ;;   //change pointer
	[ j31 + Pointer1 ] = j0 ;;	 //change pointer
   
	.align_code 4;
    
 jump  _one_intr ;;
 
 //////////////////////////////////////////////////////////////////////////////
 
 //*********************************************************************

 ISR:

//*********************************************************************

 irq0_svr:
 .align_code 4;
   [j27+=4]=cjmp   ;   [k27+=4]=yr0    ;; 
   [j27+=4]=j31    ;   [k27+=4]=k31    ;;
  q[j27+=4]=xr31:28;  q[k27+=4]=yr31:28;;
  q[j27+=4]=xr3:0  ;  q[k27+=4]=yr3:0  ;;
  q[j27+=4]=j3:0   ;  q[k27+=4]=k3:0   ;;
  
   
   
   yr0=[ j31 + int_counter ];;
   yr0=inc r0;;
   nop;;
   [ j31 + int_counter ] = yr0;;
   [ j31 + rpt_dsp3_watch_in_fpga ] = yr0 ;;
   
   
   btgl_Flag:
          
          yr0=[ j31 + int_counter ];;
          yr1=0x1f;;
          
          j0=[j31+linkport_mode_bak ];;
 		  comp(j0,1);;
 		  .align_code 4;
 		  if jeq, jump _led_mode_1;; 		  
          yr1=0x1ff;;
          
          .align_code 4;
 		  _led_mode_1:
          yr2=r0 and r1;;
          yr3=0 ;;
          
          ycomp(r2,r3);;
          .align_code 4;
          if nyaeq,jump btgl_Flag_end(np);;
          
          
          yr0 = FLAGREG;;
          yr0 = btgl r0 by FLAGREG_FLAG3_OUT_P;;
	      flagreg = yr0;;
          
   btgl_Flag_end:
   
    
   
    
   j27=j27-4;          k27=k27-4;;
   j3:0=q[j27+=-4];    k3:0=q[k27+=-4];;
  xr3:0=q[j27+=-4];   yr3:0=q[k27+=-4];;  
xr31:28=q[j27+=-4]; yr31:28=q[k27+=-4];;
    j31= [j27+=-4];     k31= [k27+=-4];;   
   cjmp= [j27+= 0];     yr0= [k27+= 0];;
  .align_code 4;
   rti(abs)(np);;
 
 
 
 dma0_svr:
 
 
 dma1_svr:
 
 
 .align_code 4;
  nop;;
  nop;;
  nop;;
  nop;;
 
  rti(abs)(np);;

  
//*********************************************************************
.align_code 4;
 run_error:

//*********************************************************************
  
 
 
    xr0=INT_IRQ0;;
    xr1=0xffffffff;;
    xr0=r0 xor r1;;
    
    xr2=IMASKH;;
    xr2=r2 and r0;;
    IMASKH=xr2;;
    xr3=IMASKH;;
    xr3=xr3;;        // disable slot_INT
    
    	
 	xr0=r0 xor r0;;
 	LRCTL0=xr0;;
    LRCTL1=xr0;;
     
    nop;;
 	nop;;                                 //  break here
 	nop;; nop;; nop;;idle ;;
 	nop;; 



⌨️ 快捷键说明

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