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

218 篇文章 55 订阅
该文详细介绍了使用FPGA(EP1C6)和高速ADC(AD9220)设计的波形信号采集系统。系统采用8MHz外部晶体振荡器,利用FPGA内部的FIFO进行数据缓存。通过仿真展示了FPGA如何生成ADC的工作时钟、通道选择信号以及数据采集和写入FIFO的过程。最终的仿真结果显示系统能正常工作,数据在适当时候从FIFO输出。
摘要由CSDN通过智能技术生成

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提供给AD9220
begin
	 if(!glrn)
	 begin
     clk<=1'b1;
     end	
else begin
          if((count>=10)&(count<=30))
          clk<=1'b0;
     else 
          clk<=1'b1;     
     end		
end

always @(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 

endmodule


A28-38

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值