DSP

DSP实验

2019-07-13 11:24发布

DSP实验

实验一 集成开发环境 CCS 应用基础

一、目的

  1. 通过创建一个简单的应用工程,初步熟悉 CCS 的使用,了解程序开发调试过程。
  2. 掌握汇编语言源程序的基本框架和编写方法,了解 CCS 的工程结构以及编译连接的基本过程。
  3. 了解 ST0、ST1、PMST 的标志位对计算结果的影响以及计算过程对标志位的影响。

二、内容

  1. 在 TMS320C5402 软件仿真模型上,建立 example1.cmd 命令文件,配置 COFF 段结构,分配存储空间。
  2. 运行一段程序,分别将与 CPU 运算相关的控制位 SXM、OVM、C16、FRCT 置 1 或清 0,分析程序的执行结果。观察与 CPU 运算相关的标志位 TC、C 的变化情况。

三、要求

  1. 本实验要求在 PC 机的集成开发环境 Code Composer Studio(简称 CCS)及 TMS320C5402 软件仿真模型上进行。
  2. 实验程序:example1.asm, vectors.asm,example1.cmd
  3. 实验前要作好充分准备,包括读懂实验程序,分析程序中的原始数据、中间结果和最终结果,了解调试步骤及调试方法等。写出实验预习报告。
  4. 通过实验验证自己的分析正确否,总结实验中遇到的问题,根据实验报告的要求,认真撰写实验报告。

实验任务:

四、实验步骤

  1. 建议在逻辑盘 D: 下,建立以自己学号命名的子目录,(如:D:DXK03 学号)以后自己的实验程序都在此目录下运行。并将文件 example1.asm, vectors.asm,example1.cmd 拷贝该文件夹内。(说明:实验室的机器 C 盘都已保护,ti 目录在 C 盘, 所以学生的目录及文件不能建在 c: imyprojects 下)。
    这里写图片描述
  2. 运行 CCS setup,选择 C5402 Device Simulator, 进入 CCS,Project –> New 建立一个新的项目 example1,Project –> Add Files to Project,将 example1.asm, vectors.asm,example1.cmd 加入该项目。
    这里写图片描述
  3. 在 Project–>Option 中加入适当的编译和连接的选项。
    这里写图片描述
    这里写图片描述
  4. Build 整个项目,产生可执行文件 example1.out。
  5. File->Load Program,装载可执行文件 example1.out,并运行和调试。

五、实验结果和提示

  1. 建立项目,并加入文件
    运行 C5402 Device simulator,选择 Project→New 菜单项,建立一个新的项目 example1.pjt,并选择 Project→add files to new project 菜单项,加入文件 example1.asm, vectors.asm,example1.cmd
    这里写图片描述
  2. 编译和连接
    1. 编译:选择 Project–>Build Option,在 Compile 表单的 Category 列表中,选择 basic 选项,并设置 generate debug info 为 full symbolic debug 选项。
    2. 连接:选择 Project–>Build Option,在 linker 表单中的 autoinit mode 选项中选择 no autointialization 模式,在 Output Filename 中输入 debug example1.out,在 Code Entry Point 中输入 main,Map Filename 中输入 example1.map,然后保存选项设置。
    3. 选择 Project→Build 构建整个项目,产生可执行文件 example1.out。
      这里写图片描述
    4. 选择 File->Load Program,装载可执行文件 example1.out。
  3. 观察存储器映象 Map 文件,选择 File→Open 打开 example1.Map 文件,可观察下列各项内容。将下列信息与 cmd 文件中的设置进行比较,理解 cmd 文件和连接器的关系。
    1. 存储器的配置情况:页面 0(PAGE 0) 为程序空间,页面 1(PAGE 1) 为数据空间。给出了各存储空间的名称。
    2. 共配置了 5 个段:
      程序文本段. text :位于 0 页,起始地址 0xe000,存储区长度 0x0017
      段. data :位于 0 页,起始地址 0xe0000,存储区长度 0x007e
      向量段. vectors :位于 0 页,起始地址 0x0080,存储区长度 0x007e
      未初始化数据段. bss :位于 1 页,起始地址 0x0000,存储区长度 0x0000
      堆栈段 STACK :位于 1 页,起始地址 0x0080,存储区长度 0x0010
    3. 全局符号:共 18 个符号,给出了它们在存储器中的位置,如符号. bss 在存储器中的位置为 0x00600。
      这里写图片描述
  4. 输出文件 example1.out 的运行和调试
    1. 运行程序:将可执行文件装载到 simulator 中,选择 Debug→Run 或按 F5 键运行程序,按 shift F5 键可中止程序的运行;选择 Debug→Step into 或按 F8 键可实现程序的单步执行。
      这里写图片描述
    2. 设置断点:把光标移到某一行,按 F9 键,这一行将会以红 {MOD}高亮显示,表示在该行加了一个断点。
    3. 观察和修改存储器单元的内容,点击 CCS 操作界面左侧调试工具栏 图标,出现寄存器窗口,在该窗口查看存储器的地址,选择 View→memory 或点击 CCS 操作界面左侧调试工具栏 图标,在弹出的菜单中输入存储器地址,可观察存储器的内容。如存储器地址为 0x2000 中内容为 0x000A。修改源汇编程序中数据段内容,可查看存储器单元内容的变化。如把 a1 的值由 10 改为 1,求出和的结果将变为 0x001A。
      这里写图片描述
      这里写图片描述
      这里写图片描述
  5. 与运算相关的标志位
    1. SXM
      当 SXM 置 1 时,数据读写按照符号扩展的方式,因此 A=0xff ffff ff80
      当 SXM 置 0 时,数据读写为无符号扩展的方式,因此 A=0x00 0000 ff80
    2. OVM
      当 OVM 置 1 时,数据运算的结果将按照 32 位饱和,因此 A=0xff 8000 0000
      当 OVM 置 0 时,数据运算不饱和,因此 B=0x00 fffe 0000
    3. C16
      双 16 位计算比较
    4. FRCT
      乘法移位比较
    5. TC
      比特测试比较
    6. C
      进位、借位和大小比较
    7. 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 #stack +10h, SP ;set stack ;stm #0x01ff , PMST ;relocate Interrupt Vector Table stm #0x0000 , SWWSR ;no software wait for all memory ;================================================ stm #0x2000 ,AR2 ;#0x2000 ->AR2 st #0xff80 ,*AR2 ;#0xff80 ->(AR2) ;================================================ ;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 #0x8000 , 16, A ;#0x8000 <<16->A, A=0 xff80000000 add #0x8000 , 16, A ; 负向溢出, A=0 xff80000000 , OVA=1, ST0=0 x1c00 ;------------------------ rsbx OVM ;OVM 置0, 数据运算不饱和, ST1=0 x2900 ld #0x7fff , 16, B ;#0x7fff <<16->B, B=0 x007fff0000 add #0x7fff , 16, B ;B=0 x00fffe0000 , OVB=1, C=0, ST0=0 x1600 ;================================================ ;test C16 ;watch B to unde rstand 2-16 mode ssbx OVM ;1->OVM,ST1=0x2b00 ld #0x0001 , 16, A ;#0x0001 <<16->A, A=0 x0000010000 add #0x7fff , A ;A=0 x00017fff dst A, *AR2 ;A->(AR2), (0 x2000)=0 x00017fff ld #0x0001 , 16, A ;#0x0001 <<16->A, A=0 x0000010000 or #0xffff , A ;A=0 x000001ffff 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 #0x1234 , 16, A ;#0x1234 <<16->A, A=0 x0012340000 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 链接命令及存储器映射文件: /* * Description: * Memory Allocation (TMS320C54x -ASM Source Code for Fixed Point Implementation) */ 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 才成功。

实验二 数据格式转换及浮点运算实验

一、目的

  1. 了解定点数的定标方法,了解浮点数的表示方法。
  2. 掌握定点数规格化为浮点数及浮点数转换为定点数的方法。
  3. 学习利用定点 DSP 芯片完成浮点数运算的程序编写方法。
  4. 进一步掌握程序编译、连接、运行和调试的基本过程,掌握在 CCS 环境下调试程序。

二、内容

  1. 编写浮点乘法程序,完成 a1×a2=0.4×(-0.9) 的运算。
  2. 分为三步进行:将定点数规格化为浮点数;进行浮点乘法运算;将浮点数转换成定点数。
  3. 在程序中保留 10 个数据存储单元,其中:
    a(被乘数) a+1(乘数)
    b(被乘数的指数) b+1(乘数的指数)
    c(被乘数的尾数) c+1(乘数的尾数)
    ep(乘积的指数) mp(乘积的尾数)
    product(乘积) temp(暂存单元)
  4. 两浮点数相乘:尾数相乘,指数相加。
  5. 选作:完成 a1+a2=0.4+(-0.9) 的运算

三、要求

  1. 本实验要求在 PC 机的集成开发环境 Code Composer Studio(简称 CCS)及 TMS320C5402 软件仿真模型上进行。
  2. 实验参考程序:example4.asm, vectors.asm, example4.cmd
  3. 实验前要作好充分准备,可参考教材 “DSP 原理及应用”(邹彦主编)165 页 5.8 节例 5.8.1 编写程序,组织项目,分析程序中的原始数据定标格式、浮点数的表示形式和最终定点数结果,写出实验预习报告。
  4. 通过实验验证自己的分析正确否,总结实验中遇到的问题,根据实验报告的要求,认真撰写实验报告。
    四、步骤
    同实验一,将 example4.asm, vectors.asm, example4.cmd 加入到 project 中编译并加载可执行代码。

五、实验报告

  1. 程序说明 说明程序的结构和功能,对每条指令进行注释,写出执行结果。
; 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 #stack +100h, SP ;set stack pointer ;stm #0x01ff , PMST ;store IPTR stm #0x0000 , SWWSR ;no software wait for all memory 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 #stack +100h, SP ;set stack pointer ;stm #0x01ff , PMST ;store IPTR stm #0x0000 , SWWSR ;no software wait for all memory 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 #0xffff ,T ;norm A sfta A,-1 ld @es ,16,B add #1,16,B 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 #0,A stl A,@ms stl A,@es bd nret ld #0,A stl A,@sum ;b nret nrbov: ; exp onent overflow exception! sth B,@es ;b nret nret: ; sub program return ret .end