文章出處

一、實驗目的

學習用狀態機實現A/D轉換器ADC0809的采樣控制電路。

二、實驗內容

利用Quartus實現A/D轉換器ADC0809的采樣控制電路狀態機設計;給出仿真波形。最后進行引腳鎖定并進行測試,硬件驗證設計電路對ADC0809的控制功能。

三、實驗儀器與器材

計算機1臺,GW48-PK2S實驗箱1臺,Quartus6.0 1套。

四、實驗

VHDL 設計的狀態機的一般結構有以下幾部分組成:

1.    說明部分

說明部分中有新數據類型TYPE 的定義及其狀態類型(狀態名)和在此新數據類型下定義的狀態變量。狀態類型一般用枚舉類型,其中每一個狀態名可任意選取。但為了便于辨認和含義明確,狀態名最好有明顯的解釋性意義。狀態變量應定義為信號,便于信息傳遞。說明部分一般放在ARCHITECTURE BEGIN之間。

2.    主控時序進程:

狀態機是隨外部時鐘信號以同步時序方式工作的,因此狀態機中必須包含一個對工作時鐘信號敏感的進程作為狀態機的驅動泵。當時鐘發生有效跳變時,狀態機的狀態才發生變化。狀態機的下一狀態(包括再次進入本狀態)僅僅取決于時鐘信號的到來。一般地,主控時序進程不負責進入的下一狀態的具體狀態取值。當時鐘的有效跳變到來時,時序進程只是機械地將代表下一狀態的信號next_state 中的內容送入代表本狀態的信current_state 中,而信號next_state 中的內容完全由其它的進程根據實際情況來決定。當然此進程中也可以放置一些同步或異步清零、置位方面的控制信號。總體來說,主控時序進程的設計比較固定、單一和簡單。

3.    主控組合進程:

主控組合進程的任務是根據外部輸入的控制信號(包括來自狀態機外部的信號和來自狀態機內部其它非主控的組合或時序進程的信號),或(和)當前狀態的狀態值確定下一狀態(next_state)的取向,即next_state的取值內容,以及確定對外輸出或對內部其它組合或時序進程輸出控制信號的內容。

4.    普通組合進程

用于配合狀態機工作的其它組合進程,如為了完成某種算法的進程。

5.    普通時序進程

用于配合狀態機工作的其它時序進程,如為了穩定輸出設置的數據鎖存器等。一個狀態機的最簡結構應至少由兩個進程構成(也有單進程狀態機,但并不常用)即一個主控時序進程和一個主控組合進程,一個進程作驅動泵,描述時序邏輯,包括狀態寄存器的工作和寄存器狀態的輸出;另一個進程描述組合邏輯,包括進程間狀態值的傳遞邏輯以及狀態轉換值的輸出。當然必要時還可以引入第3 個和第4 個進程,以完成其它的邏輯功能。

從一般意義上說進程間是并行運行的,但由于敏感信號的設置不同以及電路的延遲,在時序上進程間的動作是有先后的。在設計中,如果希望輸出的信號具有寄存器鎖存功能,則需要為此輸出寫第3 個進程,并把clk reset信號放入敏感信號表中。用于進程間信息傳遞的信號current_state next_state ,在狀態機設計中稱為反饋信號。狀態機運行中,信號傳遞的反饋機制的作用是實現當前狀態的存儲和下一個狀態的譯碼設定等功能。在VHDL中可以有兩種方式來創建反饋機制,即使用信號的方式和使用變量的方式,通常傾向于使用信號的方式。附圖8-1為一般狀態機結構圖。

clip_image002[4]

                     8-1   一般狀態機結構框圖工作示意圖

 

附圖8-28-3為控制ADC0809采樣狀態機結構圖和狀態轉換圖

clip_image004[4]

8-2  采樣狀態機結構框圖

設計提示:

設目標器件是EP1C6Q240C8,建議選擇實驗電路結構圖No.5(即結構圖No.5A,附圖1-14,由該圖可見,ADC0809的轉換時鐘CLK已經事先接有750KHz的頻率),將實驗系統左下角選擇插針處的轉換結束A/D使能用跳線帽短接。下載目標文件后,可用螺絲刀旋轉實驗系統左下角的電位器,以便為ADC0809提供變化的待測模擬信號,這時數碼管87將顯示ADC0809采樣輸出并被鎖存的數字值(16進制)。

clip_image006[4]

8-3  控制ADC0809采樣狀態圖

 

 

clip_image007[4]

8-4  控制ADC0809采樣時序圖

 

五、實驗要求

根據以上的實驗內容寫出實驗報告,包括程序設計、軟件編譯、仿真分析、硬件測試和實驗過程;設計程序、程序分析報告、仿真波形圖及其分析報告。

 

1.        設計思路

6.    由題意知,我們要設計一個電路與A/D轉換器ADC0809相連,通過接受時鐘輸入來決定狀態,通過對不同狀態輸出不同的控制信號,實現對ADC0809的采樣控制,最終輸出穩定的采樣電壓。本實驗中將設計如下進程。

      設置兩個信號Current_StateNext_State,以便實現狀態的通知。

主控時序進程REG

總體設計思想:用REG控制整個采樣控制電路的狀態,是整個電路的總指揮。

通過監測ADC0809輸出的信號,實現不同狀態的轉換,進而控制不同不同的進程Process

主控時序進程REG只輸出狀態,只接收ST1

當狀態為ST0的時候,開始新一輪的采樣;

當接收ST1的時候,通知COM2將采樣數據鎖存,輸出。

進程REG對信號:CLKNext_State信號敏感

 

組合進程COM1

總體設計思想:用COM1實現COM2REG的通知,是整個電路的傳令兵;用COM2控制整個電路,是整個電路狀態改變的具體執行者。

EOC=1的時候,通知REG,以便改變電路狀態。

進程COM1對信號Current_StateEOC敏感

進程LATCH           

總體設計思想:用LATCH來鎖存轉換好的數據,并控制數據的輸出。

進程LATCH對信號LOCK,REGL敏感

 

 

程序設計
LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY ADCINT IS

    PORT(D  :INSTD_LOGIC_VECTOR(7DOWNTO0);--來自0809轉換好的8位數據

         CLK:INSTD_LOGIC;                    --狀態機工作時鐘

         EOC:INSTD_LOGIC;                    --轉換狀態指示,低電平表示正在轉換

         ALE:OUTSTD_LOGIC;              --8個模擬信號通道地址鎖存信號

         START:OUTSTD_LOGIC;                 --轉換開始信號

         OE:OUTSTD_LOGIC;                    --數據輸出3態控制信號

         ADDA:OUTSTD_LOGIC;                  --信號通道最低位控制信號

         LOCK0:OUTSTD_LOGIC;                 --觀察數據鎖存時鐘

         LED:OUTSTD_LOGIC;              --用來指示仿真程序是否正確

         -- LED2: OUT STD_LOGIC;              --2用來指示仿真程序是否正確

         Q  :OUTSTD_LOGIC_VECTOR(7DOWNTO0)--8位數據輸出

    );

   

   

END ADCINT;

ARCHITECTURE behav OF ADCINT IS

    TYPE states IS(st0,st1,st2,st3,st4);  --定義各狀態子類型

    SIGNAL current_state , next_state : states := st0;

    SIGNAL REGL :STD_LOGIC_VECTOR(7DOWNTO0);

    SIGNAL LOCK :STD_LOGIC;              --轉換后數據輸出鎖存時鐘信號

    BEGIN

        ADDA <= '1';--ADDA<='0',模擬信號進入通道IN0,當ADDA<='1',則進入通道IN1

        Q <= REGL; LOCK0 <= LOCK;

       

        ------------------進程REG---------------------

        --REG控制整個采樣控制電路的狀態,是整個電路的總指揮。

        PROCESS(CLK)

        BEGIN

       

        IF CLK='1' and CLK'eventTHEN            -- 檢測時鐘上升沿

                --LED<='0';

                IF next_state=st0 THEN         -- 初始化狀態機

                    current_state<=st0;

                ELSIF  next_state=st1 THEN     --開始轉換(st1)

                    current_state<=st1;

                ELSIF  next_state=st2 THEN   --等待轉化完畢,檢測EOC是否為高電平

                    current_state<=st2;

                ELSIF  next_state=st3 THEN

                --  LED<='1';

                    current_state<=st3;

                ELSIF  next_state=st4 THEN

                    current_state<=st4;

                ENDIF;

            ENDIF;

   

        ENDPROCESS;

     

       

        ------------------進程COM2---------------------

        --COM2控制整個電路,是整個電路狀態改變的具體執行者。

        PROCESS(current_state,EOC)

       

        VARIABLE First_EOC :STD_LOGIC;

        BEGIN

                --LED2<='0';

               

                IF current_state=st0 THEN         -- 初始化狀態機

                    ALE<='1';

                    START<='0';

                    OE<='0';

                    LOCK<='0';

                    next_state<=st1;

                ELSIF  current_state=st1 THEN     --開始轉換(st1)

                    START<='1';

                    ALE<='0';

                    --IF EOC='0' THEN      -- 轉換結束

                        next_state<=st2;

                        First_EOC:=EOC;--在狀態1記錄EOC,以便后面判斷AD是否開始轉換

                    --END IF;

                ELSIF  current_state=st2 THEN     --等待轉化完畢,檢測EOC是否為高電平

                     START<='0';

                     OE<='0';

                     if '1'=(First_EOC XOR EOC)then

                         IF EOC='1'  THEN

                            -- IF EOC='1'  THEN

                                next_state<=st3;

                            -- END IF;

                         -- else

                               -- next_state<=st2;

                            ENDIF;

                     else

                        next_state<=st2;

                     ENDIF;

                ELSIF  current_state=st3 THEN

                    --LED2<='1';

                    IF EOC='1'  THEN        -- 轉換結束

                        OE<='1';

                        next_state<=st4;

                     ELSE

                        OE<='0';

                       

                    ENDIF;

                ELSIF  current_state=st4 THEN

                    OE<='0';

                    LOCK<='1';

                    next_state<=st0;         --開啟下一輪新的轉換

 

                ENDIF;

 

        ENDPROCESS;

        ------------------進程LATCH---------------------

        --用來控制電路的輸出

        PROCESS(LOCK,REGL)

        VARIABLE cq :std_logic_vector(7DOWNTO0);--用來保存數值

        BEGIN

            IF LOCK='0' THEN

                cq:=D;

            ELSIF LOCK='1' THEN

                REGL<=cq;

            ENDIF;

           

        ENDPROCESS;

 

    ENDARCHITECTURE behav;

2.        仿真分析

clip_image009[4]

8-5 仿真波形圖

8-5可知,仿真波形和圖8-4控制ADC0809采樣時序圖一致。

 

3.        硬件測試和實驗過程

1-1  ADCINTGWAC6板上目標芯片EP1C6Q240C8的引腳鎖定信息

端口名稱

端口符號

GWAC6板輸入輸出元件

GWAC6板接口

目標器件引腳

備注

 8位數字量輸入引腳D

D

數碼管1~2

PIO31,PIO26,

PIO27,PIO28,

PIO29,PIO30,

PIO39,PIO38,

136,128,

132,133,

134,135,

160,159

模式No.5

 主頻率

CLK

時鐘Clock0

Clck0

28

 轉換狀態標志

EOC

 

PIO22

19

 

地址鎖存允許信號輸入端

ALE

 

PIO35

140

 

 A/D轉換啟動信號輸入端

START

 

PIO24

21

 

 輸出允許控制端

OE

 

PIO23

20

 

 地址輸入端A

 ADDA

ADC0809--P14

PIO37

158

 

 8位數字量輸出引腳

 Q

數碼管7~8\

PIO40~47

161-168

 

 

 

clip_image011[4]

8-6引腳的配置

六、一些實驗過程中的思考

怎么控制電路狀態的思考:在高級的程序設計語言中,如C語言可以使用大量的計算讓CPU忙等待,以便讓狀態持續一段時間。但是在硬件電路中,想要讓電路狀態持續一段時間的辦法只能通過Clock,通過對Clock上升/下降沿(或高低電平)的檢測,即將Clock設置為敏感信息。Clock就相當于一個鼓點,控制著整個電路的節奏(運行狀態)。


文章列表

arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()