QuartusII中添加激烈波形的数据
目前越来越多的通信系统采用FPGA进行硬件设计,而FPGA设计中非常重要而频繁进行的一环是仿真。
仿真能将硬件设计中的逻辑和时序问题及早暴露出来,以便工程师改进设计或调整方案。
仿真是硬件设计流程中较为耗时和烦琐的一环。
主要原因有:仿真的激励波形必须由设计者自行创建,测试波形必须人工输入;仿真的结果正确与否必须由设计者自行判断,很难自动化;时序仿真前必须对整个设计做耗时的全编译;仿真过程是计算机软件模拟芯片对测试输入的逻辑处理,通常计算时间消耗很大。
在这4个步骤中,第2步依赖于设计者的经验和特定设计逻辑的复杂程度,第3、4步则由计算机完成,基本上是个定数,只有第一步还具有提高效率的空间。
我们在进行实际的FPGA 设计处理信号时,针对第1步有大量仿真数据输入的需求,在研究Quartus II激励波形文件的格式后,编程设计了一种将输入数据转化为激励波形的方法。
QuartusII中仿真流程
现在Altera公司的器件均可由Quartus II进行设计。
Quartus II除了能完成语法检查、综合、布局布线、生成配置文件和时序分析的设计全流程,还自带仿真功能(Quartus II Simulator)。
Quartus II中时序仿真的流程图如图1所示。
vwf文件全称是矢量波形文件(Vector Waveform File),是Quartus II中仿真输入、计算、输出数据的载体。
一般设计者建立波形文件时,需要自行建立复位、时钟信号以及控制和输入数据、输出数据信号等。
其中工作量最大的就是输入数据的波形录入。
比如要仿真仅1KB 的串行输入数据量,则手工输入信号的波形要画8000个周期,不仅费时费力而且容易出错。
如果能找到一种简易的将输入数据转化为激励波形的方法,则可以极大提高仿真速度,减少手工操作时间,因此需要研究vwf文件的格式。
vwf文件格式分析
既然vwf文件是仿真数据的载体,那么必需首先弄清楚该文件存放数据的格式,再针对这种格式做一定的变换得到所需要的波形。
以时钟信号clk为例,vwf文件以如下方式存储和表示该信号。
● 说明部分
SIGNAL(“clk”)
{
_TYPE = NINE_LEVEL_BIT;
SIGNAL_TYPE = SINGLE_BIT;
WIDTH = 1;
LSB_INDEX = -1;
DIRECTION = INPUT;
PARENT = “”;
}
● 数据部分
TRANSITION_LIST(“clk”)
{
NODE
{
REPEAT = 1;
NODE
{ REPEAT = 3000;
LEVEL 0 FOR 50.0;
LEVEL 1 FOR 50.0;
}
}
}
在第2部分数据说明中,LEVEL 0表示低电平,LEVEL 1表示高电平,FOR后面跟着是持续时间,REPEAT表示重复次数。
手工描画的波形在存储时均被转化为此形式表示,这种形式也会被一一对应地表现为波形。
其实这就是一种文本方式描述数据的格式,一些其他波形文件格式(例如.tbl文件)也是与此相似的。
串行数据转化为vwf文件的方法
在用软硬件接收和处理通信线路上某种协议的数据时,通常都会取得一定量的典型数据做试验使用,这些典型数据就会被用作仿真的输入数据。
多数通信线路传输串行数据流,硬件系统接收的输入信号是串行的。
将试验数据逐比特地转化为激励波形就是建立测试激励的主要工作。
由上一部分对vwf文件格式分析可知,数据流会被映射成电平的持续时间,而持续时间是时钟周期的整数倍。
数据流可以看作是0、1比特流的单向延伸,确定了0、1流即可将对应的持续时间计算出来,从而给出波形的文本描述。
因此只要能将试验数据的0、1流识别出来,再以vwf文件格式为基准生成对应文本,就能将输入数据自动地转化为激励波形。
数据文件到串行激励波形的编程实现
识别数据的0、1游程算法(C或C++)如下。
// rl即为所识别的0、1比特游程,fpin是输入数据文件的指针,datin是无符号字符datin=fgetc(fpin);
tmp=datin&0x80;
rl=0;
n =0;
while(!feof(fpin)) {
for(i=n;i<8;i++){
if (((datin<<i)&0x80) == tmp)
rl++;
else{
n=i;
break;
}
}
while ((i==8) && (!feof(fpin))) {
datin=fgetc(fpin);
for(i=0;i<8;i++){
if (((datin<<i)&0x80) == tmp)
rl++;
else{
n=i;
break;
}
}
}
// tmp=0时,rl为0游程;反之rl为1游程
剩下的就是将游程转换为.vwf文件格式输出。
// clk_t设为一个时钟周期对应的ns数或参照vwf文件说明的单位
// fpout为输出文本文件的指针
time_last=rl*clk_t;
if(tmp)
fprintf(fpout,” LEVEL 1 FOR %.1f; ”,time_last);
else
fprintf(fpout,” LEVEL 0 FOR %.1f; ”,time_last);
rl=0;
if (tmp)
tmp=0x00;
else
tmp=0x80;
} //此括号对应第一个while()
最后将输出的文本复制到.vwf文件相应的信号数据部分即可。
总结
对于并行数据输入,该方法除了形式上要麻烦一些并无本质的不同。
另外,在硬件逻辑中可以很容易用串并转换将串行数据变换为并行数据,在仿真中并行数据输入问题可以等效地转换为串行数据输入。
我们在进行网络数据HDLC协议解析的FPGA设计中,对试验数据进行输入仿真时使用了该方法,加快了仿真的速度。
各位老师好!我最近用matlab的fdatool设计了fir滤波器,并将设计的滤波器移植到了fpga 上面,并且用了quartus软件进行了波形仿真,但觉得波形仿真生成的16进制数据不直观就想放到matlab上面来图形显示滤波的波形,最后在网上找了一些m函数进行波形文件tcl 到matlab可执行的文件的转换,但是问题又来了波形仿真文件上面的16进制数据是有符号
之分的,但是转换到matlab上执行的时候matlab没有区分数据的符号,导致图形的正部分和负部分有一个很大的振幅差。
想请问坛里的老师具体要怎么修改m函数,自己也是matlab 新手,向各位学习了。
m函数代码
clear all;
%以只读方式打开.tbl文件
fid = fopen('D:\fir24.sim.tbl','r'); %波形文件我是放在了D盘
data = fscanf(fid,'%s');
fclose(fid);
b = find(data == '='); %找出“=”的下标
number = length(b); %取得文件长度
j = 0;
for i = 1:number
if data(b(i) - 1) == '0'%滤除说明中的“=”
j = j+1;
%取出幅度值,数据为十六进制数
c_s(j,1) = data(b(i) + 1);
c_s(j,2) = data(b(i) + 2);
end
end
d_s = hex2dec(c_s); %将十六进制数转化为十进制数
stem(d_s);。