一、实验目的和任务
学习用状态机对A/D转换器ADC0809的采样控制电路的实现。
二、设计代码(或原理图)、仿真波形及分析
1、ADC控制电路代码
module ADC0809(D,CLK,EOC,RST,ALE,START,OE,ADDA,ADDB,ADDC,Q,LOCK_T,CLK_OUT);
input[7:0] D;
input CLK,RST;
input EOC;
output reg CLK_OUT;
output ALE;
output START,OE;
output ADDA,ADDB,ADDC,LOCK_T;
output[7:0] Q;
reg ALE,START,OE;
parameter s0=0,s1=1,s2=2,s3=3,s4=4;
reg[4:0] cs, next_state;
reg[7:0] REGL;
reg[5:0] clki;
reg LOCK;
always @(posedge CLK)
if(clki>10)
begin
CLK_OUT=~CLK_OUT;
clki=0;
end
else
clki=clki+1;
always @(cs or EOC) begin
case(cs)
s0:begin ALE=0; START=0 ; OE=0; LOCK=0;
next_state <=s1; end
s1:begin ALE=1; START=1 ; OE=0; LOCK=0;
next_state <=s2; end
s2:begin ALE=0; START=0 ; OE=0; LOCK=0;
if(EOC==1'b1) next_state =s3;
else next_state =s2; end
s3:begin ALE=0; START=0 ; OE=1; LOCK=0;
next_state =s4; end
s4:begin ALE=0; START=0 ; OE=1; LOCK=1;
next_state <= s0; end
default :begin ALE=0; START=0 ; OE=0; LOCK=0;
next_state =s0; end
endcase
end
always @(posedge CLK or posedge RST ) begin
if(RST)cs<=s0;
else cs <=next_state;end
always @(posedge LOCK)
if (LOCK) REGL <= D;
assign ADDA=0;
assign ADDB=0;
assign ADDC=0;
assign Q=REGL;
assign LOCK_T=LOCK;
endmodule
2、ADC控制电路仿真截图
3、ADC控制电路的仿真分析
结合代码分析,如图所示,每一个时钟上升沿都使状态机进入下一个状态,刚开始的ALE和START高电位表明状态机经过了状态s1,在给EOC输入高电位前,给D所写的值121并没有送进电路,因而Q输出为0,这是因为从状态s2到s3需要EOC信号为高电位才能进入状态s3,否则会一直停留在状态s2,当给EOC输入高电位后,此时D值为220,OE高电位处说明经过了状态s3,而其后LOCK_T输出高电位,说明变量LOCK为高电平,即经过了状态s4,此时会把D的值给读走,同时Q输出220,即D的值。
4、ADC控制电路的状态机截图及分析
结合代码分析,如图所示,在s0状态之时,当CLK信号处于上升沿,则进入s1状态;在s1状态之时,当CLK信号处于上升沿,ALE、START输出为1,则进入s2状态;在s2状态之时,当CLK信号处于上升沿,ALE、START下拉为0,如果EOC输入为1则进入s3状态,否则仍然处于s2状态;在s3状态之时,OE输出为1,同时进入s4状态;在s4状态之时,OE、LOCK输出为1,并且重新回到s0状态;如果执行RST复位操作,无论当前处于什么状态,都回到s0状态。
标签:begin,04,FPGA,CLK,LOCK,OE,ALE,START,ADC From: https://blog.51cto.com/u_13726704/6017520