8.4 ADC0809接口电路及程序设计
ADC0809与FPGA接口电路 ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。 ADC0809的精度是8位,转换时间约为100µs,含锁存控制的8路开关,输出有三态缓冲控制,单5V电源供电。
FPGA与ADC0809接口电路原理图
ADC0809与FPGA接口电路设计 FPGA_IO1~8接收ADC0809 8位数数据; FPGA_IO9接收ADC0809 转换结束信号EOC; FPGA_IO10~12 为ADC0809提供8路模拟信号开关的3位地址选通信号(ADD-A~C); FPGA_IO13 为ADC0809提供地址锁存控制信号ALE:高电平时把三个地址信号送入地址锁存器,并经译码器得到地址输出,以选择相应的模拟输入通道; 接下页
FPGA_IO14为ADC0809提供输出允许控制信号ENABLE:电平由低变高时,打开输出锁存器,将转换结果的数字量送到数据总线上; FPGA_IO15为ADC0809提供启动控制信号START:一个正脉冲过后A/D开始转换; FPGA_IO16为ADC0809提供时钟信号信号CLOCK; IN0~IN7:8路模拟信号输入端口; Vref+和Vref-:参考电压输入端口;
ADC0809 VHDL采样控制程序设计
ADC0809的工作时序图
START是转换启动信号,一个正脉冲过后A/D开始转换;ALE是3位通道选择地址(ADDC、ADDB、ADDA)信号锁存信号。 当模拟量送至某一输入端(如IN-0或IN-1)等,由3位地址信号选择,而地址信号由ALE锁存。 EOC是转换情况状态信号,当启动转换约100μs后,EOC产生一个负脉冲,以示转换结束。 在EOC的上升沿后,且输出使能信号ENABLE为高电平,则控制打开三态缓冲器,把转换好的8位数据送至数据总线。 至此ADC0809的一次转换结束
ADC0809采样控制状态图 FPGA器件可以根据其采样时序用状态机来描述采样控制过程,其状态转换关系 如左图所示。
ADC0809 VHDL采样控制程序
ADC0809采样控制程序电路符号
程序的端口信号与中间信号 entity ADC0809 is port ( d : in std_logic_vector(7 downto 0); --ADC0809输出的采样数据 clk,eoc : in std_logic; --clk为系统时钟,eoc为ADC0809转换结束信号 clk1,start, ale,en: out std_logic; --ADC0809控制信号 abc_in :in std_logic_vector(2 downto 0); --模拟选通信号 abc_out :out std_logic_vector(2 downto 0); --ADC0809模拟信号选通信号 q : out std_logic_vector(7 downto 0)); --送至8个并排数码管信号 end ADC0809; architecture behav of ADC0809 is type states is ( st0,st1, st2, st3, st4,st5,st6); --定义各状态的子类型 signal current_state, next_state:states:=st0; signal regl :std_logic_vector(7 downto 0); --中间数据寄存信号 signal qq:std_logic_vector(7 downto 0); begin
状态转换模块(com ) case current_state is when st0=>next_state<=st1;ale<='0';start<='0';en<='0'; when st1=>next_state<=st2;ale<='1';start<='0';en<='0'; when st2=>next_state<=st3;ale<='0';start<='1';en<='0'; when st3=> ale<='0';start<='0';en<='0'; if eoc='1' then next_state<=st3; --检测EOC的下降沿 else next_state<=st4; end if; when st4=> ale<='0';start<='0';en<='0'; if eoc='0' then next_state<=st4; --检测EOC的上升沿 else next_state<=st5; when st5=>next_state<=st6;ale<='0';start<='0';en<='1'; when st6=>next_state<=st0;ale<='0';start<='0';en<='1';regl<=d; when others=> next_state<=st0;ale<='0';start<='0';en<='0'; end case;
分频模块(clock) clock:process(clk) --对系统时钟进行分频,得到ADC0809转换工作时钟 begin if clk'event and clk='1' then qq<=qq+1; --在clk1的上升沿,转换至下一状态 if QQ="01111111" THEN clk1<='1'; current_state <=next_state; elsif qq<="01111111" then clk1<='0'; end if; end process; q<=regl; abc_out<=abc_in; end behav;