当前位置:文档之家› ADC0809驱动FPGA实现的verilog程序

ADC0809驱动FPGA实现的verilog程序

reg START,OE,ALE,ADDA;
reg[7:0] DATA_R;
reg[4:0] CS,NS;
parameter IDLE=5'b00001,START_H=5'b00010,START_L=5'b00100,CHECK_END=5'b01000,GET_DATA=5'b10000;
always @(posedge clk500K)
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;
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;
若参考电压为0-1V
(1-0)/255≈0.0039V精度自然高了。。可测量范围小了。
状态机要写成3段式的(这是最标准的写法),即
...
always @(posedge clk or negedge rst_n)
...
current_state <= next_state;
...
always @ (current_state ...)
/*FPGA实现的程序:(verilog)
贴子回复于:2008-4-27 15:26:01*/
module AD0809(clk500K, //脉宽(至少100ns)
rst_n,
EOC, //约100us后EOC变为高电平转换结束
START, //启动信号,上升沿有效(至少100ns)
OE, //高电平打开三态缓冲器输出转换数据
...
case(current_state)
...
s1:
if ...
next_state = s2;
...
...
always @(posedge clk or negedge rst_n)
...
else
a <= 1'b0;
c <= 1'b0;
c <= 1'b0; //赋默认值
case(current_state)
参考电压为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同理)
s1:
a <= 1'b0; //由于上面赋了默认值,这里就不用再对b
、c赋值了(b、c在该状态为0,不会产生锁存器,下同)
s2:
b <= 1'b1;
s3:
c <= 1'b1;
default:
...
...
GET_DATA:
begin
OE<=1; //高电平打开三态缓冲器输出转换数据
DATA_R<=DATA;//提取转换数据
START<=0;
ALE<=0;
end
default:
begin
OE<=0;
START<=0;
ALE<=0;
ADDA<=0;
end
endc位逼近的方法产生数据的。。
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
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
相关主题