FPGA控制AD转换原理及程序

FPGA控制AD转换原理及程序
FPGA控制AD转换原理及程序

基于FPGA的AD控制模块

(2010-07-23 18:00:42)

转载▼

分类:技术

标签:

杂谈

这是夏天小学期做的第一个课程设计。题目是《模拟信号处理》,实质上就是做一个对ADC0809的控制器,控制AD转换并读取出转换结果,将结果显示为10进制数。

ADC0809是单通道输入,8位输出的模/数转换器。参考电压为2.560V时最小分辨率为0.020V。关于ADC0809的时序控制图如下:

信号说明(对ADC0809而言):rd是输入信号,功能是读转换结果使能,当rd为高电平时数据端输出为高阻态,低电平时数据端输出数据。wr是输入信号,功能是转换开始与结果

清除,当wr由低变高时,AD转换开始,当wr由高变低时,转换结果清除,rd信号有效时wr必须为高才是有效数据。int是输出信号,功能是AD转换完成的中断信号,高AD转换完成后,ADC0809自动输出int信号,即int由高变低,转换过程中,int一直为高电平。clk 为输入时钟信号。此外还有一个片选信号CS,低电平有效,当CS信号有效时,ADC0809

允许工作。

AD转换的时序控制最优方案是使用有限状态机(FSM),在有int中断信号时,使用状态

机控制开始后被动等待int下降沿到来,然后进入读数据状态。有些情况下int中断信号是

悬空的没有使用,这时需要主动控制转换等待时间。ADC0809的典型转换时间是135us。主动等待的效率很低,且时序配合一定要准确。

以下是状态机的参考程序:

moduleadcfsm(int_adc,clk,reset,rd_adc,wr_adc);

outputrd_adc,wr_adc;

inputint_adc,clk,reset;

regrd_adc,wr_adc;

reg[1:0]present;

parameterreset_ad=2'h0,start_ad=2'h1,wait_ad=2'h2,read_ad=2'h3;

always @(posedgeclk or negedge reset)

if(!reset)present<=reset_ad;

else if(rd_adc==1&wr_adc==0)present<=start_ad;

else if(rd_adc==1&wr_adc==1&int_adc==0)present<=read_ad;

else if(rd_adc==1&wr_adc==1)present<=wait_ad;

else present<=reset_ad;

always @(present)

begin

case(present)

reset_ad:beginrd_adc<=1;wr_adc<=0;end

start_ad:beginrd_adc<=1;wr_adc<=1;end

wait_ad:beginrd_adc<=1;wr_adc<=1;end

read_ad:beginrd_adc<=0;wr_adc<=1;end

endcase

end

endmodule

AD转换后的结果为8位二进制数据,即00H~FFH,要输出到数码管上显示,需要将二进制码转换为8421BCD码。根据ADC0809的资料手册,输出显示为1位整数与3位小数,即0.000V~5.100V。设计为一个四位十进制输出,其中千位为整数位,百位十位个位分别对应三个小数位。二进制转8421BCD码的转换使用一个函数实现。输出数据为16位二进制数,输入数据为2组16位二进制数。这2组16位数分别是AD转换后的高四位与低四位对应得出电压值(参考ADC0809手册)。函数参考程序如下:

function [15:0]numb_bcd;

input [15:0]a,b;

reg [3:0]temp1,temp2,temp3,temp4;

reg [15:0]temp;

begin

temp=a+b;

temp1=(temp/1000)%10;

temp2=(temp/100)%10;

temp3=(temp/10)%10;

temp4=temp%10;

numb_bcd[15:12]=temp1;

numb_bcd[11:8]=temp2;

numb_bcd[7:4]=temp3;

numb_bcd[3:0]=temp4;

end

endfunction

注:算法是很普通的一个算法,即输入数据和分别做如下运算,除1000后取10的余数做千位数,除100后取10的余数做百位数,除10后取10的余数做十位数,直接取10的余数即个位数,四位数分别放入4位寄存器。

显示的控制就很简单了,动态扫描。输入为8421BCD码,输出字型码即可。这里不列出详细程序。

关于这个控制模块的一些问题。这个控制模块最后的显示精度主要取决于两方面:一是ADC0809本身的转换精度,因为ADC0809自身只有0.020V的分辨率,小于这个分辨率的电压变化即形成误差;二是参考电压的设定,按技术手册,参考电压为2.560V时给出了全部的高低四位电压对照表,但实际中参考电压可能不是2.560V,高于此电压时,输入电压越大,显示电压与真实电压相差越大,且显示电压一直是小于输入电压的。解决第二点的方案,一是修正参考电压为2.560V,二是按实际参考电压修正转换结果高低四位对照表。其中第二种方案的工作量很大,不推荐。

相关主题
相关文档
最新文档