本设计在FPGA中用AHDL语言编写了对FIFO复位及读写总体控制程序,如下:
BEGIN
DEFAULTS
fifo_wclk=gnd;fifo_rclk=gnd;
trig_clr=vcc;fifo_/wen=vcc;
fifo_/ren=vcc;fifo_/reset=vcc; //控制器默认状态,FIFO读写无效
END DEFAULTS;
IF workstate==0 THEN //通道采集关闭
fifo_/wen=vcc; //关闭FIFO写使能
……//FIFO读时钟由ARM提供
ELSIF (workstate==1) THEN //通道采集开启
fifo_/ren=gnd;
fifo_/wen=gnd; //FIFO读写使能同时有效
……
另一种为正常触发方式,即,首先在触发信号到来前FIFO存储一段触发前的数据并不断刷新,等待触发信号到来,这既是预触发。触发信号到来后FIFO停止刷新前端预触发数据,直接存储采样数据;当触发信号没到来是系统则一直等待触发。如下:
if (clk'event and clk='1') then
if fifodepth >="0010000000" and trig ='0' then
cntrl<='1';
elsif fifodepth >="0010000000" and trig ='1' then
cntrl<='0';
else
cntrl<='0';
end if;
……
程序中,cntrl信号是读时钟控制信号。当cntrl=0时,控制关闭FIFO读时钟,当cntrl=1时,FIFO的读写时钟相同。由程序可以看出,FIFO首先直接写入128个数据(暂定为FIFO深度的10%),此时FIFO读时钟关闭;当FIFO写入数据达到或超过128个时,打开读时钟,此时FIFO中存入一个数的同时也读出一个数,FIFO已存入的128个数据将不断被刷新;若信号已经触发时,这时FIFO没有读时钟,只有写时钟,也就是说FIFO处于只写的状态,进行数据存储。这样就实现了预触发。