最近在做基于FPGA的仿核脉冲信号发生器,在写完部分代码之后,需要验证是否符合所预期的效果,即相邻脉冲的时间间隔符合指数分布,计数率即一定时间内的脉冲数是否符合泊松分布,于是希望用matlab进行绘图,看起来更直观。那么modelsim中的波形数据怎么导出呢?这里用的方法是将数据导出到txt文件中,再在matlab中导入。
要将波形导入txt文件,需要用到$fopen()和$fdisplay();先贴上代码,后面再解释。
integer i; integer w_file; initial begin Rst_n = 0; i = 0; #(`clk_period*20+1); Rst_n = 1; /*导出space_cnt的波形数据*/ w_file = $fopen("space_cnt.txt"); for(i=0;i<=2047;i=i+1)begin wait(pulse); #50; $fdisplay(w_file,"%d",space_cnt); if(i == 2047) $fclose(w_file); end
/* 导出Opulse_cnt的波形数据
w_file = $fopen("Opulse_cnt.txt"); for(i=0;i<=8191;i=i+1)begin #10_000; $fdisplay(w_file,"%d",Opulse_cnt); if(i == 8191) $fclose(w_file); end*/#(`clk_period*2000); $stop; end
这里的space_cnt.txt就是数据导入的文件,这个文件不用自己去新建,testbench会帮你生成好。space_cnt是数据信号线,即要导出的数据。
做脉冲间隔计数,关注的就是两个脉冲之间有多少个时钟周期,所以这里每两个脉冲检测完我只输出一个最终数据,而将计数器的计数过程选择不关心,即x。从波形可以看出,space_cnt的输出时刻比pulse的上升沿滞后了50ns,所以代码中在等待到pulse的上升沿之后,延时50ns再去将数据写入txt。注意:这里写入2048个数据,还是会有个别的数据为x,这些x在matlab读取时是读不出来的而且会阻断它后面的数据读取。所以在matlab读取之前需要将txt中的x全部替换成空。
matlab代码及结果如下: