1.06k likes | 1.23k Views
DSP 的软件结构 联系方式: 02063118@emails.bjut.edu.cn 生命学院 生物医学工程(医疗电子类) 如有意合作开发项目,请联系我。不论本科生还是研究生。 基于 TI DSP 的产品开发。. 寻址方式:立即数寻址. 短立即数寻址(单字指令). 在指令字中包括立即操作数. RPT #99 ;将下一条指令循环 100 次. LD #0h , DP ;将 0 装入数据页指针. ADD #0ffh , A ;将 0ffh 加给 AccA. 寻址方式:立即数寻址. 长立即数寻址. 指令字的后一个字是立即数(双字指令).
E N D
DSP的软件结构联系方式:02063118@emails.bjut.edu.cn生命学院 生物医学工程(医疗电子类)如有意合作开发项目,请联系我。不论本科生还是研究生。基于TIDSP 的产品开发。
寻址方式:立即数寻址 • 短立即数寻址(单字指令) 在指令字中包括立即操作数 RPT #99 ;将下一条指令循环100次 LD #0h,DP ;将0装入数据页指针 ADD #0ffh,A ;将0ffh加给AccA
寻址方式:立即数寻址 • 长立即数寻址 指令字的后一个字是立即数(双字指令) ADD #1234h,A ;将#1234h加给 AccA
绝对地址寻址 • 数据存储器地址(dmad)寻址: 用一个符号或一个数来确定数据空间中的一个地址 例: MVKD sample,*AR5 sample所代表的就是一个dmad
绝对地址寻址 • 程序存储器地址(pmad)寻址: 用一个符号或一个数来确定程序地址空间中的一个地址 例: MVKD table,*AR5 table 所代表的就是一个pmad
绝对地址寻址 • 端口地址(PA)寻址 用一个符号或常数来确定I/O口地址 PORTR PA, Smem PORTW Smem, PA
绝对地址寻址 • *(lk)寻址 用一个符号或一个常数来确定数据存储器中的一个地址 例: LD *(BUFFER),A 把地址为BUFFER的数据单元中的数据装到AccA中
累加器寻址 用累加器中的数作为一个地址,可用来对存放数据的程序存储器寻址: • READA Smem • WRITA Smem • READA,把累加器A所确定的程序存储器单元中的一个字,传送到数据存储器单元Smem中。 • WRITA,把数据单元Smem中的一个字,传送到累加器A确定的程序存储器单元。
存储器映射寄存器(MMR)寻址 • 存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针(DP)或堆栈指针(SP)的值。存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用。
堆栈寻址 系统堆栈用来在中断和子程序期间自动存放程序计数器。它也能用来存放额外的数据项或传递数据值。处理器使用一个16-bit的存储器映射寄存器—堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素。
寻址方式:直接寻址 • TMS320C54的数据存储器分为512页,每页128字。设置一个数据页指针DP(Data Pointer),用9-bit指向一个数据页,再加上一个7-bit的页内偏移地址,形成16-bit的数据地址 LD #4,DP ;指向页4(0200h-027Fh) ADD 9h,A ;将数据页4中地址9h的 数据加给AccA
寻址方式:间接寻址 • 8个辅助寄存器(AR0--AR7),由一个辅助寄存器指针(ARP 3-bit)来指定 • 辅助寄存器算术单元(ARAU)作16-bit无符号数运算,决定一个新的地址,装入辅助寄存器中的一个 • AR0--AR7的内容相当灵活,可以装入立即数,加上立即数,减去立即数;也可以从数据存储器装入地址;还可以作以下的变址寻址:
寻址方式:间接寻址 • 将该AR的内容加1或减1,再寻址(循环常用) • 将该AR的内容加上或减去AR0的内容,再寻址。 • 将该AR的内容逆向进位加上或减去AR0的内容,再寻址。
寻址方式:间接寻址 ADD *,8,A ;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccA ADD *+,8,A,AR4 ;数据左移,加给AccA后,当前辅助寄存器加1,选择辅助寄存器AR4
寻址方式:间接寻址 ADD *0+,8,A ;执行加法后,将AR0的值加给当前辅助寄存器 ADD *BR0+,8,A ;执行加法后,将AR0的值加给当前辅助寄存器,但反向进位
正向进位与反向进位 1 0 0 1 0 0 + 1 0 0 + 1 0 0 ———— ———— 1 0 0 0 0 1 0
位倒序寻址 AR0 = 100 AR1 = 000 按AR1寻址后,将AR0加给AR1,反向进位
位倒序寻址 0 000 000 0 原序 原地址 位倒序后地址 位倒序 1 001 100 4 2 010 010 2 3 011 110 6 4 100 001 1 5 101 101 5 6 110 011 3 7 111 111 7
.mmregs .bss x, 4, 1 a0 .word 012h a1 .word 3211h a2 .word fe11h a3 .word ff03h .sect “program” LD #X, AR1 LD #0, A,AR1 LD #a0, T MAC *+,A LD #a1,T MAC *+,A LD #a2,T MAC *+,A LD #a3,T MAC *,A
循环寻址 许多算法,如卷积,相关和FIR滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。C54x间接寻址中提供了循环寻址的方式,以%表示。
循环寻址 定义循环缓冲器大小寄存器(BK)来确定循环缓冲器的大小。用循环缓冲器的有效基地址(EFB)和尾地址(EOB)来组成循环地址。step是加到辅助寄存器,或从辅助寄存器中减去的值。
汇编程序语法 TMS320的汇编程序包含汇编指令(伪指令,assembler directives)、汇编语言指令(assembly language instructions)、宏指令(macro directives)和注释(comments)。
C54的指令既可以是助记符方式,也可以是代数式方式C54的指令既可以是助记符方式,也可以是代数式方式
助记符方式汇编程序语法 [label][:] mnemonic [operand list] [;comment] [标号][:]助记符 [操作数] [;注释]
汇编程序语法 • 所有的语句必须由语句标号、空格、*号或 ;号开头。 • 语句标号不是必须的,如果用,就必须在第一列。 • 语句中的各部分之间,由一个或多个空格分开。 • 注释不是必须的。注释可以从第一列的 * 号或 ;号开头;如果不是从第一列开始,就必须用 ;号开头。
语句标号 由字母、数字、_、$组成,最多不超过32个字符,对大小写敏感,第一个字符不能是数字。后跟 :,但分号不是语句标号的组成部分。
助记符 • 助记符不允许从第一列开始,否则被认为是语句标号。 • 助记符可以是机器指令(如ABS,MPYU,SPH等)、伪指令(如.data, .list, .set等)、宏指令(如.macro, .var, .mexit等)和宏调用。
操作数 操作数可以是常数、符号或表达式。当操作数多于一个时,用逗号分开。
常数 • 二进制常数(如01B或01b) • 八进制常数(如10Q或10q) • 十进制常数(如23) • 十六进制常数(如78H或78h) • 字符常数(如‘A’或‘b’) • 字符串(如“sample program”) • 汇编时使用的常数
表达式 • 表达式是一个常数、符号、或用算术运算符连接起来的常数或符号。表达式的值的范围为-32768到32767
指令 TMS320C54x的指令集有近两百条指令,按功能分为如下几类: • 算术运算指令 • 逻辑运算指令 • 程序控制指令 • 装入和存储指令
算术运算指令 加法指令 减法指令 乘法指令 乘加指令 乘减指令 双数/双精度指令 特殊操作指令
乘加(TMS320C50) MAC dma,pma 程序存储器的值乘以数据存储器的值并累加到ACC (ACC) + (shifted P register) -> ACC (dma) -> TREG (dma) x (pma, addressed by FPC) -> P register Modify AR(ARP) and ARP as specified (FPC) + 1 -> FPC
MAC X0,Y0,A X:(R0)+,X0 Y:(R4)+N4,Y0 这条指令命令DSP56300 • 将寄存器X0和Y0中的数相乘 • 结果加到Acc A中 • 将寄存器R0所指的X存储器地址中的值装入寄存器X0 • 将寄存器R4所指的Y存储器地址中的值装入寄存器Y0 • R0的值加1 • 寄存器N4的值加给R4
程序控制指令 • 分支指令 • 调用指令 • 中断指令 • 返回指令 • 循环指令 • 堆栈操作指令 • 混合程序控制指令