ADC0809驱动FPGA实现的verilog程序.doc
文本预览下载声明
/*FPGA实现的程序:(verilog)
贴子回复于:2008-4-27 15:26:01*/
module AD0809(clk500K, //脉宽(至少100ns)
rst_n,
EOC, //约100us后EOC变为高电平转换结束
START, //启动信号,上升沿有效(至少100ns)
OE, //高电平打开三态缓冲器输出转换数据
ALE, //高电平有效,选择信道口
ADDA, //因为ADDB,ADDC都接地了,这里只有ADDA为变量
DATA, //转换数据
DATA_R);
output START,OE,ALE,ADDA;
input EOC,clk500K,rst_n;
input[7:0] DATA;
output[7:0] DATA_R;
reg START,OE,ALE,ADDA;
reg[7:0] DATA_R;
reg[4:0] CS,NS;
parameter IDLE=5b00001,START_H=5b00010,START_L=5b00100,CHECK_END=5b01000,GET_DATA=5b10000;
always @(posedge clk500K)
case(CS)
IDLE:
NS=START_H;
START_H:
NS=START_L;
START_L:
NS=CHECK_END;
CHECK_END:
if(EOC)
NS=GET_DATA;
else
NS=CHECK_END;
GET_DATA:
NS=IDLE;
default:
NS=IDLE;
endcase
always @(posedge clk500K)
if(!rst_n)
CS=IDLE;
else
CS=NS;
always @(posedge clk500K)
case(NS)
IDLE:
begin
OE=0;
START=0;
ALE=0;ADDA=1;
end
START_H:
begin
OE=0;
START=1; //产生启动信号
ALE=1;
ADDA=1;//选择信道口IN0
end
START_L:
begin
OE=0;
START=0;
ALE=1;//启动信号脉宽要足够长,在启动的时候ALE要一直有效
end
CHECK_END:
begin
OE=0;
START=0;
ALE=0;
end
GET_DATA:
begin
OE=1; //高电平打开三态缓冲器输出转换数据
DATA_R=DATA;//提取转换数据
START=0;
ALE=0;
end
default:
begin
OE=0;
START=0;
ALE=0;
ADDA=0;
end
endcase
endmodule
ad0809是根据逐位逼近的方法产生数据的。。
参考电压为0-5V的话。以0809八位255的转换精度每一位的电压值为(5-0)/255≈0.0196V
设输入电压为X则:
X-27*0.0196=0则AD7=1否则AD7=0。
X-26*0.0196=0则AD6=1否则AD6=0。
。
。
。
X-20*0.0196=0则AD0=1否则AD0=0。
(27指2的7次方。26-------20同理)
若参考电压为0-1V
(1-0)/255≈0.0039V精度自然高了。。可测量范围小了。
状态机要写成3段式的(这是最标准的写法),即
...
always @(posedge clk or negedge
显示全部