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