多狀態機的協同設計_第1頁
多狀態機的協同設計_第2頁
多狀態機的協同設計_第3頁
多狀態機的協同設計_第4頁
多狀態機的協同設計_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

多狀態機的協同設計

隨著微電子技術的迅速發展,人們對數字系統的需求也在提高[1]。不僅要有完善的功能,而且對速度也提出了很高的要求。對于大部分數字系統,都可以劃分為控制單元和數據單元兩個組成部分。通常,控制單元的主體是一個有限狀態機,它接收外部信號以及數據單元產生的狀態信息,產生控制信號序列。有限狀態機設計的關鍵是如何把一個實際的時序邏輯關系抽象成一個時序邏輯函數,傳統的電路圖輸入法通過直接設計寄存器組來實現各個狀態之間的轉換,而用硬件描述語言來描述有限狀態機,往往是通過充分發揮硬件描述語言的抽象建模能力,通過對系統在系統級或寄存器傳輸級進行描述來建立有限狀態機。EDA工具的快速發展,使通過CAD快速設計有限狀態機自動化成為可能。

傳統上在系統級和寄存器傳輸級完成VHDL的描述主要分以下幾步:

(1)分析控制器設計指標,建立系統算法模型圖;

(2)分析被控對象的時序狀態,確定控制器有限狀態機的各個狀態及輸入.輸出條件;

(3)應用VHDL語言完成描述。

使用XILINX的軟件包的輔助工具STATECAD能加速有限狀態機設計,大大簡化狀態機的設計過程,實現狀態機設計的自動化。使用STATECAD進行狀態機設計的流程

(1)分析控制器設計指標,建立系統算法模型圖;

(2)分析被控對象的時序狀態,確定控制器有限狀態機的各個狀態及輸入.輸出條件;

(3)在STATECAD中輸入有限狀態機狀態圖,自動產生VHDL模型描述,使用STATEBENCH進行狀態轉移分析,分析無誤后使用導出VHDL模型塊到ISE中進行仿真后綜合,實現到CPLD或FPGA的映射。

設計人員的主要工作在第一步。第二步,第三步基本上可以通過STATECAD完成有限狀態機的自動生成和分析,還可以利用分析結果來對被控對象的邏輯進行分析,改進,完善系統控制邏輯。

在需要并行處理的場合,往往需要采用多狀態機來完成系統的控制任務,這時狀態機之間的同步問題往往是設計者需要仔細考慮的問題。如果采用完全人工輸入代碼的方法來設計,往往力不從心。采用STATECAD完成整個控制邏輯的設計并對設計結果進行驗證更能體現CAD設計方法的優勢,加速產品開發進度,提高設計生產率。

下面以一個雙狀態機設計過程來介紹如何使用STATECAD進行多狀態機的協同設計。

有二個狀態機,一個負責對M0寫,一個負責對M0讀操作,為了簡單起見,系統已經盡量簡化了。

負責對M0寫的狀態機包括四個狀態:

STATE0:寫狀態機復位后初始化;

write0:對M0寫,寫滿4個轉到m0full;

m0full:M0滿狀態;

m0writewait:等待。M0滿時轉入write0狀態。

負責對M0讀的狀態機包括四個狀態:

STATE1:讀狀態機復位后初始化

read0:對M0讀,讀4個轉到m0empty

m0empty:M0空狀態

m0readwait:等待。M0空時轉入read0狀態

負責對M0寫的狀態機必須知道M0是空的,而負責對M0讀的狀態機必須知道M0是滿的才能讀。讀完了通知負責對M0寫的狀態機M0是空的,可以寫了。二個狀態機同時并行工作。M0寫的狀態機在寫操作完了,就等待M0空。M0讀的狀態機在讀操作完了,就等待M0滿。在STATECAD中,狀態本身可以作為其他狀態機的轉移條件。這也正是在進行多狀態機的協同設計中最需要的功能,能大大方便多狀態機的設計。

輸入完狀態圖,就基本完成了狀態機的設計過程。進行邏輯優化后,使用STATEBENCH進行狀態轉移分析。以下是自動狀態轉移模擬波形。

由以上的波形看到狀態機的工作過程符合設計邏輯。對單獨的器件操作也許不需要采用多狀態機的設計方法,但在多器件需要并行工作時,多狀態機的協同設計就顯得必要了。導出VHDL模型塊到ISE中進行仿真后綜合,這里就不多講了,以下是產生的代碼:

--D:“XILINXTUTORIAL“

LIBRARYieee;

USE_logic_;

LIBRARYieee;

USE_logic_;

ENTITYSHELL_DUOZTJIIS

PORT(CLK,RESET:INstd_logic;

dcounter0,dcounter1:OUTstd_logic);

SIGNALBP_dcounter0,BP_dcounter1,readcounter0,readcounter1:std_logic;

END;

ARCHITECTUREBEHAVIOROFSHELL_DUOZTJIIS

SIGNALsreg:std_logic_vector(1DOWNTO0);

SIGNALnext_sreg:std_logic_vector(1DOWNTO0);

CONSTANTm0full:std_logic_vector(1DOWNTO0):="00";

CONSTANTm0writewait:std_logic_vector(1DOWNTO0):="01";

CONSTANTSTATE0:std_logic_vector(1DOWNTO0):="10";

CONSTANTwrite0:std_logic_vector(1DOWNTO0):="11";

SIGNALsreg1:std_logic_vector(1DOWNTO0);

SIGNALnext_sreg1:std_l

ogic_vector(1DOWNTO0);

CONSTANTm0empty:std_logic_vector(1DOWNTO0):="00";

CONSTANTm0readwait:std_logic_vector(1DOWNTO0):="01";

CONSTANTread0:std_logic_vector(1DOWNTO0):="10";

CONSTANTSTATE1:std_logic_vector(1DOWNTO0):="11";

SIGNALnext_BP_dcounter0,next_BP_dcounter1,next_readcounter0,

next_readcounter1:std_logic;

SIGNALBP_dcounter:std_logic_vector(1DOWNTO0);

SIGNALdcounter:std_logic_vector(1DOWNTO0);

SIGNALreadcounter:std_logic_vector(1DOWNTO0);

BEGIN

PROCESS(CLK,next_sreg,next_BP_dcounter1,next_BP_dcounter0)

BEGIN

IFCLK=‘1‘ANDCLK‘eventTHEN

sreg=next_sreg;

BP_dcounter1=next_BP_dcounter1;

BP_dcounter0=next_BP_dcounter0;

ENDIF;

ENDPROCESS;

PROCESS(CLK,next_sreg1,next_readcounter1,next_readcounter0)

BEGIN

IFCLK=‘1‘ANDCLK‘eventTHEN

sreg1=next_sreg1;

readcounter1=next_readcounter1;

readcounter0=next_readcounter0;

ENDIF;

ENDPROCESS;

PROCESS(sreg,sreg1,BP_dcounter0,BP_dcounter1,readcounter0,readcounter1,

RESET,BP_dcounter,readcounter)

BEGIN

next_BP_dcounter0=BP_dcounter0;next_BP_dcounter1=BP_dcounter1;

next_readcounter0=readcounter0;next_readcounter1=readcounter1;

BP_dcounter=((std_logic_vector‘(BP_dcounter1,BP_dcounter0)));

readcounter=((std_logic_vector‘(readcounter1,readcounter0)));

next_sreg=m0full;

next_sreg1=m0empty;

IF(RESET=‘1‘)THEN

next_sreg=STATE0;

BP_dcounter=(std_logic_vector‘("00"));

ELSE

CASEsregIS

WHENm0full=

next_sreg=m0writewait;

BP_dcounter=((std_logic_vector‘(BP_dcounter1,BP_dcounter0)));

WHENm0writewait=

IF((sreg1=m0empty))THEN

next_sreg=write0;

BP_dcounter=((std_logic_vector‘(BP_dcounter1,BP_dcounter0))+std_logic_vector‘("01"));

ELSE

next_sreg=m0writewait;

BP_dcounter=((std_logic_vector‘(BP_dcounter1,BP_dcounter0)));

ENDIF;

WHENSTATE0=

next_sreg=write0;

BP_dcounter=((std_logic_vector‘(BP_dcounter1,BP_dcounter0))+

std_logic_vector‘("01"));

WHENwrite0=

IF(BP_dcounter0=‘1‘ANDBP_dcounter1=‘1‘)THEN

next_sreg=m0full;

BP_dcounter=(std_logic_vector‘("00"));

ELSE

next_sreg=write0;

BP_dcounter=((std_logic_vector‘(BP_dcounter1,BP_dcounter0))+

std_logic_vector‘("01"));

ENDIF;

WHENOTHERS=

ENDCASE;

ENDIF;

IF(RESET=‘1‘)THEN

next_sreg1=STATE1;

readcounter=(std_logic_vector‘("00"));

ELSE

CASEsreg1IS

WHENm0empty=

next_sreg1=m0readwait;

readcounter=((std_logic_vector‘(readcounter1,readcounter0)));

WHENm0readwait=

IF((sreg

=m0full))THEN

next_sreg1=read0;

readcounter=((std_logic_vector‘(readcounter1,readcounter0))+

std_logic_vector‘("01"));

ELSE

next_sreg1=m0readwait;

readcounter=((std_logic_vector‘(readcounter1,readcounter0)));

ENDIF;

WHENread0=

IF(readcounter0=‘1‘ANDreadcounter1=‘1‘)THEN

next_sreg1=m0empty;

readcounter=(std_logic_vector‘("00"));

ELSE

next_sreg1=read0;

readcounter=((std_logic_vector‘(readcounter1,readcounter0))+

std_logic_vector‘("01"));

ENDIF;

WHENSTATE1=

IF((sreg=m0full))THEN

next_sreg1=read0;

readcounter=((std_logic_vector‘(readcounter1,readcounter0))+std_logic_vector‘("01"));

ELSE

next_sreg1=STATE1;

readcounter=((std_logic_vector‘(readcounter1,readcounter0)));

ENDIF;

WHENOTHERS=

ENDCASE;

ENDIF;

next_BP_dcounter1=BP_dcounter(1);

next_BP_dcounter0=BP_dcounter(0);

next_readcounter1=readcounter(1);

next_readcounter0=readcounter(0);

E

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論