簡介
循環定址通常是指定一個輔助暫存器ARx指向循環緩衝區;
循環緩衝區的有效基地址(EFB)就是用戶指定的輔助暫存器(ARx)的低N位置0後所得到的值;
循環緩衝區的尾基地址(EOB)是通過用BK的低N代替ARx的低N位得到;
循環緩衝區的偏移量(index)就是ARx的低N位;
循環定址的步長(step)就是加到輔助暫存器ARx或從輔助暫存器ARx中減去的值。
循環定址的算法:
If 0 £偏移量+步長<BK;
偏移量=偏移量+步長;
Elseif 偏移量+步長3BK;
偏移量=偏移量+步長-BK;
Elseif 偏移量+步長<0;
偏移量=偏移量+步長+BK;
若BK=0,則為不作修正的輔助暫存器間接定址。
若BK=0,則為不作修正的輔助暫存器間接定址。
循環定址操作過程
①首先要指定一個ARx指向循環緩衝區,根據ARx的低N位作為循環緩衝區的偏移量進行規定的定址操作。
②定址完成後,再根據循環定址算法修正偏移量,並返回ARx的低N位。
暫存器位定址;直接定址和間接定址都可以用於暫存器位定址,而絕對定址方式不支持暫存器位定址.只有暫存器位的"測試/置位/清零/取反"指令支持該定址方式.
I/O空間定址:絕對定址,直接定址和間接定址都可以用於I/O空間外設暫存器的存取.1,I/O空間的絕對定址:該模式將16位無符號常數指定為1個I/O地址,訪問I/O空間的任何一個單元.在代數指令中,使用*port(#k16)運算元,在助記符指令中,使用port(#k16),運算元前不加*2,PDP直接定址
算法
if 0 ≤ index+step <BK: index = index+step;
else if
index+step ≥ BK: index = index+step- BK;
else
if index+step <0: index = index+step+ BK;
其中,index是ARx的低N位(緩衝區偏移地址)
編程舉例
256點16階FIR濾波器:
.sect “fir-prog”
STM #255, BRC Block Repeat Counter
Repeat 256 times RPTBD fir_filter_loop
STM #16, BK ;
FIR circular buffer size LD *AR7+, A ;
load the input value STL A, *AR4+% ;
replace oldest sample with ;
newest sample RPTZ A, #16
MAC *AR4+0%, *AR3+0%, A ;
filtering
STH A, *AR5+ ;
replace the oldest buffer value fir_filter_loop