其实题目应该叫Verilog仿真后如何导入Matlab分析,但是我搜索的时候用的关键词就是上面的,所以怎么也搜索不出来,最后还是大佬搭救了我一把。
思路就是写一个时序逻辑,每个周期将要保存的数据写入文本文件,之后再用Matlab读取文本文件分析。
首先是Verilog的代码,假设有8个信号需要保存,名字是data1-8,时钟为clk,数据有效指示为data_en,即当data1-8有数据时,data_en为1,而data1-8无数据时,data_en为0。
之后我们根据data_en为1来保存数据,data_en的下降沿来停止保存数据,代码如下:
reg data_en_neg_edge = 1'b0; reg data_en_r1 = 1'b0; reg data_en_r2 = 1'b0; always @ (posedge clk_timer) begin data_en_r1 <= data_en; data_en_r2 <= data_en_r1; end always @ (posedge clk_timer) begin if ((data_en_r2 == 1'b1) && (data_en_r1 == 1'b0)) data_en_neg_edge <= 1'b1; end integer fid1; integer fid2; integer fid3; integer fid4; integer fid5; integer fid6; integer fid7; integer fid8; initial begin fid1 = $fopen("1.txt","w"); fid2 = $fopen("2.txt","w"); fid3 = $fopen("3.txt","w"); fid4 = $fopen("4.txt","w"); fid5 = $fopen("5.txt","w"); fid6 = $fopen("6.txt","w"); fid7 = $fopen("7.txt","w"); fid8 = $fopen("8.txt","w"); end always @ (posedge clk) begin if(data_en == 1) begin $fwrite(fid1,"%h\n",data1); $fwrite(fid2,"%h\n",data2); $fwrite(fid3,"%h\n",data3); $fwrite(fid4,"%h\n",data4); $fwrite(fid5,"%h\n",data5); $fwrite(fid6,"%h\n",data6); $fwrite(fid7,"%h\n",data7); $fwrite(fid8,"%h\n",data8); end else if(data_en_neg_edge ==1) begin $fclose(fid1); $fclose(fid2); $fclose(fid3); $fclose(fid4); $fclose(fid5); $fclose(fid6); $fclose(fid7); $fclose(fid8); end end
把这段代码加入仿真文件,仿真之后就会在项目文件夹中找到8个txt文件,内容便是保存下来的信号。
得到txt之后,便可以导入到matlab中分析,我这里由于数据宽度不统一,因此不能使用load函数,而由于数据以16进制存储,因此需要以字符串形式导入,在导入之后再进行转换。
在我这里,导入之后8路数据需要拼接一下,之后才能进行傅里叶变换,用了reshape函数。
顺带一提,由于matlab早期版本中,函数只能在单独的一个.m文件中定义,因此下面的代码会报错。我运行下面代码的版本是2018b,仅供参考。
file_list = dir('*.txt'); data = []; for i=1:1:length(file_list) data = [data;get_content(file_list(i).name)]; disp(file_list(i).name) end data_in_one_line = reshape(data,1,numel(data)); simple_fft_analyzer(data_in_one_line); function simple_fft_analyzer(data_in_one_line) figure; plot(1:1:length(data_in_one_line),data_in_one_line); figure; y = fft(data_in_one_line); plot(1:1:length(y(2:end)),abs(y(2:end))); end function content = get_content(file_path) file_id = fopen(file_path); raw_content = textscan(file_id,'%s'); fclose(file_id); raw_content = raw_content{1}; line_number = length(raw_content); content = zeros(1,line_number); for i=1:1:line_number content(i)=hex2dec(raw_content{i}); end end