随着CPLD/FPGA被越来越多应用于通信、DSP、微机等系统,对设计软件的仿真功能提出了更高的要求。MAX+PLUS II是
Altera公司推出的功能强大的设计及仿真软件,提供了从多种方法输入、编译一直到仿真的一系列配套功能,其中手工设计仿真输入节点只适用于输入信号比较简单的情况,对于象随机噪声这样的复杂信号就无能为力了。MATLAB是Mathworks公司推出的一种面向科学与工程计算的语言软件,它集科学计算、自动控制、信号处理、神经网络、图像处理等于一体,可以方便地产生各种信号,进行各种变换、统计。它的这些特点正好可以弥补MAX+PLUS II在仿真功能上的缺陷。因此,可以利用MATLAB来产生MAX+PLUS II复杂仿真的输入信号。
MATLAB与MAX+PLUS II联合产生仿真信号流程如下。
(1)先在MATLAB中产生原始信号,并转换为2/16进制序列;
(2)利用编写的MATLAB函数按一定格式生成向量文件(*.vec,纯文本文件);
(3)在MAX+PLUS II中,打开要仿真的FPGA源文件,设置为“当前工程”并作编译;
(4)打开simulator,选“File\Inputs/Outputs”,输入在MATLAB中生成的向量文件名,按“确定”
按钮生成*.scf文件;
(5)进行仿真。
在MAX+PLUS II中的仿真输入文件中有一种文本形式的向量文件(Vector File),这种文件是用一定格式的文本来描述仿真信号,可以方便地用任何纯文本编辑器来书写文件,定义仿真时间长度,用相对/时间单位来定义复杂的输入信号。
MATLAB提供了两个基本的函数rand与randn用于产生随机数,在统计工具箱中还提供了产生各种分布随机数的函数,如正态分布和泊松分布等等。可以在MATLAB中用编程的方法产生一系列噪声数据,并且用向量文件的格式将数据保存在向量文件中,供MAX+PLUS II仿真时调用。下面以服从(0,1)间均匀分布的随机信号为例加以说明。
产生随机信号的noise.m文件如下。
fid=fopen('file.vec','w');
fprintf(fid,'UNIT ns;\n');
fprintf(fid,'
START 0;\n');
fprintf(fid,'STOP 1000;\n');
fprintf(fid,'INTERVAL 40;\n')
fprintf(fid,'INPUTS d1 d2 d3;\n');
fprintf(fid,'PATTERN\n');
random=rand(25,1);
for i=1:25
if random(i)>=7/8
fprintf(fid,'1 1 1\n');
elseif random(i)>=6/8&random(i)<7/8
fprintf(fid,'1 1 0\n');
elseif random(i)>=5/8&random(i)<6/8
fprintf(fid,'1 0 1\n');
elseif random(i)>=4/8&random(i)<5/8
fprintf(fid,'1 0 0\n');
elseif random(i)>=3/8&random(i)<4/8
fprintf(fid,'0 1 1\n');
elseif random(i)<=2/8&random(i)>3/8
fprintf(fid,'0 1 0\n');
elseif random(i)<=1/8&random(i)>2/8
fprintf(fid,'0 0 1\n');
elseif random(i)<=1/8
fprintf(fid,'0 0 0\n');
end;
end;
fprintf(fid,';');
fclose('all');
fopen()函数的功能是以写入方式打开一个file.vec文件,用于存储随机信号数据,fprintf()函数用来向打开的文件中写数据;rand(25,1)函数用来产生25个服从(0,1)间均匀分布的随机信号;程序中for循环部分用来对随机信号进行量化编码,量化是采用均匀量化,编码是3位二进制编码。该例在MAX+PLUS II中的一个仿真波形如图所示。
衡量一个
通信系统的主要指标是其抗各种干扰的能力,而实际信号中的噪声并不能定量测量,所以可以人为加入参数已知的正态分布随机噪声来定量地测出某个系统的误码率。将本文叙述的方法应用在数字通信系统的误码率测量中,较好地衡量了系统的抗随机噪声的能力,收到了很好的效果。
参考文献
1 范影乐.MATLAB仿真应用详解.人民邮电出版社.2001
2 顺天.MATLAB程序设计语言.西安
电子科技大学出版社.1998
3 MaxplusII Datebook