利用 CCS 和DSP 编程实现双边带调制(查表法)

利用 CCS 和DSP 编程实现双边带调制(查表法)

CCS介绍:

CCS的全称是Code Composer Studio,它是美国德州仪器公司(Texas Instrument,TI)出品的代码开发和调试套件。TI公司的产品线中有一大块业务是数字信号处理器(DSP)和微处理器(MCU),CCS便是供用户开发和调试DSP和MCU程序的集成开发软件。

问题描述:

在ccs下实现一个基本的调幅系统,即将输入的两路数据, 一路是载波, 另外一路是基带
信号, 进行双边带调制, 然后再输出。

电脑环境:

1、Windows XP SP3(Windows10 下 VMware12 Pro中的虚拟机)
2、Code Composer Studio2.0 点这里下载,密码:fyij

步骤:

1、首先我们用matlab生成所需要的载波和基带信号的正弦系数表,请参见博客matlab生成正弦系数表,修改这两个文件的头部, 使之成为符合CCS 文件I/O 的要求格式。
载波信号的正弦系数表:
这里写图片描述
基带信号的正弦系数表:
这里写图片描述
2、首先将CCS设置为软件仿真模式(simulate),步骤如下gif动图所示。
这里写图片描述
3、打开ccs新建工程,并向工程中加入asm.cmd文件和ASMtest6.asm,步骤如下gif动图所示。CMD文件的作用请见博客CCS中CMD文件解析
这里写图片描述
asm.cmd文件代码如下:

MEMORY
{
 PAGE 0 :
   STACK  :  origin = 0x0080,  length = 0x0080  /* stack space */
   XFER   :  origin = 0x0100,  length = 0x0300  /* reserve 0x300 words for comm kernel */       
   XFERHDR:  origin = 0x0400,  length = 0x003a  /* reserve 0x3a words for kernel header */
   FIFO   :  origin = 0x043a,  length = 0x0046  /* reserve 0x46 words for fifo */      
   VECTORS:  origin = 0x0480,  length = 0x0080  /* interrupt vectors */
   INT_PM_DRAM :  origin = 0x0500,  length = 0x1b00  /* on-chip ram 5402 */
 PAGE 1: 
   SCRATCH     :  origin = 00060h,  length = 00020h  /* page-0 scratch-pad */    
   INT_DM_RAM  :  origin = 0x2000,  length = 0x2000  /* on-chip ram 5402 */      
}

SECTIONS
{
  .text  : > INT_PM_DRAM PAGE 0 

  .stack : > INT_DM_RAM  PAGE 1
  .bss   : > INT_DM_RAM  PAGE 1
  .data  : > INT_DM_RAM  PAGE 1
}

ASMtest6.asm文件代码如下:

    .mmregs         ;允许寄存器的符号表示
    .def _c_int00   ;定义程序入口标号
carrier .set    1   ;载波输入端口
signal  .set    2   ;基带信号输入端口
DSBout  .set    3   ;DSB调制输出端口

        .data       ;数据段 根据cmd文件,从2000H开始
BUFFER1 .word   0x0 ;(2000H)
BUFFER2 .word   0x0 ;(2001H)
BUFFER3 .word   0x0 ;(2002H)

    .text           ;程序段开始
_c_int00:
    STM #BUFFER1, AR2;
    STM #BUFFER2, AR3;
    STM #BUFFER3, AR4;

    STM #299,BRC            ;BRC=299 块循环300次
                            ;因为输入数据有300个样值
    RPTB LOOP-1             ;块循环开始处
    NOP                     ;在此加入探针,进行数据文件输入输出
    NOP
    PORTR   carrier,*AR2    ;读入载波数据
    PORTR   signal,*AR3     ;读入基带数据
    MPY *AR2,*AR3,A         ;处理数据,相乘
                            ;乘积结果的最大值为1000×1000
                            ;为6位16进制有符号数,其中2位进入了AH
                            ;为了保证输出, 需将结果右移8bit,再保存
    STL A, -8, *AR4         ;右移8bit并存放数据
    PORTW   *AR4,DSBout     ;输出数据
                            ;并再次读入下一个数据
LOOP:
    NOP                 ;完成任务后程序进入空操作
    B LOOP                  
    .end

4、由于这里我们使用了 I/O 空间, 所以需要配置I/O 空间, 使得0x0000 到0x0003 地址是可读
写的,步骤如下gif动图所示。
这里写图片描述
5、然后将这 3 个I/O 空间地址与3 个文件相连接。即在 CCS 中编译,按F10单步运行程序。步骤如下gif动图所示。
这里写图片描述
6、观察程序无误之后,打开Data Memory 窗口和I/O Memory 窗口,以便观察。步骤如下gif动图所示。
这里写图片描述
7、在第21 行NOP 处加入断点和探针工具,进行数据文件输入输出,步骤如下gif动图所示。
这里写图片描述
8、在 CCS 的File->File I/O… 打开文件输入输出对话框,单击按钮 Add File 添加输入数据文件. 添加前面用matlab 产生并对文件头部作了修改的数据文件a.dat 和c.dat, 添加之后出现了2 个数据文件的控制对话框。如图,(Wrap Around 选项可不选,这样CCS 将数据文件中的数据读到结尾时就不再重新从头读起)。步骤如下gif动图所示。
这里写图片描述
9、然后再添加输出数据文件。在File Output标签下,单击Add file按钮,出现对话框,将输出
文件格式选为 Interger 的dat 文件,在文件名栏中写入新文件名。步骤如下gif动图所示。
这里写图片描述
注意, 第3 个数据文件输出控制对话框也出现了. 其中的显示“0”表示现在向该文件输出了0 个数据。

10、接下来的任务是将数据文件与探针点连接起来,即告诉CCS 在探针点处将数据从相
应文件中读入,并将相应数据输出给对应的数据文件。步骤如下gif动图所示。
这里写图片描述
11、完成后单击 OK 确定,这样就回到 CCS 主界面,单步执行程序到探针处,观察I/O 端口和数据内存中数据的变化,也可以动画方式执行程序,也可将断点去除, 按F5 执行程序完毕。
下图是执行程序到第33 次循环的结果。
这里写图片描述
这里写图片描述
12、利用CCS 的图示化功能直接看到输出波形。为了观察更长时间,我们可以将循环次数增
加,同时将File I/O 对话框中Input File 标签下两个输入文件的循环读入的选项“Wrap Around”选中即可。步骤如下gif动图所示。
这里写图片描述
这里写图片描述
这里写图片描述
13、利用CCS 的图示化功能直接看到功率谱。
这里写图片描述

总结

通过这次DSP作业,学习了如何使用ccs进行纯软件仿真。

猜你喜欢

转载自blog.csdn.net/tang_chuanlin/article/details/80511668
CCS