DSP实验
实验一 集成开发环境 CCS 应用基础
一、目的
- 通过创建一个简单的应用工程,初步熟悉 CCS 的使用,了解程序开发调试过程。
- 掌握汇编语言源程序的基本框架和编写方法,了解 CCS 的工程结构以及编译连接的基本过程。
- 了解 ST0、ST1、PMST 的标志位对计算结果的影响以及计算过程对标志位的影响。
二、内容
- 在 TMS320C5402 软件仿真模型上,建立 example1.cmd 命令文件,配置 COFF 段结构,分配存储空间。
- 运行一段程序,分别将与 CPU 运算相关的控制位 SXM、OVM、C16、FRCT 置 1 或清 0,分析程序的执行结果。观察与 CPU 运算相关的标志位 TC、C 的变化情况。
三、要求
- 本实验要求在 PC 机的集成开发环境 Code Composer Studio(简称 CCS)及 TMS320C5402 软件仿真模型上进行。
- 实验程序:example1.asm, vectors.asm,example1.cmd
- 实验前要作好充分准备,包括读懂实验程序,分析程序中的原始数据、中间结果和最终结果,了解调试步骤及调试方法等。写出实验预习报告。
- 通过实验验证自己的分析正确否,总结实验中遇到的问题,根据实验报告的要求,认真撰写实验报告。
实验任务:
四、实验步骤
- 建议在逻辑盘 D: 下,建立以自己学号命名的子目录,(如:D:DXK03 学号)以后自己的实验程序都在此目录下运行。并将文件 example1.asm, vectors.asm,example1.cmd 拷贝该文件夹内。(说明:实验室的机器 C 盘都已保护,ti 目录在 C 盘, 所以学生的目录及文件不能建在 c: imyprojects 下)。
- 运行 CCS setup,选择 C5402 Device Simulator, 进入 CCS,Project –> New 建立一个新的项目 example1,Project –> Add Files to Project,将 example1.asm, vectors.asm,example1.cmd 加入该项目。
- 在 Project–>Option 中加入适当的编译和连接的选项。
- Build 整个项目,产生可执行文件 example1.out。
- File->Load Program,装载可执行文件 example1.out,并运行和调试。
五、实验结果和提示
- 建立项目,并加入文件
运行 C5402 Device simulator,选择 Project→New 菜单项,建立一个新的项目 example1.pjt,并选择 Project→add files to new project 菜单项,加入文件 example1.asm, vectors.asm,example1.cmd
- 编译和连接
- 编译:选择 Project–>Build Option,在 Compile 表单的 Category 列表中,选择 basic 选项,并设置 generate debug info 为 full symbolic debug 选项。
- 连接:选择 Project–>Build Option,在 linker 表单中的 autoinit mode 选项中选择 no autointialization 模式,在 Output Filename 中输入 debug example1.out,在 Code Entry Point 中输入 main,Map Filename 中输入 example1.map,然后保存选项设置。
- 选择 Project→Build 构建整个项目,产生可执行文件 example1.out。
- 选择 File->Load Program,装载可执行文件 example1.out。
- 观察存储器映象 Map 文件,选择 File→Open 打开 example1.Map 文件,可观察下列各项内容。将下列信息与 cmd 文件中的设置进行比较,理解 cmd 文件和连接器的关系。
- 存储器的配置情况:页面 0(PAGE 0) 为程序空间,页面 1(PAGE 1) 为数据空间。给出了各存储空间的名称。
- 共配置了 5 个段:
程序文本段. text :位于 0 页,起始地址 0xe000,存储区长度 0x0017
段. data :位于 0 页,起始地址 0xe0000,存储区长度 0x007e
向量段. vectors :位于 0 页,起始地址 0x0080,存储区长度 0x007e
未初始化数据段. bss :位于 1 页,起始地址 0x0000,存储区长度 0x0000
堆栈段 STACK :位于 1 页,起始地址 0x0080,存储区长度 0x0010
- 全局符号:共 18 个符号,给出了它们在存储器中的位置,如符号. bss 在存储器中的位置为 0x00600。
- 输出文件 example1.out 的运行和调试
- 运行程序:将可执行文件装载到 simulator 中,选择 Debug→Run 或按 F5 键运行程序,按 shift F5 键可中止程序的运行;选择 Debug→Step into 或按 F8 键可实现程序的单步执行。
- 设置断点:把光标移到某一行,按 F9 键,这一行将会以红 {MOD}高亮显示,表示在该行加了一个断点。
- 观察和修改存储器单元的内容,点击 CCS 操作界面左侧调试工具栏 图标,出现寄存器窗口,在该窗口查看存储器的地址,选择 View→memory 或点击 CCS 操作界面左侧调试工具栏 图标,在弹出的菜单中输入存储器地址,可观察存储器的内容。如存储器地址为 0x2000 中内容为 0x000A。修改源汇编程序中数据段内容,可查看存储器单元内容的变化。如把 a1 的值由 10 改为 1,求出和的结果将变为 0x001A。
- 与运算相关的标志位
- SXM
当 SXM 置 1 时,数据读写按照符号扩展的方式,因此 A=0xff ffff ff80
当 SXM 置 0 时,数据读写为无符号扩展的方式,因此 A=0x00 0000 ff80
- OVM
当 OVM 置 1 时,数据运算的结果将按照 32 位饱和,因此 A=0xff 8000 0000
当 OVM 置 0 时,数据运算不饱和,因此 B=0x00 fffe 0000
- C16
双 16 位计算比较
- FRCT
乘法移位比较
- TC
比特测试比较
- C
进位、借位和大小比较
- OVA, OVB
溢出标志
六、 程序说明
程序的结构和功能,对每条指令进行注释,写出执行结果
主程序
.title "example1.asm"
.mmregs ;enable memory mapped registers
stack .usect "STACK" ,10h ;set stack section
.def _c_int00 ;define symbol _c_int00
.text ;.text section
_c_int00:
stm
;stm
stm
;================================================
stm
st
;================================================
;test SXM
;watch A to unde rstand sign extension
ssbx SXM ;SXM 置1, 数据读写按照符号扩展的方式, ST1=0 x2900
nop ; 防止流水线冲突, 下同
ld *AR2 , A ;((AR2))->A, A=0 xffffffff80
;------------------------
rsbx SXM ;SXM 置0, 数据读写为无符号扩展的方式, ST1=0 x2800
nop
ld *AR2 , A ;((AR2))->A, A=0 x000000ff80
;================================================
;test OVM
;watch A and B to unde rstand saturation
ssbx SXM ;1->SXM , ST1=0 x2900
ssbx OVM ;OVM 置1, 数据运算的结果将按照32 位饱和, ST1=0x2b00
ld
add
;------------------------
rsbx OVM ;OVM 置0, 数据运算不饱和, ST1=0 x2900
ld
add
;================================================
;test C16
;watch B to unde rstand 2-16 mode
ssbx OVM ;1->OVM,ST1=0x2b00
ld
add
dst A, *AR2 ;A->(AR2), (0 x2000)=0 x00017fff
ld
or
rsbx C16 ;C16 置0, 双精度模式
nop
dadd *AR2 , A, B ;((AR2))+(A)->B, B=0 x0000037fffe
;------------------------
ssbx C16 ;C16 置1, 双16 位模式, ST1=0x2b80
nop
dadd *AR2 , A, B
;((AR2)(39~16))+(A(39~16))->B(39~16) ,((AR2)(15~0))+(A(15~0))->B(15~0) , B=0 x000002fffe
;================================================
;test FRCT
;watch B to unde rstand fraction mode
ld
rsbx FRCT ;FRCT 置0, 乘法器做整数乘法, ST1=0x2b80
nop
mpya *AR2 ;((AR2))*(A(32~16))->B, ((AR2)->T, B=0 x0000001234 , T=0 x0001
;------------------------
ssbx FRCT ;FRCT 置1, 小数乘法, 结果左移一位去符号
nop
mpya *AR2 ; [(( AR2))*(A(32~16))]<<1->B, B=0 x0000002468 , T=0 x0001
;================================================
;test TC
;watch TC to unde rstand bit test operation and corresponding flags
bitf *AR2 , #0 x8000 ;((AR2))&0 x8000 ->TC , TC=0, ST0=0 x0600
nop
nop
;------------------------
bitf *AR2 , #0 x0001 ;((AR2))&&0x0001 ->TC , TC=1, ST0=0 x1600
nop
nop
;================================================
;test C
;watch C to unde rstand max & min operation and corresponding flags
ssbx SXM ;1->SXM
ld #0x7fff , A ;A=0 x0000007fff
ld #0x8000 , B ;B=0 xffffff8000
max A ;max((A) ,(B))->A, [(A) >(B)?1:0]->C, A=0 x0000007ffff , C=0 (A0x1600
nop
nop
;------------------------
min B ;min((A) ,(B))->B, [(A) <(B)?1:0]->C, B=0 xffffff8000 , C=1 (A0x1e00
nop
nop
;================================================
;test OVA , OVB
;watch OVA to unde rstand overflow
ssbx SXM ;1->SXM
rsbx OVA ;clear overflow flag , ST0=0 x1a00
ld #0x7fff , 16, A ;#0x7ffff <<16->A, A=0 x007fff0000
add #0xffff , A ;A=0 x007fff0000 +0 xffffffffff =0 x007ffeffff , OVA=0, C=1, ST0=0 x1a00
nop
nop
;------------------------
add #0x7fff , 16, A ;A=0 x007fffffff , OVA=1, C=0, ST0=0 x1600
nop
nop
;================================================
;lock PC in a know area when program ends
infinite_loop:
nop
nop
nop
nop
b infinite_loop
.end
中断向量:
;Interrupt Vector Table
;Only RESET interrupt is defined
.ref _c_int00 ; entry point addre ss
.sect "vecto rs"
int_RESET:
b _c_int00 ;when reset , jump to _c_int00
; nop
; nop
.space 124*16 ;no other interrupt used , keep their space
.end
链接命令及存储器映射文件:
vector.obj
example1.obj
-o Debugexample1.out
-m Debugexample1.map
MEMORY
{
PAGE 0:
EPROM: org=0xE000 , len=0x100
VECS: org=0xFF80 , len=0x80
PAGE 1:
SPRAM: org=0x0060 , len=0x0020
DARAM: org=0x0080 , len=0x100
}
SECTIONS
{ .text :> EPROM PAGE 0
.data :> EPROM PAGE 0
.bss :> SPRAM PAGE 1
STACK :> DARAM PAGE 1
vectors :> VECS PAGE 0
}
段名 |
未 / 已初始化 |
所属 PAGE |
起始地址 |
存储区长度 |
STACK
未初始化
1
0x0080
256 字
.bss
未初始化
1
0x0060
32 字
.text
已初始化
0
0xe000
256 字
.data
已初始化
0
0xe000
256 字
vectors
已初始化
0
0xff80
128 字
本实验中 ST0,ST1,PMST 各相关位功能:
• ST0
– TC (ST0,D12)
测试 / 控制位,存储 ALU 位测试操作的结果
– C (ST0,D11)
进位,借位,大小比较
– OVA (ST0,D10)
累加器 A 溢出标志位
– OVB (ST0,D9)
累加器 B 溢出标志位
• ST1
– SXM (ST1,D8)
* 当 SXM 置 1 时,数据读写按照符号扩展的方式
* 当 SXM 置 0 时,数据读写为无符号扩展的方式
– OVM (ST1,D9)
* 当 OVM 置 1 时,数据运算的结果将按照 32 位饱和
* 当 OVM 置 0 时,数据运算不饱和
– C16 (ST1,D7)
* 当 C16 置 1 时,为双 16 位模式,ALU 单周期内同时完成两个加减法运算
* 当 C16 置 0 时,为双精度模式,ALU 单周期只进行一次 32 位加减法运算
– FRCT (ST1,D6)
小数模式位,当 FRCT 置 1 时,乘法器输出左移一位,已消除多余符号位
• PMST
– IPTR (PMST,D15-D7)
中断矢量指针,复位值 0x1ff
七、 调试说明
总结上机调试步骤和调试情况,分析调试中遇到的问题是如何解决的。
实验心得:
开始时尝试在 windows10 上安装 ccs3,但总是安装失败,后来在虚拟机里使用 windows xp 才成功。
实验二 数据格式转换及浮点运算实验
一、目的
- 了解定点数的定标方法,了解浮点数的表示方法。
- 掌握定点数规格化为浮点数及浮点数转换为定点数的方法。
- 学习利用定点 DSP 芯片完成浮点数运算的程序编写方法。
- 进一步掌握程序编译、连接、运行和调试的基本过程,掌握在 CCS 环境下调试程序。
二、内容
- 编写浮点乘法程序,完成 a1×a2=0.4×(-0.9) 的运算。
- 分为三步进行:将定点数规格化为浮点数;进行浮点乘法运算;将浮点数转换成定点数。
- 在程序中保留 10 个数据存储单元,其中:
a(被乘数) a+1(乘数)
b(被乘数的指数) b+1(乘数的指数)
c(被乘数的尾数) c+1(乘数的尾数)
ep(乘积的指数) mp(乘积的尾数)
product(乘积) temp(暂存单元)
- 两浮点数相乘:尾数相乘,指数相加。
- 选作:完成 a1+a2=0.4+(-0.9) 的运算
三、要求
- 本实验要求在 PC 机的集成开发环境 Code Composer Studio(简称 CCS)及 TMS320C5402 软件仿真模型上进行。
- 实验参考程序:example4.asm, vectors.asm, example4.cmd
- 实验前要作好充分准备,可参考教材 “DSP 原理及应用”(邹彦主编)165 页 5.8 节例 5.8.1 编写程序,组织项目,分析程序中的原始数据定标格式、浮点数的表示形式和最终定点数结果,写出实验预习报告。
- 通过实验验证自己的分析正确否,总结实验中遇到的问题,根据实验报告的要求,认真撰写实验报告。
四、步骤
同实验一,将 example4.asm, vectors.asm, example4.cmd 加入到 project 中编译并加载可执行代码。
五、实验报告
- 程序说明
说明程序的结构和功能,对每条指令进行注释,写出执行结果。
; data format conve rsion and floating -point operation
.title "example4.asm"
.mmregs ;enable memory mapped registe rs
stack .usect "STACK" ,100h ;set stack section
.bss a1 ,1 ; a1
.bss a2 ,1 ; a2
.bss b1,1 ; the exp onent of floating -point a1
.bss b2,1 ; the exp onent of floating -point a2
.bss c1 ,1 ; the manti ssa of floating -point a1
.bss c2 ,1 ; the manti ssa of floating -point a2
.bss ep ,1 ; the exp onent of the floating -point product
.bss mp ,1 ; the manti ssa of the floating -point product
.bss product ,1 ; the product
.bss temp ,1 ; temporary exp
.data ;data seg
table: ;data table
.word 4*32768/10 ;a1=0.4
.word -9*32768/10 ;a2=-0.9
.def _c_int00
;
.text ;text seg
_c_int00: ;entry point
stm
;stm
stm
mvpd table ,@a1 ;(a1)=0 x3333
mvpd table+1,@a2 ;(a2)=0 x8ccd
ld @a1 ,16,A ;((a1)) <<16->A, A=0 x0033330000
exp A ;T=0 x0001
st T,@b1 ;(b1)=0 x0001
norm A ;A=0 x0066660000
sth A,@c1 ;(c1)=0 x6666
ld @a2 ,16,A ;((a2)) <<16->A, A=0 xff8ccd0000
exp A ;T=0 x0000
st T,@b2 ;(b2)=0 x0000
norm A ;A=0 xff8ccd0000
sth A,@c2 ;(c2)=0 x8ccd
call mult ;call func mult
endd:b endd ;inf loop
mult:ssbx frct ;1->FRCT
ssbx sxm ;1->SXM
ld @b1,A ;A=0 x0000000001
add @b2,A ;A=0 x0000000001
stl A,@ep ;(ep)=0 x0001
ld @c1 ,T ;T=0 x6666
mpy @c2 ,A ;A=0 xffa3d78f5c
exp A ;T=0 x0000
st T,@temp ;(temp)=0 x0000
norm A ;A=0 xffa3d78f5c
sth A,@mp ;(mp)=0 xa3d7
ld @temp ,A ;A=0 x0000000000
add @ep ,A ;A=0 x0000000001
stl A,@ep ;(ep)=0 x0001
neg A ;A=0 xffffffffff
stl A,@temp ;(temp)=0 xffff
ld @temp ,T ;T=0 xffff
ld @mp ,16,A ;A=0 xffa3d70000
norm A ;A=0 xffd1eb8000
sth A,@product ;(product)=0xd1eb, the product is -0.36
ret ;return
.end ;end of program
中断向量及存储器映射命令文件除相关文件名外与实验一相同。
2. 调试说明
总结上机调试步骤和调试情况,说明调试中遇到的问题是如何解决的。
3. 总结定点数定标的方法,总结定点数规格化为浮点数及浮点数转换为定点数的方法。
总结定点数定标的方法:
定点数定标,即确定定点数小数点的位置,如 Q0 表示无小数部分,Q15 表示 16 位小数,本实验使用 Q15.
总结定点数规格化为浮点数及浮点数转换为定点数的方法:
定点数 FIXED 转为浮点数 FLOAT(e,m),可利用 exp 指令获取指数部分 e,norm 获取规格化后的尾数部分
m,m=FIXED«e.
浮点数 FLOAT(e,m) 转为定点数 FIXED,则可将指数取负后进行 norm,向相反方向移位,FIXED=m»e.
总结实现浮点数乘法运算的方法:
浮点数乘法运算,底数相乘,指数相加,然后重新规则化以符合格式规范.
选作:完成 a1+a2=0.4+(-0.9) 的运算
主程序:
; data format conve rsion and floating -point operation
; float addition
.title "example4.asm"
.mmregs ;enable memory mapped registe rs
stack .usect "STACK" ,100h ;set stack section
.bss a1 ,1 ; a1
.bss a2 ,1 ; a2
.bss b1,1 ; the exp onent of floating -point a1
.bss b2,1 ; the exp onent of floating -point a2
.bss c1 ,2 ; the manti ssa of floating -point a1
.bss c2 ,2 ; the manti ssa of floating -point a2
.bss es ,1 ; the exp onent of the floating -point sum
.bss ms ,1 ; the manti ssa of the floating -point sum
.bss sum ,1 ; the sum
.bss temp ,1 ; temporary
.data ;data seg
table: ;data table
.word 4*32768/10 ;a1=0.4
.word -9*32768/10 ;a2=-0.9
.def _c_int00
; ------------------------------------------------------------------------------
.text ;text seg
_c_int00: ;entry point
stm
;stm
stm
mvpd table ,@a1 ;(a1)=0 x3333
mvpd table+1,@a2 ;(a2)=0 x8ccd
ld @a1 ,16,A ;((a1)) <<16->A, A=0 x0033330000
exp A ;T=0 x0001
st T,@b1 ;(b1)=0 x0001
norm A ;A=0 x0066660000
sth A,@c1+1 ;(c1+1)=0 x6666
ld @c1+1,A ; 符号扩展A=0 x0000006666
dst A,@c1 ;(c1)=0 x00006666
ld @a2 ,16,A ;((a2)) <<16->A, A=0 xff8ccd0000
exp A ;T=0 x0000
st T,@b2 ;(b2)=0 x0000
norm A ;A=0 xff8ccd0000
sth A,@c2+1 ;(c2+1)=0 x8ccd
ld @c2+1,A ;A=0 xffffff8ccd
dst A,@c2 ;(c2)=0 xffff8ccd
call summ ;call func summ
endd:b endd ;inf loop
; 与乘法程序类似的不再注释
summ: ; 加法子程序
ssbx SXM
rsbx OVM
rsbx C16
rsbx OVB
; 调整指数, 使之相同
ld @b1,A
stl A,@es ; default es
; b1 - b2 ? 0
sub @b2,A
bc nbaeq ,AEQ
bc nbagt ,AGT
; b1 < b2
neg A
stl A,@temp
; if (b2-b1 > 15) retun a2
sub #15,A
bc nrb,AGT
ld @temp ,T
ld @c1+1,A
norm A
dst A,@c1
bd nbaeq
ld @b2,A
stl A,@es ;es = b2
;b nbaeq
nbagt: ;b1 > b2
stl A,@temp
sub #15,A
bc nra ,AGT
ld @temp ,T
ld @c2+1,A
norm A
dst A,@c2
ld @b1,A
;stl A,@es ;es=b1
nbaeq: ;b1 == b2
rsbx OVA
dld @c1 ,A
dadd @c2 ,A ;c1+c2
bc nbanov ,ANOV
; exp onent shou ld by increased by 1
;st
;norm A
sfta A,-1
ld @es ,16,B
add
bc nrbov ,BOV ;exp onent overflow
sth B,@es
nbanov:
exp A
st T,@temp
ld @temp ,B
sub #16,B ;we use 0x000000XXXX instead of 0x00XXXX0000 above
stl B,@temp
norm A
sth A,@ms
bc nraeq ,AEQ ; sum == 0?
ld @temp ,16,B
add @es ,16,B
bc nrbov ,BOV ;exp onent overflow
sth B,@es
; convert back
ld @es ,A
neg A
stl A,@temp
ld @temp ,T
ld @ms ,16,A
bd nret
norm A
sth A,@sum
;b nret
nra: ; return a1
ld @b1,A
stl A,@es
ld @c1+1,A
stl A,@ms
bd nret
ld @a1 ,A
stl A,@sum
;b nret
nrb: ; return a2
ld @b2,A
stl A,@es
ld @c2+1,A
stl A,@ms
bd nret
ld @a2 ,A
stl A,@sum
;b nret
nraeq: ; return 0
ld
stl A,@ms
stl A,@es
bd nret
ld
stl A,@sum
;b nret
nrbov: ; exp onent overflow exception!
sth B,@es
;b nret
nret: ; sub program return
ret
.end