1、系统描述
DSP 系统从I/O 端口将要处理的数据不断读入, 进行处理之后再从I/O 端口输出. I/O输入端口设计地址为 0x0001 和0x0002; I/O 输出端口设计在0x0003 处.为了在CCS 软仿真环境下进行实验, 需要将I/O 端口连接到相应的输入输出数据文件上. 而输入数据我们用Matlab 产生, 借此演示Matlab 和CCS 协同工作的情形.
首先实现一个基本的调幅系统. 即将输入的两路数据, 一路是载波, 另外一路是基带信号, 进行双边带调制, 然后再输出.
将 Matlab 产生的数据转换为CCS 的Probe 工具所接受的格式.
CCS 的Probe 工具所接受的格式可以是多种的.例如:
16 进制格式
十进制带符号整数格式
其中文件的第一行含义是: MagicNumber Format StartingAddress PageNum Length
MagicNumber Fixed at 1651.
Format: 是一个1 到4 的整数, 分别表示hexadecimal, integer, long, 或 float.格式. 整数范围是-32768~+32767.(-2^15 ~ 2^15-1).
StartingAddress: 表示数据块的起始地址
PageNum: 表示数据块所在的存储器. 0: 程序空间; 1: 数据空间, 2: I/O 空间.
Length: 表示数据块中样值数.
该行也可使用默认值 1651 1 0 0 0 来表示, 在数据调入时再指定存放位置.
2、电脑环境
Windows 7或Windows XP
MATLAB R2014a
CCS 2.0
3、正弦系数表的 Matlab 实现
设载波为 500Hz 的正弦波, 基带信号为50Hz 正弦波, 采样率为10000Hz. 现在要求产生 30ms 的信号. 在Matlab 中实现双边带调制的仿真, 并将载波和基带信号转换为CCS 可接受的格式. 编程如下:
Fs=10000;
fc=500;
F=50;
t=1/Fs:1/Fs:0.03;
carrier=1000*sin(2*pi*fc*t);
signal = 1000*cos(2*pi*F*t);
A=fix(carrier');
C=fix(signal');
save('a.dat','A','-ascii');
save('c.dat','C','-ascii');
运行以上 Matlab 程序后得到存放载波数据矩阵A 的文件a.dat 以及存放基带信号数据矩阵C 的数据文件c.dat. 形式如下:
修改这两个文件的头部, 使之成为符合CCS 文件I/O 的要求格式.:
4、利用 CCS 和DSP 编程实现双边带调制
在解决了 Matlab 与CCS 的数据接口问题之后, 就可以着手编写DSP 汇编程序来处理信号了。.asm程序如下:
.mmregs
.def _c_int00
carrier .set 1
signal .set 2
DSBout .set 3
.data
BUFFER1 .word 0x0
BUFFER2 .word 0x0
BUFFER3 .word 0x0
.text
_c_int00:
STM #BUFFER1, AR2;
STM #BUFFER2, AR3;
STM #BUFFER3, AR4;
STM #2990,BRC ;BRC=299 块循环300次
RPTB LOOP-1
NOP
NOP
PORTR carrier,*AR2
PORTR signal,*AR3
MPY *AR2,*AR3,A
STL A, -8, *AR4
PORTW *AR4,DSBout
LOOP:
NOP
B LOOP
.end
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
}
(1)建立工程
(2)由于这里我们使用了 I/O 空间, 所以需要配置I/O 空间, 使得0x0000 到0x0003 地址是可读写的. 如图:
然后将这 3 个I/O 空间地址与3 个文件相连接. 即
在 CCS 中编译, 单步运行程序, 观察程序无误之后, 在第27 行NOP 处加入断点和探针工具, 并打开Data Memory 窗口和I/O Memory 窗口, 以便观察.
操作步骤如动画所示:
(3)在 CCS 的File—>File I/O… 打开文件输入输出对话框.
单击按钮 Add File 添加输入数据文件. 添加前面用matlab 产生并对文件头部作了修改的数据文件a.dat 和c.dat, 添加之后出现了2 个数据文件的控制对话框. 如图.(Wrap Around 选项可不选, 这样CCS 将数据文件中的数据读到结尾时就不再重新从头读起)。
然后再添加输出数据文件. 在File Output标签下, 单击Add file按钮. 出现对话框, 将输出文件格式选为 Interger 的dat 文件.在文件名栏中写入新文件名.
此时, 第3 个数据文件输出控制对话框也出现了. 其中的显示“0”表示现在向该文件输出了0 个数据.
(4)们将数据文件和探针点连接起来. 在File Input标签下单击Add Probe Point按钮, 单击选中 Probe point 框中的第22行.再从 Connect 下拉菜单中选择连接到的数据文件名. CCS 允许探针连接到数据文件或各种寄存器, 存储器以及外部数据文件上, 从而从那里获取数据或将数据输出到那里. 选择数据文件a.dat, 然后单击Add 按钮, 这样就将a.dat 文件连接到探针上了.同理, 将c.dat 以及DSP-DSBout 文件连接到同一探针上.具体操作见(5)后的动画。
(5)下面的任务是告诉 CCS, 从探针处输入的各个数据文件的数据将输入到哪里, 以及从探针处输出的数据取自哪里.
首先将 a.dat 的数据输入到端口carrier(I/O:0x0001)上. Length 域输入1, 表示程序每次经过探针处的时候从a.dat 文件中读取1 个数据, 并送入端口carrier(I/O :0x0001).同理, 将c.dat与端口signal(I/O: 0x0002)联系起来.在 File Output 标签下再将数据输出文件DSP-DSBout 与输出端口DSBout(I/O: 0x0003)联系起来.具体操作如下面动画。
(6)就回到 CCS 主界面. 单步执行程序到探针处, 观察I/O 端口和数据内存中数据的变化. 也可以动画方式执行程序, 也可将断点去除, 按F5 执行程序完毕.下图是动画执行程序到第300 次循环的结果.
注意到输出数据文件控制对话框中显示 300, 表示输出了300 个数据到文件DSBout 中.
5、用CCS 的图示化功能直接看到输出波形
(1)乘性调制信号输出参数设置:
乘性调制信号输出波形:
(2)载波信号和基带信号及双边带调制输出参数设置:
载波信号和基带信号及双边带调制输出波形:
(3)频谱参数设置:
频谱分析波形: