9220:【数据采集】基于FPGA通用数据采集测试系统

1.软件版本

quartusii12.1

2.本算法理论知识

本系统设计采用ADI公司的高速模数转换器AD9220实现波形信号的采集,AD9220最高采样速率可达10 MHz,采用外部晶体振荡器8 MHz,FPGA内部通过采样实现波形存储。本系统设计采用直流耦合,0~5 V的输入方式。采用内部2.5 V参考电压。由于系统垂直分辨率只需255级,故采用AD9220的高8位。

其外部电路原理图如下所示:

通过AD9220将采集到的数据送入FPGA,其仿真结果如下所示:

下一步就是将采集到的数据送入FIFO进行缓存,FIFO我们采用FPGA进行设计实现。

我们实用IP核进行设计,其设置如下所示:

后面的全部默认设置。可以得到如下的结果。

我们单独对FIFO进行仿真。其仿真结果如下所示。

前面数据一直输入,但是没有输出,当wirte为高电平的时候数据开始输出。

系统总体结构图如下所示:

其仿真结果如下所示:

通过上面的仿真图,我们可以看到,系统正常工作的时候,由FPGA提供clk_ad9220时钟让ADC能够正常工作,此时ADC将采样得到的数字信号给FPGA,然后在FPGA内部通过FIFO在输出,具体的输出信号是dataout信号。

其电路原理图的设计如下所示:

FPGA我们选用的是EP1C6。其具体管脚图如下所示:

AD9220和FPGA连接的电路原理图如下所示:

这个系统的电路原理图如下所示:

3.部分核心代码

//本代码是通过FPGA控制AD9220进行数据的采集module ad9220( glrn, fosc, start, wrfifo, clk, sel, sel1, sel2, fifod, data );input glrn;//复位信号input fosc;//FPGA工作时钟信号input start;//数据采集开始信号input[7:0] data;//ADC采集得到的数据信号output wrfifo;output clk;//FPGA送给ADC的时钟信号output[1:0] sel;//ADC通道选择信号output sel1;//ADC通道选择信号output sel2;//ADC通道选择信号output[7:0] fifod;//FPGA将ADC的数据信号初步处理后供FPGA内部使用的数字信号reg wrfifo;reg clk;//FPGA送给ADC的时钟信号reg[7:0] fifod;//FPGA将ADC的数据信号初步处理后供FPGA内部使用的数字信号reg[6:0]count;reg[3:0]mark;reg d_wrfifo;reg[7:0]f_data;reg[1:0]d_sel;reg d_sel1;reg d_sel2;always @(posedge fosc)//通过时钟的上边沿进行采样begin f_data<=data; if((glrn==1'b0)|(start==1'b1))//计数器复位 count<=7'd0; else begin if(count==160)//计数器开始工作 count<=7'd0; else count<=count+1'b1; end end//以下是FPGA控制AD9220的过程 always @(posedge fosc or negedge glrn)//产生ADC工作时钟,由FPGA提供给AD9220begin if(!glrn) begin clk<=1'b1; endelse begin if((count>=10)&(count<=30)) clk<=1'b0; else clk<=1'b1; endendalways @(posedge fosc or negedge glrn) //通道处理begin if(!glrn) begin d_sel <=2'b00; d_sel1<=1'b1; d_sel2<=1'b0; end else begin if(count==35) begin if((d_sel1==1'b1)&(d_sel2==1'b0)) begin if(d_sel==2'b11) begin d_sel1<=1'b0; d_sel2<=1'b1; d_sel<=2'd0; end else d_sel<=d_sel+1'b1; end if((d_sel1==1'b0)&(d_sel2==1'b1)) begin if(d_sel==2'b11) begin d_sel1<=1'b0; d_sel2<=1'b0; d_sel<=2'd0; end else d_sel<=d_sel+1'b1; end end end end assign sel =d_sel;assign sel1=d_sel1;assign sel2=d_sel2; //开始数据采集 always @(posedge fosc or negedge glrn)begin if(!glrn) begin fifod<=8'b00000000; end else begin if(count==40)//间隔40是为了满足ADC采集速度的需要 fifod<=f_data; else if(count==80)//间隔40是为了满足ADC采集速度的需要 fifod<=f_data; end end always @(posedge fosc or negedge glrn)begin if(!glrn) begin wrfifo<=1'b0; end else begin if((count>40)&(count<45)) wrfifo<=1'b1; else if((count>80)&(count<85))// wrfifo<=1'b1; else wrfifo<=1'b0; end end endmoduleA28-38

相关推荐

相关文章