有限狀態(tài)機(jī)FSM(Finite State Machine)及其設(shè)計(jì)技術(shù)是實(shí)用數(shù)字系統(tǒng)設(shè)計(jì)中實(shí)現(xiàn)高效率、高可靠邏輯控制的重要途徑。傳統(tǒng)的狀態(tài)機(jī)設(shè)計(jì)方法需進(jìn)行繁瑣的狀態(tài)分配、繪制狀態(tài)表、化簡(jiǎn)次態(tài)方程等,而利用VHDL可以避免這些繁瑣的過程,直接利用狀態(tài)轉(zhuǎn)換圖進(jìn)行狀態(tài)機(jī)的描述,所有的狀態(tài)均可表達(dá)為CASE_WHEN結(jié)構(gòu)中的一條CASE語(yǔ)句,而狀態(tài)的轉(zhuǎn)移則通過IF_THEN_ELsE語(yǔ)句實(shí)現(xiàn)。此外,與VHDL的其它描述方式相比,狀態(tài)機(jī)的VHDL表述豐富多樣,程序?qū)哟畏置鳎Y(jié)構(gòu)清晰,易讀易懂;在排錯(cuò)、修改和模塊移植方面也有其獨(dú)到的特點(diǎn)。
2 自動(dòng)售貨機(jī)控制系統(tǒng)的實(shí)現(xiàn)
2.1 自動(dòng)售貨機(jī)功能描述及控制系統(tǒng)組成
設(shè)計(jì)一個(gè)自動(dòng)售貨機(jī)的邏輯控制電路。它有兩個(gè)投幣口分別為一元投幣口和五角投幣口,假設(shè)每次只能投入一枚一元或五角硬幣,投入一元五角硬幣后機(jī)器自動(dòng)給出一瓶礦泉水,投入兩元硬幣后,在給出一瓶礦泉水的同時(shí)找回一枚五角的硬幣。圖1為自動(dòng)售貨機(jī)控制系統(tǒng)方框圖,由投幣信號(hào)處理模塊和功能控制模塊組成。

2.2 自動(dòng)售貨機(jī)控制功能的狀態(tài)描述
取投幣信號(hào)為輸入邏輯變量,投入一枚一元硬幣時(shí)用A=1表示,未投入時(shí)A=0。投入一枚五角硬幣用B=1表示,未投入時(shí)B=0。給出礦泉水和找錢為兩個(gè)輸出變量,分別用Z和Y表示,給出礦泉水時(shí)Z=1,不給時(shí)Z=0,找回一枚五角硬幣時(shí)Y=1,不找時(shí)Y=0。
根據(jù)上面的功能描述,可用三個(gè)狀態(tài)S0,S1,S2表示,未投幣前的初始狀態(tài)為S0,投入五角硬幣以后為S1,投入一元硬幣后(包括投入一枚一元硬幣和投入兩枚五角硬幣的情況)為S2,再投入一枚五角硬幣后電路返回S0,同時(shí)輸出為Z=1,Y=0;如果投入的是一枚一元硬幣,則電路也應(yīng)能返回S0,同時(shí)輸出為Z=1,Y=1。根據(jù)上面的分析可得到狀態(tài)轉(zhuǎn)換圖如圖2所示。

2.3 自動(dòng)售貨機(jī)功能控制模塊的VHDL實(shí)現(xiàn)
根據(jù)圖2所示的狀態(tài)轉(zhuǎn)換圖,用VHDL語(yǔ)言中的CASE_WHEN結(jié)構(gòu)和IF_THEN_ELSE語(yǔ)句實(shí)現(xiàn)控制功能,源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shj_ctrl IS
PORT(A,B:IN STD_LOGIC;
clk:IN STD_LOGIC;
Z,Y:OUT STD_LOGIC);
END shj_ctrl
ARCHITECTURE beha OF shi_ctrl IS
TYPE states IS(S0,S1,S2);
SIGNAL state:states;
SIGNAL X:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
X<=A&B;
PROCESS(x,state)
BEGIN
IF rising_edge(clk) THEN
CASE state IS
WHEN S0=>Z<='0';Y<='0';
IF(X="01")THEN
state<=s1;
ELSIF(X="10")THEN
state<=s2;
ELSE
state<=s0;
END IF;
WHEN S1=>Z<='0';Y<='0';
IF(X="01")THEN
state<=s2;
ELSIF(X="10")THEN
state<=S0;
Z<='1';Y<='0';
ELSE
state<=s1;
END IF;
WHEN S2=>Z<='0';Y<='0';
IF(X="01")THEN
state<=S0;
Z<='1';Y<='0';
ELSIF(X="10")THEN
state<=s0;
Z<='1';Y<='1';
ELSE
state<=s2;
END IF;
END CASE;
END IF;
END PROCESS;
END beha;
上面程序中,A、B分別為一元硬幣和五角硬幣驅(qū)動(dòng)信號(hào),Z為礦泉水輸出信號(hào),Y為找錢輸出信號(hào)。通過對(duì)程序分析和仿真可以看出,A和B的驅(qū)動(dòng)信號(hào)的持續(xù)時(shí)間必須控制在clk時(shí)鐘周期內(nèi),如果驅(qū)動(dòng)信號(hào)時(shí)間太短,系統(tǒng)檢測(cè)不到投幣信號(hào),時(shí)間太長(zhǎng),會(huì)誤認(rèn)為是兩次或多次投幣,造成誤操作。因此,要使整個(gè)控制系統(tǒng)可靠運(yùn)行,還必須設(shè)計(jì)專門投幣輸入信號(hào)處理電路。

2.4 投幣輸入信號(hào)電路的設(shè)計(jì)與實(shí)現(xiàn)
自動(dòng)售貨機(jī)的所有信號(hào)均由同步時(shí)鐘信號(hào)clk的正邊沿觸發(fā)。由于售貨機(jī)的硬幣接受器一般是一個(gè)機(jī)械設(shè)置裝置,投幣時(shí)產(chǎn)生的信號(hào)要比同步信號(hào)clk要慢得多,一般可持續(xù)好幾個(gè)周期,必須對(duì)投幣輸入信號(hào)進(jìn)行處理,使每一次投幣時(shí)在clk脈沖周期內(nèi)只能產(chǎn)生一個(gè)脈沖作為功能控制模塊的投幣驅(qū)動(dòng)信號(hào)?;谏厦娴墓δ芤?,設(shè)計(jì)了如圖3所示的投幣輸入信號(hào)的處理電路,其中IN_yuan和IN_jiao作為一元硬幣和五角硬幣的投幣輸入信號(hào),A和B為相應(yīng)的輸出信號(hào),作為功能控制模塊的輸入信號(hào),而且A、B輸出是在投幣輸入信號(hào)IN_yuan和IN_jiao為高電平1之后的一個(gè)周期內(nèi)被設(shè)置為1。經(jīng)過仿真結(jié)果如圖4所示,實(shí)現(xiàn)了每次投幣后在一個(gè)clk周期內(nèi)只產(chǎn)生一個(gè)可靠的脈沖驅(qū)動(dòng)信號(hào)。

3 自動(dòng)售貨機(jī)控制系統(tǒng)功能仿真
自動(dòng)售貨機(jī)控制系統(tǒng)模塊之間連接如圖5所示,其中“shuru”為投幣輸入信號(hào)處理模塊,其輸出信號(hào)作為功能控制模塊“SHJ_CTRL”的輸入驅(qū)動(dòng)信號(hào),OUT為自動(dòng)售貨機(jī)的礦泉水輸出信號(hào),ZHAOQIAN為找錢輸出信號(hào)。整個(gè)控制系統(tǒng)通過MAX+PLUSII軟件進(jìn)行編譯和仿真,仿真結(jié)果如圖6所示,符合電路設(shè)計(jì)要求。并把程序下載到芯片MAXEPM7128SLC84-15進(jìn)行驗(yàn)證與實(shí)際相符。
4 結(jié)束語(yǔ)
VHDL語(yǔ)言有限狀態(tài)機(jī)設(shè)計(jì)控制電路,可大大降低設(shè)計(jì)難度和時(shí)間,提高設(shè)計(jì)效率和可靠性,利用語(yǔ)言的靈活性及功能強(qiáng)大的EDA工具,可以輕松完成硬件的功能擴(kuò)充與升級(jí),還可以實(shí)現(xiàn)更復(fù)雜的數(shù)字系統(tǒng),整個(gè)設(shè)計(jì)過程相對(duì)于傳統(tǒng)的設(shè)計(jì)方法,有較大的突破。VHDL語(yǔ)言作為現(xiàn)代數(shù)字系統(tǒng)的重要設(shè)計(jì)工具,以其靈活、簡(jiǎn)潔的設(shè)計(jì)風(fēng)格在電路設(shè)計(jì)中發(fā)揮著越來越重要的作用。