3.3 状态机模块
状态机FSM完成自动A/D转换和数据存储,控制芯片是EPM7128。此状态机由系统时钟驱动,控制A/D转换器的转换、FIFO的复位及写数,并产生中断信号通知CPU读取数据。由于系统使用了两片AD7656,而不同芯片的个体会有差别,同一器件也会有温漂、时漂还有老化的问题,如果采用中断方式取数,很有可能会引起各个通道A/D采样率不一致并且单个通道A/D工作时采样率也不恒定。因此,可以不管BUSY信号,只需要把各段的时序留够足够的裕量就可以了,譬如AD7656的转换时间是3µs,那么,只要状态机保持CONVST至少3µs的高电平,这样就可以完全确定A/D转换的结束。这样控制器就可以不需要检测A/D的BUSY信号,同时也能很准确地保证采样速率了。
系统复位时,转换信号CONVST及FIFO复位信号MR保持低电平不变,此时不进行数据采集。系统复位后,CONVST上升沿触发转换开始,系统进入采样保持阶段。3µs后,待A/D转换结束,连续产生12个A/D读脉冲,可以依次读出12个通道的转换结果。取数的同时产生FIFO的写脉冲,可将读出的数据连续写入FIFO中。为利于CPU中处理软件的编写,CPLD中设置了一个计数器,可以进行32(2的5次方)次采样。最后发送中断信号到CPU,CPU通过DMA方式将数据全部读入内部存储器,数字滤波通过取和以后右移5位即可进行。
4.Verilog HDL描述
电子系统设计中一般遵循自上而下的设计思路,对系统进行设计、描述与仿真。考虑到模块的通用性、移植性,常常使用硬件描述语言来描述数字系统,如Verilog HDL、VHDL、AHDL语言等。其中Verilog HDL语言具有结构清晰、文法简明、功能强大、高速模拟和多库支持等优点,被近90%的半导体公司使用,成为一种强大的设计工具。
4.1 用Verilog HDL语言描述自动状态机
自动状态机有两个输入信号和七个输出信号。输入信号中CLK由CPU的输出频率提供,产生50MHz的时钟频率,RST由CPU提供,负责复位状态机。CONVST产生A/D转换器的转换启动信号;ADC_CS、ADC1_RD、 ADC2_RD分别是两个A/D转换器的片选信号以及读信号;FIFO_WR和 FIFO_MR控制FIFO的读数和复位;中断信号INT通知CPU在DMA方式下取数。程序如下:
module fsm(RST, CLK, CONVST, ADC_CS, ADC1_RD, ADC2_RD, FIFO_WR, FIFO_MR, INT);
input RST, CLK;
output CONVST, ADC_CS, ADC1_RD, ADC2_RD, FIFO_WR, FIFO_MR, INT;
reg CONVST, ADC_CS, ADC1_RD, ADC2_RD, FIFO_WR, FIFO_MR, INT;
parameter ST0=8‘b00000000, ST150=8’b10010110, ST152=8‘b10011000, ST153=8’b10011001,
ST155=8‘b10011011, ST156=8’b10011100, ST158=8‘b10011110, ST159=8’b10011111,
ST161=8‘b10100001, ST162=8’b10100010, ST164=8‘b10100100, ST165=8’b10100101,
ST167=8‘b10100111, ST168=8’b10101000, ST170=8‘b10101010, ST171=8’b10101011,
ST173=8‘b10101101, ST174=8’b10101110, ST176=8‘b10110000, ST177=8’b10110001,
ST179=8‘b10110011, ST180=8’b10110100, ST182=8‘b10110110, ST183=8’b10110111,
ST185=8‘b10111001;
reg[7:0] COUNTER;
reg[4:0] CN;
always @(posedge CLK)
if(!RST)
begin COUNTER《=0; ADC_CS《=1; ADC1_RD《=1; ADC2_RD《=1;
FIFO_WR《=1; FIFO_MR《=0; CONVST《=0; CN《=0;INT《=0; end
else if(CN》=5’b11111)
begin INT《=1; COUNTER《=0; ADC_CS《=1; ADC1_RD《=1;
ADC2_RD《=1; FIFO_WR《=1; FIFO_MR《=0; CONVST《=0; end
else
begin
if(COUNTER《8‘b11001100)
COUNTER《=COUNTER+8’b00000001;
else
begin CN《=CN+5‘b00001; COUNTER《=0; end
case(COUNTER)
ST0: begin CONVST《=1; FIFO_MR《=1; end
ST150: begin ADC_CS《=0; ADC1_RD《=0; FIFO_WR《=0; end
ST152: begin FIFO_WR《=1; ADC1_RD《=1; end
ST153: begin FIFO_WR《=0; ADC1_RD《=0; end
ST155: begin FIFO_WR《=1; ADC1_RD《=1; end
ST156: begin FIFO_WR《=0; ADC1_RD《=0; end
ST158: begin FIFO_WR《=1; ADC1_RD《=1; end
ST159: begin FIFO_WR《=0; ADC1_RD《=0; end
ST161: begin FIFO_WR《=1; ADC1_RD《=1; end
ST162: begin FIFO_WR《=0; ADC1_RD《=0; end
ST164: begin FIFO_WR《=1; ADC1_RD《=1; end
ST165: begin FIFO_WR《=0; ADC1_RD《=0; end
ST167: begin FIFO_WR《=1; ADC1_RD《=1; end
ST168: begin FIFO_WR《=0; ADC2_RD《=0; end
ST170: begin FIFO_WR《=1; ADC2_RD《=1; end
ST171: begin FIFO_WR《=0; ADC2_RD《=0; end
ST173: begin FIFO_WR《=1; ADC2_RD《=1; end
ST174: begin FIFO_WR《=0; ADC2_RD《=0; end
ST176: begin FIFO_WR《=1; ADC2_RD《=1; end
ST177: begin FIFO_WR《=0; ADC2_RD《=0; end
ST179: begin FIFO_WR《=1; ADC2_RD《=1; end
ST180: begin FIFO_WR《=0; ADC2_RD《=0; end
ST182: begin FIFO_WR《=1; ADC2_RD《=1; end
ST183: begin FIFO_WR《=0; ADC2_RD《=0; end
ST185: begin FIFO_WR《=1; ADC2_RD《=1; ADC_CS《=1; CONVST《=0; end
endcase
end
endmodule
4.2 仿真图形
图4为状态机复位时的仿真图形。由图可以看出,当按下复位键时,A/D转换信号CONVST保持为低电平,A/D转换器不采集数据。同时,FIFO复位信号FIFO_MR也保持低电平不变,可将FIFO中的数据清空。当复位信号变高后,在外部时钟CLK的第一个上升沿,CONVST电平升高,开始A/D转换(存在时延)。