多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)_第1頁(yè)
多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)_第2頁(yè)
多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)_第3頁(yè)
多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)_第4頁(yè)
多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)

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

傳統(tǒng)上在系統(tǒng)級(jí)和寄存器傳輸級(jí)完成VHDL的描述主要分以下幾步:

(1)分析控制器設(shè)計(jì)指標(biāo),建立系統(tǒng)算法模型圖;

(2)分析被控對(duì)象的時(shí)序狀態(tài),確定控制器有限狀態(tài)機(jī)的各個(gè)狀態(tài)及輸入.輸出條件;

(3)應(yīng)用VHDL語(yǔ)言完成描述。

使用XILINX的軟件包的輔助工具STATECAD能加速有限狀態(tài)機(jī)設(shè)計(jì),大大簡(jiǎn)化狀態(tài)機(jī)的設(shè)計(jì)過(guò)程,實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì)的自動(dòng)化。使用STATECAD進(jìn)行狀態(tài)機(jī)設(shè)計(jì)的流程

(1)分析控制器設(shè)計(jì)指標(biāo),建立系統(tǒng)算法模型圖;

(2)分析被控對(duì)象的時(shí)序狀態(tài),確定控制器有限狀態(tài)機(jī)的各個(gè)狀態(tài)及輸入.輸出條件;

(3)在STATECAD中輸入有限狀態(tài)機(jī)狀態(tài)圖,自動(dòng)產(chǎn)生VHDL模型描述,使用STATEBENCH進(jìn)行狀態(tài)轉(zhuǎn)移分析,分析無(wú)誤后使用導(dǎo)出VHDL模型塊到ISE中進(jìn)行仿真后綜合,實(shí)現(xiàn)到CPLD或FPGA的映射。

設(shè)計(jì)人員的主要工作在第一步。第二步,第三步基本上可以通過(guò)STATECAD完成有限狀態(tài)機(jī)的自動(dòng)生成和分析,還可以利用分析結(jié)果來(lái)對(duì)被控對(duì)象的邏輯進(jìn)行分析,改進(jìn),完善系統(tǒng)控制邏輯。

在需要并行處理的場(chǎng)合,往往需要采用多狀態(tài)機(jī)來(lái)完成系統(tǒng)的控制任務(wù),這時(shí)狀態(tài)機(jī)之間的同步問(wèn)題往往是設(shè)計(jì)者需要仔細(xì)考慮的問(wèn)題。如果采用完全人工輸入代碼的方法來(lái)設(shè)計(jì),往往力不從心。采用STATECAD完成整個(gè)控制邏輯的設(shè)計(jì)并對(duì)設(shè)計(jì)結(jié)果進(jìn)行驗(yàn)證更能體現(xiàn)CAD設(shè)計(jì)方法的優(yōu)勢(shì),加速產(chǎn)品開(kāi)發(fā)進(jìn)度,提高設(shè)計(jì)生產(chǎn)率。

下面以一個(gè)雙狀態(tài)機(jī)設(shè)計(jì)過(guò)程來(lái)介紹如何使用STATECAD進(jìn)行多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)。

有二個(gè)狀態(tài)機(jī),一個(gè)負(fù)責(zé)對(duì)M0寫,一個(gè)負(fù)責(zé)對(duì)M0讀操作,為了簡(jiǎn)單起見(jiàn),系統(tǒng)已經(jīng)盡量簡(jiǎn)化了。

負(fù)責(zé)對(duì)M0寫的狀態(tài)機(jī)包括四個(gè)狀態(tài):

STATE0:寫狀態(tài)機(jī)復(fù)位后初始化;

write0:對(duì)M0寫,寫滿4個(gè)轉(zhuǎn)到m0full;

m0full:M0滿狀態(tài);

m0writewait:等待。M0滿時(shí)轉(zhuǎn)入write0狀態(tài)。

負(fù)責(zé)對(duì)M0讀的狀態(tài)機(jī)包括四個(gè)狀態(tài):

STATE1:讀狀態(tài)機(jī)復(fù)位后初始化

read0:對(duì)M0讀,讀4個(gè)轉(zhuǎn)到m0empty

m0empty:M0空狀態(tài)

m0readwait:等待。M0空時(shí)轉(zhuǎn)入read0狀態(tài)

負(fù)責(zé)對(duì)M0寫的狀態(tài)機(jī)必須知道M0是空的,而負(fù)責(zé)對(duì)M0讀的狀態(tài)機(jī)必須知道M0是滿的才能讀。讀完了通知負(fù)責(zé)對(duì)M0寫的狀態(tài)機(jī)M0是空的,可以寫了。二個(gè)狀態(tài)機(jī)同時(shí)并行工作。M0寫的狀態(tài)機(jī)在寫操作完了,就等待M0空。M0讀的狀態(tài)機(jī)在讀操作完了,就等待M0滿。在STATECAD中,狀態(tài)本身可以作為其他狀態(tài)機(jī)的轉(zhuǎn)移條件。這也正是在進(jìn)行多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)中最需要的功能,能大大方便多狀態(tài)機(jī)的設(shè)計(jì)。

輸入完?duì)顟B(tài)圖,就基本完成了狀態(tài)機(jī)的設(shè)計(jì)過(guò)程。進(jìn)行邏輯優(yōu)化后,使用STATEBENCH進(jìn)行狀態(tài)轉(zhuǎn)移分析。以下是自動(dòng)狀態(tài)轉(zhuǎn)移模擬波形。

由以上的波形看到狀態(tài)機(jī)的工作過(guò)程符合設(shè)計(jì)邏輯。對(duì)單獨(dú)的器件操作也許不需要采用多狀態(tài)機(jī)的設(shè)計(jì)方法,但在多器件需要并行工作時(shí),多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)就顯得必要了。導(dǎo)出VHDL模型塊到ISE中進(jìn)行仿真后綜合,這里就不多講了,以下是產(chǎn)生的代碼:

--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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論