/*******************************************************************************
模块名称:AD-FIFO控制模块。
模块功能:控制AD采样,及控制采样数据存入FIFO。
输入端口:SCLK-- 模块时钟输入。(50M)
RSET-- 模块复位信号,复位后需重新使能,上升沿开始工作,高有效。
EN -- 使能信号,上升沿开始工作,高有效。
END -- 采样结束信号,上升沿开始工作,高有效。
输出端口:AD_OE-- ADS807输出使能信号,使能输出高电平。
AD_CLK_EN-- ADS807时钟使能信号,使能输出高电平。
FIFO_CLK_EN-- FIFO时钟使能信号,使能输出高电平。
********************************************************************************/
module AD_FIFO(SCLK,RES,EN,END,OTR,BEFF,AD_OE,REN,AD_CLK_EN,FIFO_CLK_EN);
parameter [1:0] state_START=2'b00,state_WAITING=2'b01,state_COUNTING=2'b10,state_END=2'b11;
input RES;
input SCLK;
input EN;
input END;
input OTR;
output BEFF;
output AD_OE;
output REN;
output AD_CLK_EN;
output FIFO_CLK_EN;
reg BEFF;
reg AD_OE;
reg REN;
reg AD_CLK_EN;
reg FIFO_CLK_EN;
reg star_flag;
reg otr_flag;
reg [3:0] counter;
reg [1:0] STATE;
always@(posedge SCLK)
begin
if(RES == 1'b1) /*复位,开始标志置零*/
begin
STATE <= state_START; //状态机为初始状态
star_flag <= 1'b0;
end
else if(EN == 1'b1) /*模块使能*/
begin
star_flag <= 1'b1; //开始标志置’1’
end
if(OTR == 1'b0)
begin
BEFF <= 1'b0;
if(otr_flag == 1'b1)
begin
otr_flag <= 1'b0;
star_flag <= 1'b1;
end
end
if(star_flag == 1'b1) //模块开始工作
begin
if(OTR == 1'b1)
begin
otr_flag <= 1'b1;
BEFF <= 1'b1;
AD_OE <= 1'b0; //ADS807输出禁能
REN <= 1'b0;
AD_CLK_EN <= 1'b0; //ADS807时钟禁能
FIFO_CLK_EN <= 1'b0; //FIFO时钟禁能
STATE <= state_START; //状态机为初始状态
star_flag <= 1'b0; //开始标志置零
end
else
begin
case(STATE)
state_START: //'state_START' 状态,初始化各端口
begin
counter <= 4'h0; //计数器清零
AD_OE <= 1'b0; //ADS807输出禁能
REN <= 1'b0;
AD_CLK_EN <= 1'b0; //ADS807时钟禁能
FIFO_CLK_EN <= 1'b0; //FIFO时钟禁能
STATE <= state_WAITING;
end
state_WAITING: //'state_WAITING'状态,等待ADS807转化延时
begin
if(counter == 4'h6) //延时结束
begin
counter <= 4'h0; //计数器清零
AD_OE <= 1'b1; //ADS807输出使能
REN <= 1'b1;
AD_CLK_EN <= 1'b1; //ADS807时钟使能
FIFO_CLK_EN <= 1'b1; //FIFO时钟使能
STATE <= state_COUNTING;
end
else //延时未结束,继续延时
begin
counter <= counter+4'h1;
STATE <= state_WAITING;
end
end
state_COUNTING: //'state_COUNTING'状态,等待采样结束
begin
if(END == 1'b1) //采样结束
begin
AD_OE <= 1'b0; //ADS807输出禁能
REN <= 1'b0;
AD_CLK_EN <= 1'b0; //ADS807时钟禁能
FIFO_CLK_EN <= 1'b0; //FIFO时钟禁能
STATE<=state_END;
end
else //采样未结束,等待采样结束
begin
STATE<=state_COUNTING;
end
end
state_END: //采样未结束,开始标志置零
begin
STATE <= state_START; //状态机为初始状态
star_flag <= 1'b0; //开始标志置零
end
endcase
end
end
end
endmodule