ADC0809 VHDL控制程序
ADC0809簡介
Connection Diagrams
Block Diagram
模擬信道選擇
工作過程
首先輸入3位地址,並使ALE=1,將地址存入地址鎖存器中。此地址經譯碼選通8路模擬輸入之一到比較器。START上升沿將逐次逼近寄存器復位。下降沿啓動 A/D轉換,之後EOC輸出信號變低,指示轉換正在進行。直到A/D轉換完成,EOC變爲高電平,指示A/D轉換結束,結果數據已存入鎖存器,這個信號可用作中斷申請。當OE輸入高電平時,輸出三態門打開,轉換結果的數字量輸出到數據總線上。
--功能:基於VHDL語言,實現對ADC0809簡單控制
--說明:ADC0809沒有內部時鐘,需外接10KHz~1290Hz的時鐘信號,這裏由FPGA的系統時鐘(50MHz)經256分頻得到clk1(195KHz)作爲ADC0809轉換工作時鐘
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
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:process(current_state,eoc) --規定各種狀態的轉換方式
begin
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;
end if;
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;
end process;
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 if;
end process;
q<=regl; abc_out<=abc_in;
end behav;
NUM459
個人博客式公衆號
用心每一天