?? lab7.s54
字號(hào):
;******************************************************************************
; SJTU DSP Tech. Center
; Copyright (c) 2001 SJTU DSP Tech. Center. All Rights Reserved.
;
; Description:
; TMS320C54x Program for Students Experiment
;
; History:
; Date Authors Changes
; 2001/12/01 Xu Sheng Created.
;******************************************************************************
;Lab8== FFT experiment
STACK_ADDR .set 0x0500
K_DATA_IDX_1 .set 2
K_DATA_IDX_2 .set 4
K_DATA_IDX_3 .set 8
K_TWID_TBL_SIZE .set 512
K_TWID_IDX_3 .set 4 ;128
K_FLY_COUNT_3 .set 4
K_FFT_SIZE .set 32;1024 ;N=1024
K_LOGN .set 5;10 ;LOG(N)
.bss FFT_Data, 2048 ;make sure the data buffer match alignment
.bss Data_Input, 2048
.bss FFT_Output, 1024
.bss Sin, 512*2 ;make sure the data buffer match alignment
.bss Cos, 512*2 ;make sure the data buffer match alignment
.bss d_twid_idx, 1
.bss d_data_idx, 1
.bss d_grps_cnt, 1
.mmregs
.global main
.include "coeff.inc"
;------------------------------------------------------------------------------
.text
main:
stm #STACK_ADDR, SP
stm #0x00a8, PMST ;store IPTR
stm #0x0000, SWWSR
ssbx FRCT
ssbx SXM
;copy tables from program space to data space
stm #Sin, AR1
rpt #512-1
mvpd Sin_Tab, *AR1+
stm #Cos, AR1
rpt #512-1
mvpd Cos_Tab, *AR1+
;clear input data buffer
stm #Data_Input, AR1
rptz A, #2048-1
stl A, *AR1+
;add probe to read in data
nop
;-------------------- Do bit-reverse -------------------
stm #Data_Input, AR3 ;AR3 original_data_ptr
stm #FFT_Data, AR2 ;AR2 reordered_data_ptr
stm #K_FFT_SIZE-1, BRC
rptbd bit_rev_loop-1
stm #K_FFT_SIZE, AR0
mvdd *AR3+, *AR2+
mvdd *AR3-, *AR2+
mar *AR3+0B
bit_rev_loop:
;-------------------- Do FFT core -------------------
.asg AR1, GROUP_COUNTER
.asg AR2, PX
.asg AR3, QX
.asg AR4, WR
.asg AR5, WI
.asg AR6, BUTTERFLY_COUNTER
.asg AR7, STAGE_COUNTER
;*** stage 1 ***
stm #0, BK
ld #-1, ASM
stm #FFT_Data, PX
stm #FFT_Data+K_DATA_IDX_1, QX
ld *PX, 16, A ;AH=PX.x
stm #K_FFT_SIZE/2-1, BRC
rptbd stage1end-1
stm #K_DATA_IDX_1+1, AR0
sub *QX, 16, A, B ;BH=PX.x-QX.x
add *QX, 16, A ;AH=PX.x+QX.x
sth A, ASM, *PX+
st B, *QX+
|| ld *PX, A ;AH=PX.y
sub *QX, 16, A, B ;BH=PX.y-QX.y
add *QX, 16, A ;AH=PX.y+QX.y
sth A, ASM, *PX+0
st B, *QX+0%
|| ld *PX, A
stage1end:
;*** Stage 2 ***
stm #FFT_Data, PX
stm #FFT_Data+K_DATA_IDX_2, QX
ld *PX, 16, A ;AH=PX.x
stm #K_FFT_SIZE/4-1, BRC
rptbd stage2end-1
stm #K_DATA_IDX_2+1, AR0
; 1st butterfly
sub *QX, 16, A, B ;BH=PX.x-QX.x
add *QX, 16, A ;AH=PX.x+QX.x
sth A, ASM, *PX+
st B, *QX+
|| ld *PX, A ;AH=PX.y
sub *QX, 16, A, B ;BH=PX.y-QX.y
add *QX, 16, A ;AH=PX.y+QX.y
sth A, ASM, *PX+
sth B, ASM, *QX+
; 2nd butterfly
mar *QX+
add *PX, *QX, A ;AH=PX.x+QX.y
sub *PX, *QX-, B ;BH=PX.x-QX.y
sth A, ASM, *PX+
sub *PX, *QX, A ;AH=PX.y-QX.x
st B, *QX
|| ld *QX+, B ;BH=QX.x
st A, *PX
|| add *PX+0%, A ;AH=PX.y+QX.x
st A, *QX+0%
|| ld *PX, A
stage2end:
;*** Stage 3 through Stage logN ***
stm #K_TWID_TBL_SIZE, BK
st #K_TWID_IDX_3, *(d_twid_idx)
stm #K_TWID_IDX_3, AR0
stm #Cos, WR
stm #Sin, WI
stm #K_LOGN-2-1, STAGE_COUNTER
st #K_FFT_SIZE/8-1, *(d_grps_cnt)
stm #K_FLY_COUNT_3-1, BUTTERFLY_COUNTER
st #K_DATA_IDX_3, *(d_data_idx)
stage:
stm #FFT_Data, PX
ld *(d_data_idx), A
add *(PX), A
stlm A, QX
mvdk *(d_grps_cnt), GROUP_COUNTER
group:
mvmd BUTTERFLY_COUNTER, BRC
rptbd butterflyend-1
ld *WR, T ; T := WR
mpy *QX+, A ; A := QR*WR || QX->QI
macr *WI+0%, *QX-, A ; A := QR*WR+QI*WI
; || QX->QR
add *PX, 16, A, B ; B := (QR*WR+QI*WI)+PR
st B, *PX ; PR':=((QR*WR+QI*WI)+PR)/2
|| sub *PX+, B ; B=PR-(QR*WR+QI*WI)
; || PX->PI
st B, *QX ; QR':= (PR-(QR*WR+QI*WI))/2
|| mpy *QX+, A ; A := QR*WI [T=WI]
; || QX->QI
masr *QX, *WR+0%, A ; A := QR*WI-QI*WR
add *PX, 16, A, B ; B := (QR*WI-QI*WR)+PI
st B, *QX+ ; QI':=((QR*WI-QI*WR)+PI)/2
|| sub *PX, B ; B=PI-(QR*WI-QI*WR)
ld *WR, T ; T := WR
st B, *PX+ ; PI':= (PI-(QR*WI-QI*WR))/2
|| mpy *QX+, A ; || PX->PR
; A := QR*WR || QX->QI
butterflyend:
; Update pointers for next group
pshm AR0
mvdk *(d_data_idx), AR0
mar *PX+0
mar *QX+0
banzd group, *GROUP_COUNTER-
popm AR0
mar *QX-
; Update counters and indices for next stage
ld *(d_data_idx), A
sub #1, A, B
stlm B, BUTTERFLY_COUNTER
stl A, 1, *(d_data_idx)
ld *(d_grps_cnt), A
stl A, ASM, *(d_grps_cnt)
ld *(d_twid_idx), A
stl A, ASM, *(d_twid_idx)
mvdk *(d_twid_idx), AR0
banz stage, *STAGE_COUNTER-
fft_end:
;*** Compute the power spectrum ***
ssbx OVM
stm #FFT_Data, AR2
stm #FFT_Output, AR4
stm #K_FFT_SIZE/2-1,BRC
rptb power_end-1
squr *AR2+, A
squra *AR2+, A
sth A, *AR4+
power_end:
dead_loop:
nop
nop
nop
nop
b dead_loop
;------------------------------------------------------------------------------
.sect "vectors"
int_RESET:
b main
nop
nop
.space 124*16
;------------------------------------------------------------------------------
;end of lab8.s54
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -