作者:数字站
图1 开发环境
Matlab生成二进制波形文件
Matlab对应程序如下所示,200KHz采样率生成2KHz的正弦波,最后将生成的数据以二进制的形式写入waveform_bit.txt文件中。
f1=2000; %频率为2KHz Fs=200000;%采样频率为200KHz N=16; %量化位数 %% 产生并量化信号 t=0:1/Fs:1; s=sin(2*pi*f1*t);%产生2KHz正弦波 s=s/max(abs(s));%归一化处理 Q_s=round(s*(2^(N-1)-1));%16比特量化 %% 绘制时域波形 t=0:1/Fs:100/Fs;t=t*1000; %设置显示数据范围 t_in_s=Q_s(1:length(t)); figure(1); subplot(111) plot(t,t_in_s);%显示滤波之前的波形数据 xlabel('时间(ms)');ylabel('幅度(V)');title('2kHz信号时域波形'); %% 将波形数据以二进制形式输出到文件中,便于后续TestBentch读取; fid=fopen('D:\dome\ad7606\ad7606\matlab\waveform_bit.txt','w'); for i=1:length(Q_s) B_s=dec2bin(Q_s(i)+(Q_s(i)<0)*2^N,N); for j=1:N if B_s(j)=='1' tb=1; else tb=0; end fprintf(fid,'%d',tb); end fprintf(fid,'\r\n'); end fprintf(fid,';'); fclose(fid);
生成波形如下所示,横坐标的单位忽略,不重要。
图3 生成的二进制文件
工程仿真
Altera开发使用Quartus和Modelsim联合仿真,对应的TestBentch如下所示,使用readmemb函数读取waveform_bit.txt文件中前DATA_NUM个16位二进制数据,然后在busy下降沿后输出,给AD7606八个通道输入相同数据。
`timescale 1 ns/1 ns //--############################################################################################### //--# //--# File Name : test //--# Designer : 数字站 //--# Tool : Quartus 2018.1 //--# Design Date : 2024.11.3 //--# Description : //--# Version : 0.0 //--# Coding scheme : UTF-8(If the Chinese comment of the file is garbled, please do not save it and check whether the file is opened in GBK encoding mode) //--# //--############################################################################################### module test(); localparam CYCLE = 20 ;//系统时钟周期,单位ns,默认10ns; localparam RST_TIME = 10 ;//系统复位持续时间,默认10个系统时钟周期; reg clk = 'd1 ;//系统时钟,100MHz; reg rst_n = 'd1 ;//系统复位,高电平有效; reg busy = 'd0 ;//转换完成指示信号,下降沿有效; reg frstdata = 'd0 ;//指示采集到的第一个数据; reg [15 : 0] adc_din = 'd0 ;//AD7606所采集到的十六位数据信号; wire cs ;//AD7606片选信号,读数据时拉低; wire rd ;//AD7606读使能信号,读数据时拉低,下降沿时AD7606将数据发送到数据线上,上升沿时可以读出数据; wire reset ;//AD7606复位信号,高电平有效,每次复位至少拉高50ns; wire [2 : 0] os ;//AD7606过采样模式信号,默认不使用过采样; wire convst ;//AD7606采样启动信号,无效时高电平,采样计数器完成时拉低两个时钟; //待测试的模块例化 top u_top ( .clk ( clk ),//系统时钟,50MHz; .rst_n ( rst_n ),//系统复位,低电平有效; .busy ( busy ),//转换完成指示信号,下降沿有效; .frstdata ( frstdata ),//指示采集到的第一个数据; .adc_din ( adc_din ),//AD7606所采集到的十六位数据信号; .cs ( cs ),//AD7606片选信号,读数据时拉低; .rd ( rd ),//AD7606读使能信号,读数据时拉低,下降沿时AD7606将数据发送到数据线上,上升沿时可以读出数据; .reset ( reset ),//AD7606复位信号,高电平有效,每次复位至少拉高50ns; .os ( os ),//AD7606过采样模式信号,默认不使用过采样; .convst ( convst ) //AD7606采样启动信号,无效时高电平,采样计数器完成时拉低两个时钟; ); initial begin forever #(CYCLE/2) clk = ~clk;//生成本地时钟50M end //产生复位信号 localparam DATA_NUM = 400; reg [15:0] stimulus[1:DATA_NUM]; integer Pattern; initial begin $readmemb("waveform_bit.txt",stimulus);//从外部TX文件(waveform_bit.txt)读入数据作为测试激励; Pattern = 1; #1; rst_n = 1'b0; #(CYCLE*RST_TIME); rst_n = 1'b1; repeat(20)@(posedge clk); repeat(DATA_NUM)begin @(posedge convst); busy <= 1'b1; repeat(30)@(posedge clk); busy <= 1'b0; @(negedge rd); adc_din <= stimulus[Pattern]; Pattern <= Pattern + 1; @(posedge clk); end repeat(20)@(posedge clk);//延迟20个时钟周期; $stop; end endmodule
为了让readmemb函数正确读取文件,请将waveform_bit.txt文件放到ad7606\quartus\prj\simulation\modelsim这个路径下,如下所示。虽然readmemb函数可以指定路径,但是Modelsim联合仿真会失败,所以直接将文件放在Modelsim指定路径下最保险。
图4 waveform_bit.txt文件存放路径
当Quartus和Modelsim联合设置完成后,打开工程后如下操作,使用Modelsim联合仿真。
图5 联合仿真
首先将modelsim自动加载的信号删除,如下所示。
图6 删除信号
如下所示,依次点击File,Load,Macro File…加载之前保存的波形文件。
图7 加载波形数据
如下所示,选择wave.do波形文件。
图8 打开wave.do文件
然后重新运行仿真文件,如下所示。
图9 重新运行仿真
运行结果如下所示,紫色信号为采集的波形数据,由于8个通道输入相同数据,因此每轮采集数据相同。
图10 整体时序
上电后delay_cnt计数结束后,首先拉高reset八个时钟周期复位ad7606,然后状态机回到空闲状态,且将rst_flag拉高表示已经复位过ad7606了。
图11 复位时序
如下所示,当delay_cnt计数结束且rst_flag为高电平时,之后把convst拉低三个时钟,等待busy下降沿后,产生片选cs和读使能rd信号,在rd上升沿依次读取八个通道的输入数据。
图12 采集数据时序
如下所示,片选cs和读使能rd在rdata_cnt等于2时拉低,在rdata_cnt等于6时拉高,同时采集adc_din的数据。
图13 采集数据
仿真到此结束,有兴趣可以使用matlab生成多组数据,然后在不同通道输入不同波形数据,则可以看到各个通道采集的数据。
注意Vivado版本Test文件的readmemb函数路径必须使用”/”,否则读取数据会失败,如下所示。
图14 波形文件路径
上板测试
工程综合完毕后,如下所示,依次点击tools,Signal Tap Logic Analyzer打开Signal Tap II抓取接口时序。
图15 打开Signal Tap II
开发板接上下载器并且上电后,如下所示,点击Setup,然后加载sof文件并下载。
图16 下载程序
设置convst上升沿作为触发条件,然后点击单次触发,如下所示。
图17 单次触发
采集时序如下所示:
图18 采集数据
如下所示,第一个comvst第一个上升沿在第0个采样点的位置,第二个上升沿在第500个采样点的位置,而采样时钟频率为100MHz,计算可得convst频率为200KHz,也就是采样率200KHz。
图19 采样时序
如下所示,当检测到busy后,开始产生片选和读使能,在读使能的上升沿采集通道转换后的数据。由于开发板的AD7606引脚处于悬空状态,电压大约为1.7V,转换成数字信号的数据为(1.7/5)*2^15 = 11141 = 16’h2B85,与下面采集的数据也大致差不多。
图20 采集数据时序
其余几个通道采集的数据如下,都基本相等,为16’h2EC0左右。
图21 八个通道数据时序
如下所示,使用黄色跳线帽将通道0与GND短接,其余七个通道依旧悬空。
图22 短接通道零引脚
然后Signal Tap II单次采集数据,结果如下所示,通道0采集的数据为0,其余通道采集的数据依旧大致保持不变。
图23 采集数据
接口时序验证结束,可以在公众号后台回复“AD7606并行接口驱动程序“(不包括引号)即可获取工程,包含Quartus和Vivado工程。
文章来源:数字站