ADC0809 VHDL控制程序

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

個人博客式公衆號

用心每一天

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章