📄 fir1.asm
字号:
**********************************************************
* 用线性缓冲区和直接寻址方法实现FIR滤波器 *
*N=5,y(n)=h0*x(n)+h1*x(n-1)+h2*x(n-2)+h3*x(n-3)+h4*x(n-4)*
**********************************************************
.title "fir1.asm"
.mmregs ;定义寄存器名称及对应地址
.def start ;定义程序入口
;分配数据存储区
L .set 10
.ref SinTable
.bss y,1 ;y
XN .usect "XN",1 ;x(n)
XNM1 .usect "XN",1 ;x(n-1)
XNM2 .usect "XN",1 ;x(n-2)
XNM3 .usect "XN",1 ;x(n-3)
XNM4 .usect "XN",1 ;x(n-4)
H0 .usect "H0",1 ;h0
H1 .usect "H0",1 ;h1
H2 .usect "H0",1 ;h2
H3 .usect "H0",1 ;h3
H4 .usect "H0",1 ;h4
beforefir .usect "beforefir",L
afterfir .usect "afterfir",L
*PA0 .set 0000H ;数据输出端口
*PA1 .set 0001H ;数据输入端口
;参数表
.data
table: .word 1*32768/10 ;h0=0.1 ;注:除以10是为了
.word -3*32768/10 ;h1=-0.3 ;把参数变成纯小数
.word 5*32768/10 ;h2=0.5 ;乘以32768表示把
.word -3*32768/10 ;h3=-0.3 ;小数点移到最高位后面
.word 1*32768/10 ;h4=0.1
.text
start: SSBX FRCT ;小数乘法
;把参数表复制到数据存储区的H0-H4
STM #H0,AR1 ;H0指针赋给AR1
RPT #4 ;下一条指令重复5次
MVPD #table,*AR1+ ;逐项复制参数表,相当于执行下列操作:
;PAR=Table,*AR=*PAR,AR=AR+1,PAR=PAR+1
STM #XN+1,AR1 ;把x(1)--x(n-4)赋初值0
RPT #3
ST #0,*AR1+
STM #XN+4,AR3 ;AR3=#XNM4
STM #H0+4,AR4 ;AR4=#H4
STM #y,AR1
LD #beforefir,DP
STM #beforefir,AR1
RPT #(L-1)
MVPD #SinTable,*AR1+
LD #XN,DP ;使数据页指向XN
* PORTR PA1,@XN ;从端口PA1读入数据x(n)
STM #beforefir,AR5
STM #afterfir,AR6
MVDK *AR5+,@XN
FIR1: LD @XNM4,T ;x(n-4)--->T
MPY @H4,A ;h4*x(n-4)---->A
LTD @XNM3 ;x(n-3)--->T
;x(n-3)--->x(n-4)
MAC @H3,A ;A+h3*x(n-3)--->A
LTD @XNM2 ;x(n-2)--->T
;x(n-2)--->x(n-3)
MAC @H2,A ;A+h2*x(n-2)--->A
LTD @XNM1 ;x(n-1)--->T
;x(n-1)--->x(n-2)
MAC @H1,A ;A+h1*x(n-1)--->A
LTD @XN ;x(n)--->T
;x(n)--->x(n-1)
MAC @H0,A ;A+h0*x(n)--->A
STH A,@y ;保存y(n)
MVKD @y,*AR6+
* PORTW @y,PA0 ;输出y(n)
BD FIR1
MVDK *AR5+,@XN
* PORTR PA1,@XN ;再一次从端口PA1读入数据x(n)
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -