版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1
第7章有限狀態(tài)機設計27.1一般有限狀態(tài)機描述1.VHDL數(shù)據(jù)類型VHDL是一種強數(shù)據(jù)類型語言。要求設計實體中的每一個常數(shù)、信號、變量、函數(shù)以及設定的各種參量都必須具有確定的數(shù)據(jù)類型,并且相同數(shù)據(jù)類型的量才能互相傳遞和作用。分為:
?預定義數(shù)據(jù)類型、
?用戶自定義數(shù)據(jù)類型3(1)VHDL的預定義數(shù)據(jù)類型布爾量(boolean)布爾量具有兩種狀態(tài):false和true
位(bit)
位矢量(bit_vector)字符(character)整數(shù)(integer)自然數(shù)(natural)和正整數(shù)(positive)
natural是integer的子類型,表示非負整數(shù)。
positive是integer的子類型,表示正整數(shù)。實數(shù)(REAL)
字符串(string)時間(TIME)
4(2)IEEE預定義標準邏輯位與矢量1)std_logic
類型由std_logic
類型代替bit類型可以完成電子系統(tǒng)的精確模擬,并可實現(xiàn)常見的三態(tài)總線電路。2)std_logic_vector
類型由std_logic
構(gòu)成的數(shù)組。5(3)用戶自定義類型用戶自定義類型是VHDL語言的一大特色??捎捎脩舳x的數(shù)據(jù)類型有:
?枚舉類型
?整數(shù)和實數(shù)類型
?數(shù)組類型
?記錄類型
?子類型6
用類型定義語句TYPE和子類型定義語句SUBTYPE實現(xiàn)用戶自定義數(shù)據(jù)類型。
TYPE語句格式:例:typebooleanis(false,true);typestisarray(15downto0)ofstd_logic;
variablest1:st;typeweekis(sun,mon,tue,wed,thu,fri,sat);type數(shù)據(jù)類型名is數(shù)據(jù)類型定義[of基本數(shù)據(jù)類型];7SUBTYPE語句格式:例:subtypedigitsisintegerrange0to9;由subtype語句定義的數(shù)據(jù)類型稱為子類型。子類型與基(父)類型具有相同的操作符和子程序。可以直接進行賦值操作。subtype子類型名is基本數(shù)據(jù)類型range約束范圍;81)枚舉類型枚舉該類型的所有可能的值。格式:如:typestd_logicis('U','X','0','1','Z','W','L','H','-');如:typecoloris(blue,green,yellow,red);
typem_stateis(st0,st1,st2,st3,st4,st5); signalpresent_state,next_state:m_state;type類型名稱is(枚舉文字{,枚舉文字});9枚舉類型的編碼:綜合器自動實現(xiàn)枚舉類型元素的編碼,一般將第一個枚舉量(最左邊)編碼為0,以后的依次加1。編碼用位矢量表示,位矢量的長度將取所需表達的所有枚舉元素的最小值。如:typecoloris(blue,green,yellow,red);編碼為:blue=“00”;green=“01”;yellow=“10”;red=“11”;102)整數(shù)類型用戶定義的整數(shù)類型是標準包中整數(shù)類型的子范圍。格式:例:typemy_integerisintegerrange0to9;3)數(shù)組類型
數(shù)組:同類型元素的集合。VHDL支持多維數(shù)組。多維數(shù)組的聲明:
typebyteisarray(7downto0)ofbit;
typevectorisarray(3downto0)ofbyte;type類型名稱isrange整數(shù)范圍;117.1一般有限狀態(tài)機描述1.狀態(tài)機狀態(tài)機(statemachine)有限狀態(tài)機FSM(finitestatemachine)狀態(tài)機是組合邏輯與寄存器邏輯兩者的特殊組合。狀態(tài)機是描述一系列狀態(tài)轉(zhuǎn)換的時序電路。一般用狀態(tài)圖來表示狀態(tài)機的運行情況較為明確。對那些任務順序非常明確的電路(如數(shù)字控制模塊)非常有用。狀態(tài)圖是一種流程控制的設計,在有限的狀態(tài)中,根據(jù)判別信號的邏輯值決定后面要進入哪一個狀態(tài)。先來看看下面的狀態(tài)圖。1213FSM(FiniteStateMachine)狀態(tài)機是一種記錄下給定時刻狀態(tài)的設備,并根據(jù)輸入,對每個給定的改變,改變其狀態(tài)或引發(fā)一個動作。有限狀態(tài)機是有有限個狀態(tài)的機器有限狀態(tài)機由有限的狀態(tài)和相互之間的轉(zhuǎn)移構(gòu)成,在任何時候只能處于給定數(shù)目的狀態(tài)中的一個。當接收到一個輸入事件時,狀態(tài)機產(chǎn)生一個輸出,同時也可能伴隨著狀態(tài)的轉(zhuǎn)移。有限狀態(tài)機適用于表示時序控制電路,它可以描述出系統(tǒng)所處的狀態(tài)、狀態(tài)之間的轉(zhuǎn)移以及引起狀態(tài)轉(zhuǎn)移的原因;可以描述同步或異步狀態(tài)機。14
FSM分類
FSM根據(jù)輸入輸出關(guān)系可分為兩類:摩爾(Moore)型狀態(tài)機米利(Mealy)型狀態(tài)機15
摩爾(Moore)型狀態(tài)機
摩爾(Moore)型狀態(tài)機的輸出僅僅與當前狀態(tài)相關(guān)。16摩爾(Moore)型狀態(tài)圖17
米利(Mealy)型狀態(tài)機
米利(Mealy)型狀態(tài)機的輸出不僅與當前狀態(tài)相關(guān),而且也與輸入信號相關(guān)。18
米利(Mealy)型狀態(tài)圖
194為什么要使用狀態(tài)機狀態(tài)機的工作方式是根據(jù)控制信號按照預先設定的狀態(tài)進行順序進行的。在速度和可靠性方面優(yōu)于CPU。結(jié)構(gòu)模式簡單,設計方案固定,狀態(tài)采取符號化枚舉類型,為VHDL綜合器發(fā)揮其強大的優(yōu)化功能提供有利條件。狀態(tài)機容易構(gòu)成性能良好的同步時序邏輯模塊,利于消除電路的毛刺現(xiàn)象。高速運算和控制方面,有巨大的優(yōu)勢。多個并行運行的狀態(tài)機類似并行運行的多CPU的性能。其運算速度比CPU高3至5個數(shù)量級。高可靠性。狀態(tài)機是純硬件電路,從非法狀態(tài)中跳出只數(shù)十納秒。而CPU要通過復位從非法運行狀態(tài)中恢復過來,需要數(shù)十毫秒。201.一個有限狀態(tài)機的VHDL描述應該包括以下內(nèi)容:至少包括一個狀態(tài)信號,它們用來指定有限狀態(tài)機的狀態(tài)。狀態(tài)轉(zhuǎn)移指定和輸出指定,它們對應于控制單元中與每個控制步有關(guān)的轉(zhuǎn)移條件。時鐘信號,它是用來進行同步的。同步或異步復位信號。7.1一般有限狀態(tài)機的設計212一個有限狀態(tài)機通常包含:說明部分主控時序進程(REG)主控組合進程(COM)輔助進程7.1一般有限狀態(tài)機的設計ProcessREGProcessCOMcomb_outputsclkresetstate_inputsFSM:s_machinecurrent_statenext_state22說明部分一般放在結(jié)構(gòu)體的說明部分:例如:一個符號化的狀態(tài)機說明部分:TYPEFSM_STIS(s0,s1,s2,s3);SIGNALcurrent_state,next_state:FSM_ST;直接指定狀態(tài)碼(非符號化編碼)的說明部分:SIGNALcurrent_state,next_state:std_logic_vector(1downto0);CONSTANTst0:std_logic_vector(3downto0):="00"CONSTANTst1:std_logic_vector(3downto0):="01"CONSTANTst2:std_logic_vector(3downto0):=“10"CONSTANTst3:std_logic_vector(3downto0):=“11"23主控時序進程部分是指負責狀態(tài)機運轉(zhuǎn)和在時鐘驅(qū)動下負責狀態(tài)轉(zhuǎn)換的進程例如:含復位信號的主控時序進程IFreset='1'THENcurrent_state<=s0;ELSIFclk='1'andclk'eventTHEN
current_state<=next_state;ENDIF;24主控組合進程部分是指狀態(tài)譯碼進程,是根據(jù)外部輸入的控制信號和當前狀態(tài)值確定下一狀態(tài)(next_state)的取向。例如:CASEcurrent_sateIS whens0=>next_state<=s1; whens1=>next_state<=s2; whens2=>next_state<=s3; whens3=>next_state<=s0;ENDCASE;說明部分,主控時序進程設計固定。主控組合進程部分是區(qū)分狀態(tài)機的主要部分。輔助進程 用來配合狀態(tài)機工作的組合進程或時序進程。 例如:為了完成某種算法的進程。用了配合狀態(tài)機的其他時序進程。為了穩(wěn)定輸出設置的數(shù)據(jù)鎖存器。
25例:描述如圖所示的狀態(tài)機S2(12)S1(8)S0(5)S3(14)00非00非11非00非1111001126實體,F(xiàn)SM說明部分LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYs_machineIS
port(clk,reset:instd_logic;
state_inputs:instd_logic_vector(0to1);
comb_outputs:outintegerrange0to15);END;ARCHITECTUREbhvOFs_machineIS
TYPEfsm_stis(s0,s1,s2,s3);SIGNALcurrent_state,next_state:fsm_st;BEGIN27主控時序進程REGReg:PROCESS(reset,clk)BEGINIFreset='1'THEN
current_state<=s0;ELSIFclk='1'andclk'eventTHEN
current_state<=next_state;ENDIF;ENDPROCESS;28主控組合進程COMcom:process(current_state,state_inputs)begincasecurrent_stateis
whens0=>comb_outputs<=5;ifstate_inputs="00"thennext_state<=s0; elsenext_state<=s1;endif;whens1=>comb_outputs<=8;ifstate_inputs="00"thennext_state<=s1; elsenext_state<=s2;endif;whens2=>comb_outputs<=12; ifstate_inputs="11"thennext_state<=s0; elsenext_state<=s3;endif;whens3=>comb_outputs<=14; ifstate_inputs="11"thennext_state<=s3; elsenext_state<=s0;endif;endcase;endprocess;ENDbhv;29
上例屬于Moore型狀態(tài)機,狀態(tài)機的輸出僅與當前狀態(tài)有關(guān),是當前狀態(tài)的函數(shù).
當輸入發(fā)生變化時,需等待時鐘邊沿的到來,才會引起狀態(tài)的改變,從而導致輸出的變化。30綜合結(jié)果
狀態(tài)QS0100001015S1010010008S20010110012S3000111101431多進程有限狀態(tài)機用狀態(tài)機實現(xiàn)對ADC0809的采樣控制電路1.典型A/D轉(zhuǎn)換器芯片ADC08098路模擬信號的分時采集,片內(nèi)有8路模擬選通開關(guān),以及相應的通道地址鎖存用譯碼電路,其轉(zhuǎn)換時間為100μs左右。ADC0809的內(nèi)部邏輯結(jié)構(gòu)圖如圖所示。
7.2Moore型有限狀態(tài)機的設計32ADC0809內(nèi)部邏輯結(jié)構(gòu)ADC0809引腳圖
33圖中多路開關(guān)可選通8個模擬通道,允許8路模擬量分時輸入,共用一個A/D轉(zhuǎn)換器進行轉(zhuǎn)換,這是一種經(jīng)濟的多路數(shù)據(jù)采集方法。地址鎖存與譯碼電路完成對A、B、C3個地址位進行鎖存和譯碼,其譯碼輸出用于通道選擇,其轉(zhuǎn)換結(jié)果通過三態(tài)輸出鎖存器存放、輸出,因此可以直接與系統(tǒng)數(shù)據(jù)總線相連。
通道選擇表
34信號引腳
ADC0809芯片為28引腳為雙列直插式封裝。主要信號引腳的功能說明如下:
IN7~IN0——模擬量輸入通道
A、B、C——地址線。通道端口選擇線,A為低地址,C為高地址,引腳圖中為ADDA,ADDB和ADDC。其地址狀態(tài)與通道對應關(guān)系見表。
ALE——地址鎖存允許信號。對應ALE上升沿,A、B、C地址狀態(tài)送入地址鎖存器中。
START——轉(zhuǎn)換啟動信號。START上升沿時,復位ADC0809;START下降沿時啟動芯片,開始進行A/D轉(zhuǎn)換;在A/D轉(zhuǎn)換期間,START應保持低電平。35D7~D0——數(shù)據(jù)輸出線。為三態(tài)緩沖輸出形式。
OE——輸出允許信號。用于控制三態(tài)輸出鎖存器向外輸出轉(zhuǎn)換得到的數(shù)據(jù)。OE=0,輸出數(shù)據(jù)線呈高阻;OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù)。
CLK——時鐘信號。通常使用頻率為500KHz的時鐘信號。
EOC——轉(zhuǎn)換結(jié)束信號。EOC=0,正在進行轉(zhuǎn)換;EOC=1,轉(zhuǎn)換結(jié)束。
Vcc——+5V電源。
Vref——參考電源參考電壓用來與輸入的模擬信號進行比較,作為逐次逼近的基準。其典型值為+5V(Vref(+)=+5V,Vref(-)=-5V)。36ADC0809的工作時序圖
37PROCESSREG時序進程PROCESSCOM組合進程PROCESSLATCH鎖存器current_statenext_stateLOCK狀態(tài)機FSMCLKALESTARTOEADDAclkEOCD[7..0]ADC0809Q[7..0]模擬信號輸入采樣數(shù)據(jù)輸出A/D工作時鐘LOCK02采樣狀態(tài)機結(jié)構(gòu)框圖38對ADC0809初始化st0st1st2st3st4打開片選,啟動轉(zhuǎn)換采樣周期中等待EOC='0'正在轉(zhuǎn)換EOC='1'轉(zhuǎn)換結(jié)束開啟OE數(shù)據(jù)輸出有效由LOCK:0->1發(fā)數(shù)據(jù)鎖存信號2采樣狀態(tài)機狀態(tài)轉(zhuǎn)換圖39ADC0809內(nèi)部邏輯結(jié)構(gòu)ADC0809引腳圖
402采樣狀態(tài)機狀態(tài)轉(zhuǎn)換圖ADDA<='1';st0:ALE<='0';START<='0';OE<='0';LOCK<='0';
st1:ALE<='1';START<='1';OE<='0';LOCK<='0';st2:ALE<='0';START<='0';OE<='0';LOCK<='0';st3:ALE<='0';START<='0';OE<='1';LOCK<='0';st4:ALE<='0';START<='0';OE<='1';LOCK<='1';ALE:地址鎖存信號START:轉(zhuǎn)換啟動信號LOCK:輸出鎖存信號OE:輸出允許信號ADDA:通道選擇信號413.VHDL描述狀態(tài)機(1)實體libraryieee;useieee.std_logic_1164.all;entityadcintis
port(D:instd_logic_vector(7downto0);
clk,EOC:instd_logic;ALE,START,OE,ADDA,LOCK0:outstd_logic; Q:outstd_logic_vector(7downto0));end;423.VHDL描述狀態(tài)機(2)說明部分architecturebehavofadcintis Typestatesis(st0,st1,st2,st3,st4); signalcurrent_state,next_state:states; signalregl:std_logic_vector(7downto0); signallock:std_logic;begin433.VHDL描述狀態(tài)機(3)主控時序進程部分Reg:process(clk)beginif(clk'eventandclk='1')then
current_state<=next_state; endif;endprocess;44(4)主控組合進程部分com:process(current_state,EOC)beginCASEcurrent_stateis whenst0=>ALE<='0';START<='0';OE<='0';LOCK<='0';
next_state<=st1;whenst1=>ALE<='1';START<='1';OE<='0';LOCK<='0';
next_state<=st2;whenst2=>ALE<='0';START<='0';OE<='0';LOCK<='0'; ifEOC='1'thennext_state<=st3;elsenext_state<=st2;endif;whenst3=>ALE<='0';START<='0';OE<='1';LOCK<='0';
next_state<=st4; whenst4=>ALE<='0';START<='0';OE<='1';LOCK<='1';
next_state<=st0;whenothers=>ALE<='0';START<='0';OE<='0';LOCK<='0';
next_state<=st0;ENDCASE;endprocesscom;453.VHDL描述狀態(tài)機(5)輔助進程部分-鎖存器latch1:process(lock)beginif(lock'eventandlock='1')then
regl<=D; endif;endprocesslatch1;463.VHDL描述狀態(tài)機(6)其它ADDA<='1';Q<=regl;Lock0<=lock;endbehav;474.仿真波形485.綜合RTL電路496.分解組合進程
組合進程可以分解為兩個組合進程com1,com2,則效果相同.com1:process(current_state,EOC)beginCASEcurrent_stateiswhenst0=>ALE<='0';START<='0';OE<='0';LOCK<='0';whenst1=>ALE<='1';START<='1';OE<='0';LOCK<='0';whenst2=>ALE<='0';START<='0';OE<='0';LOCK<='0';whenst3=>ALE<='0';START<='0';OE<='1';LOCK<='0';whenst4=>ALE<='0';START<='0';OE<='1';LOCK<='1';whenothers=>ALE<='0';START<='0';OE<='0';LOCK<='0';ENDCASE;endprocesscom1;com2:process(current_state,EOC)beginCASEcurrent_stateiswhenst0=>next_state<=st1;whenst1=>next_state<=st2;whenst2=>ifEOC='1'thennext_state<=st3;elsenext_state<=st2;endif;whenst3=>next_state<=st4;whenst4=>next_state<=st0;whenothers=>next_state<=st0;ENDCASE;endprocesscom2;507.單進程Moore型有限狀態(tài)機
組合進程可以與時序進程合并為一個。去掉next_statecomreg:process(clk,EOC)beginif(clk'eventandclk='1')thenCASEcurrent_stateiswhenst0=>ALE<='0';START<='0';OE<='0';lock<='0';current_state<=st1;whenst1=>ALE<='1';START<='1';OE<='0';lock<='0';current_state<=st2;whenst2=>ALE<='0';START<='0';OE<='0';lock<='0'; ifEOC='1'thencurrent_state<=st3;elsecurrent_state<=st2;endif;whenst3=>ALE<='0';START<='0';OE<='1';lock<='0';current_state<=st4;whenst4=>ALE<='0';START<='0';OE<='1';lock<='1';current_state<=st0;whenothers=>ALE<='0';START<='0';OE<='0';lock<='0';current_state<=st0;ENDCASE;endif;endprocess;51綜合結(jié)果
可見輸出增加了一個鎖存器??梢杂行У販p小組合電路的毛刺現(xiàn)象。但輸出會延遲一個時鐘周期。52組合進程,時序進程分開的情況組合進程,時序進程合并的情況538.單進程Moore型有限狀態(tài)機例8-4libraryieee;
useieee.std_logic_1164.all;entitymoore1is
port(clk,RST:in
std_logic;
DATAIN:instd_logic_vector(1downto0);
Q:outstd_logic_vector(3downto0));
end;architecturebhvofmoore1is
typest_typeis(st0,st1,st2,st3,st4);
signalc_st:st_type;
begin
process(clk,RST)
begin
ifRST='1'then
c_st<=st0;Q<="0000";
elsif
clk'eventandclk='1'then
casec_stis
whenst0=>ifdatain="10"thenc_st<=st1;elsec_st<=st0;endif;Q<="1001";
whenst1=>ifdatain="11"thenc_st<=st2;elsec_st<=st1;endif;Q<="0101";
whenst2=>ifdatain="01"thenc_st<=st3;elsec_st<=st0;endif;Q<="1100";
whenst3=>ifdatain="00"thenc_st<=st4;elsec_st<=st2;endif;Q<="0010";
whenst4=>ifdatain="11"thenc_st<=st0;elsec_st<=st3;endif;Q<="1001";
whenothers=>c_st<=st0;
endcase;
endif;
endprocess;end;54綜合結(jié)果55改寫為兩進程Moore型有限狀態(tài)機例7-4libraryieee;
useieee.std_logic_1164.all;entitymoore1is
port(clk,RST:in
std_logic;
DATAIN:instd_logic_vector(1downto0);
Q:outstd_logic_vector(3downto0));
end;architecturebhvofmoore1is
typest_typeis(st0,st1,st2,st3,st4);
signalc_st,n_st:st_type;
begin
process(clk,RST)
begin
ifclk'eventandclk='1'then
c_st<=n_st;endif;endprocess;
process(c_st)begin
ifRST='1'then
n_st<=st0;Q<="0000";elsecasec_stis
whenst0=>ifdatain="10"thenn_st<=st1;elsen_st<=st0;endif;Q<="1001";
whenst1=>ifdatain="11"thenn_st<=st2;elsen_st<=st1;endif;Q<="0101";
whenst2=>ifdatain="01"thenn_st<=st3;elsen_st<=st0;endif;Q<="1100";
whenst3=>ifdatain="00"thenn_st<=st4;elsen_st<=st2;endif;Q<="0010";
whenst4=>ifdatain="11"thenn_st<=st0;elsen_st<=st3;endif;Q<="1001";
whenothers=>n_st<=st0;
endcase;endif;
endprocess;end;56兩進程綜合結(jié)果57單進程兩進程58
例8-57.3Mealy型有限狀態(tài)機的設計1/101000/101111/101010/011010/010101/100000/110111/111010/100111/01001Q(輸出)是DATAIN(輸入)與狀態(tài)的函數(shù)DATAIN/Q輸入/輸出59
例7-5實體與說明7.3Mealy型有限狀態(tài)機的設計libraryieee;useieee.std_logic_1164.all;entitymealy1is
port(clk,datain,reset:instd_logic;Q:outstd_logic_vector(4downto0));end;architecturebhvofmealy1istypestatesis(st0,st1,st2,st3,st4);signalstx:states;begin60
例7-5主控時序與組合進程7.3Mealy型有限狀態(tài)機的設計comreg:process(clk,reset)beginifreset='1'thenstx<=st0;
elsif
clk'eventandclk='1'thencasestxis whenst0=>ifdatain='1'thenstx<=st1;endif; whenst1=>ifdatain='0'thenstx<=st2;endif; whenst2=>ifdatain='1'thenstx<=st3;endif; whenst3=>ifdatain='0'thenstx<=st4;endif; whenst4=>ifdatain='1'thenstx<=st0;endif; whenothers=>stx<=st0;endcase;endif;endprocess;61
例7-5輸出信號的進程7.3Mealy型有限狀態(tài)機的設計com1:process(stx,datain)begincasestxis whenst0=>ifdatain='1'thenQ<="10000";elseQ<="01010";endif; whenst1=>ifdatain='0'thenQ<="10111";elseQ<="10100";endif; whenst2=>ifdatain='1'thenQ<="10101";elseQ<="10011";endif; whenst3=>ifdatain='0'thenQ<="11011";elseQ<="01001";endif; whenst4=>ifdatain='1'thenQ<="11101";elseQ<="01101";endif;endcase;endprocess;end;62
例7-5可見輸出是當前輸入與當前狀態(tài)的函數(shù)。Q輸出有些毛刺現(xiàn)象。7.3Mealy型有限狀態(tài)機的設計63消除毛刺的方法是將Q鎖存后再輸出:將com1進程修改為:(mealy2.vhd)com1:process(stx,datain,clk)
variableQ2:std_logic_vector(4downto0);begincasestxis whenst0=>ifdatain='1'thenQ2:="10000";elseQ2:="01010";endif; whenst1=>ifdatain='0'thenQ2:="10111";elseQ2:="10100";endif; whenst2=>ifdatain='1'thenQ2:="10101";elseQ2:="10011";endif; whenst3=>ifdatain='0'thenQ2:="11011";elseQ2:="01001";endif; whenst4=>ifdatain='1'thenQ2:="11101";elseQ2:="01101";endif;endcase;ifclk'eventandclk='1'thenQ<=Q2;endif;endprocess;end;64輸出Q鎖存的情況65輸出Q鎖存的情況66將三進程合并一個進程:(mealy3.vhd)與mealy2.vhd效果相同comregcom1:process(clk,reset)beginifreset='1'thenstx<=st0;
elsif
clk'eventandclk='1'thencasestxis whenst0=>ifdatain='1'thenstx<=st1;endif;
ifdatain='1'thenQ<="10000";elseQ<="01010";endif; whenst1=>ifdatain='0'thenstx<=st2;endif;
ifdatain='0'thenQ<="10111";elseQ<="10100";endif; whenst2=>ifdatain='1'thenstx<=st3;endif;
ifdatain='1'thenQ<="10101";elseQ<="10011";endif; whenst3=>ifdatain='0'thenstx<=st4;endif;
ifdatain='0'thenQ<="11011";elseQ<="01001";endif; whenst4=>ifdatain='1'thenstx<=st0;endif;
ifdatain='1'thenQ<="11101";elseQ<="01101";endif; whenothers=>stx<=st0;endcase;endif;endprocess;67輸出Q鎖存的情況合并一個進程的情況68合并一個進程的情況69常用的描述方式有三種:三進程描述、雙進程描述和單進程描述。三進程描述就是指在VHDL源代碼的結(jié)構(gòu)體中,用三個進程語句來描述有限狀態(tài)機的行為:一個進程用來進行有限狀態(tài)機中的次態(tài)邏輯的描述;一個進程用來進行有限狀態(tài)機中的狀態(tài)寄存器的描述;還有一個進程用來進行狀態(tài)機中輸出邏輯的描述。所謂雙進程描述就是指在VHDL源代碼的結(jié)構(gòu)體中,用兩個進程語句來描述有限狀態(tài)機的行為:一個進程語句用來描述有限狀態(tài)中次態(tài)邏輯、狀態(tài)寄存器和輸出邏輯中的任何兩個;剩下的一個用另外的一個進程來進行描述。所謂單進程描述就是將有限狀態(tài)機中的次態(tài)邏輯、狀態(tài)寄存器和輸出邏輯在VHDL源代碼的結(jié)構(gòu)體中用一個進程來進行描述。707.2Moore型有限狀態(tài)機的設計7.2.2序列檢測器之狀態(tài)機設計
接下頁7.2Moore型有限狀態(tài)機的設計7.2.2序列檢測器之狀態(tài)機設計
接上頁7.2Moore型有限狀態(tài)機的設計7.2.2序列檢測器之狀態(tài)機設計
74前面為符號化編碼,狀態(tài)機各狀態(tài)的編碼也可以直接指定。7.4狀態(tài)編碼
狀態(tài)位直接輸出型編碼ADDA<='1';st0:ALE<='0';START<='0';OE<='0';LOCK<='0';
st1:ALE<='1';START<='1';OE<='0';LOCK<='0';st2:ALE<='0';START<='0';OE<='0';LOCK<='0';st3:ALE<='0';START<='0';OE<='1';LOCK<='0';st4:ALE<='0';START<='0';OE<='1';LOCK<='1';75采樣狀態(tài)機狀態(tài)轉(zhuǎn)換圖(復習)ADDA<='1';st0:ALE<='0';START<='0';OE<='0';LOCK<='0';
st1:ALE<='1';START<='1';OE<='0';LOCK<='0';st2:ALE<='0';START<='0';OE<='0';LOCK<='0';st3:ALE<='0';START<='0';OE<='1';LOCK<='0';st4:ALE<='0';START<='0';OE<='1';LOCK<='1';ALE:地址鎖存信號START:轉(zhuǎn)換啟動信號LOCK:輸出鎖存信號OE:輸出允許信號ADDA:通道選擇信號76VHDL描述狀態(tài)機(1)實體libraryieee;useieee.std_logic_1164.all;entityAD0809is
port(clk:in
std_logic; EOC:instd_logic; D:instd_logic_vector(7downto0); ALE:outstd_logic; START:outstd_logic; OE:outstd_logic;
ADDA:out
std_logic; lock0:outstd_logic;
C_state:outstd_logic_vector(4downto0); Q:outstd_logic_vector(7downto0));end;77VHDL描述狀態(tài)機(2)說明部分architecturebhvofAD0809is signalcurrent_state,next_state:std_logic_vector(4downto0); constantst0:std_logic_vector(4downto0):="00000"; constantst1:std_logic_vector(4downto0):="11000"; constantst2:std_logic_vector(4downto0):="00001"; constantst3:std_logic_vector(4downto0):="00100"; constantst4:std_logic_vector(4downto0):="00110"; signallock:std_logic; signalregl:std_logic_vector(7downto0);begin78VHDL描述狀態(tài)機(3)主控時序進程部分Reg:process(clk)beginif(clk'eventandclk='1')then
current_state<=next_state; endif;endprocess;79(4)主控組合進程部分
com:process(current_state,EOC) begin casecurrent_stateis whenst0=>next_state<=st1; whenst1=>next_state<=st2; whenst2=>ifEOC='0'then
next_state<=st2; elsenext_state<=st3; endif; whenst3=>next_state<=st4; whenst4=>next_state<=st0; whenothers=>next_state<=st0; endcase; endprocess;80VHDL描述狀態(tài)機(5)輔助進程部分-鎖存器latch1:process(lock)beginif(lock'eventandlock='1')then
regl<=D; endif;endprocesslatch1;81VHDL描述狀態(tài)機(6)其它
ADDA<='1'; lock0<=lock; q<=regl; start<=current_state(4); ALE<=current_state(3); OE<=current_state(2); LOCK<=current_state(1);
c_state<=current_state;827.4狀態(tài)編碼
2.順序編碼前面的編碼,狀態(tài)碼有5位,需要有5個觸發(fā)器。但由于只有5種狀態(tài),所以要求觸發(fā)器最少的話,其實只三個就夠了。用順序編碼的話:ST0:000
ST1:001
ST2:010
ST3:011
ST4:100但不同狀態(tài)下,有不同控制信號輸出,此時需要相應的譯碼電路,需要大量的組合邏輯電路。837.4狀態(tài)編碼
3.一位熱碼編碼用n個觸發(fā)器來實現(xiàn)有n個狀態(tài)的狀態(tài)機。每一個狀態(tài)都由其中一個觸發(fā)器的狀態(tài)表示。其它觸發(fā)器置為0。用順序編碼的話:ST0:10000
ST1:01000ST2:00100
ST3:00010
ST4:00001但不同狀態(tài)下,有不同控制信號輸出,此時同樣也需要相應的譯碼電路,但此時譯碼電路要簡單很多。847.5狀態(tài)機剩余狀態(tài)處理仍以前面為例。用順序編碼的話:ST0:000
ST1:001
ST2:010
ST3:011
ST4:100三個觸發(fā)器有8種狀態(tài),還有三種狀態(tài)未使用即101,110,111,這是非法狀態(tài),解決方法:1.使用Whenothers=>next_state<=st0;這樣的語句。2.為了安全起見,將剩余狀態(tài)羅列出來。
when"101"=>next_state<=st0;when"110"=>next_state<=st0;when"111"=>next_state<=st0;3.有時剩余狀態(tài)比較多,如使用1位循環(huán)熱碼。有2的5次方共32
種狀態(tài),而只用了5種狀態(tài)。如果單獨羅列就太多了??墒褂萌缦路椒z測是否進入非法狀態(tài)。
alarm<=(st0and(st1orst2orst3orst4orst5))or(st1and(st0orst2orst3orst4orst5))or(st2and(st0orst1orst3orst4orst5))or(st3and(st0orst1orst2orst4orst5))or(st4and(st0orst1orst2orst3orst5))如時alarm為高電平則進入非法狀態(tài),由此信號啟動狀態(tài)機復位。8586第6章宏功能模塊與IP應用LPM:LibraryofParameterizedModules參數(shù)可設置模塊庫在第6章中接觸到的是原理圖的使用方法,如LPM_counter數(shù)控分頻器LPM_rom
87現(xiàn)在再來看LPM文本方式調(diào)用首先由MegaWizardPlug-InManager生成需要的vhd文件。然后由原理圖調(diào)用此元件或
VHDL頂層設計中的例化元件來調(diào)用所以文本方式調(diào)用與原理圖方式調(diào)用本質(zhì)上是一樣的。886.6.1LPM_RAM模塊例如將前面的采樣狀態(tài)機,最后輸出Q[7..0]8位數(shù)據(jù),如果做成存儲示波器,需要將這些數(shù)據(jù)存在RAM中,在一定的時候RAM中的數(shù)據(jù)輸出顯示.那么就可以用LPM_RAM模塊實現(xiàn)一個雙口RAM.89Ram2.vhdFile->MegaWizardPlug-InManagerCreateanewcustommegafunctionvariation(變異)Storage->LPM_RAM_DQ->VHDL->directory\ram2.vhdQ:數(shù)據(jù)位寬度8address:地址線寬為9其它默認值90LIBRARYieee;USEieee.std_logic_1164.all;ENTITYram2IS PORT (address:INSTD_LOGIC_VECTOR(8DOWNTO0);
inclock:INSTD_LOGIC; we :INSTD_LOGIC:='1'; data :INSTD_LOGIC_VECTOR(7DOWNTO0); q:OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDram2;ARCHITECTURESYNOFram2ISSIGNALsub_wire0:STD_LOGIC_VECTOR(7DOWNTO0); COMPONENTlpm_ram_dq GENERIC(
lpm_width :NATURAL;
lpm_widthad :NATURAL;
lpm_indata :STRING;
lpm_address_control :STRING;
lpm_outdata :STRING;
lpm_hint :STRING ); 91 PORT(address:INSTD_LOGIC_VECTOR(8DOWNTO0);
inclock:INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(7DOWNTO0); data :INSTD_LOGIC_VECTOR(7DOWNTO0); we :INSTD_LOGIC); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0);
lpm_ram_dq_component:lpm_ram_dq GENERICMAP( LPM_WIDTH=>8, LPM_WIDTHAD=>9, LPM_INDATA=>"REGISTERED", LPM_ADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"UNREGISTERED", LPM_HINT=>"USE_EAB=ON" ) PORTMAP( address=>address,inclock=>inclock, data=>data,we=>we,q=>sub_wire0 );ENDSYN;92仿真可見We=‘1’時,時鐘信號的上降沿在相應的address寫入數(shù)據(jù),輸出為00,下降沿時輸出當前數(shù)據(jù)q.We=‘0’時,時鐘信號的上升沿時讀出相應address的數(shù)據(jù)q.936.6.1LPM_ROM模塊正弦信號發(fā)生器設計ROM:readonlymemory在ROM中存放正弦信號數(shù)據(jù),需要時從ROM中按順序讀出.#include"stdio.h"#include"math.h"main(){int
i;floats;for(i=0;i<64;i++){s=(cos(atan(1)*8*i/63)+1)*255/2;printf("%x:%3.0f;",i,s);}}正弦信號波形數(shù)據(jù)生成0326325594將C程序編譯生成.exe文件如rom.exe在dos下運行rom.exe>rom.txt保存在sindata.mif的文件內(nèi)容如下:WIDTH=8;--數(shù)據(jù)寬度DEPTH=64;--數(shù)據(jù)深度--此時地址線寬度可設為6位ADDRESS_RADIX=HEX;DATA_RADIX=DEC;CONTENTBEGIN00:255;01:254;02:252;03:249;04:245;05:239;06:233;07:225;08:217;09:207;0A:197;0B:186;0C:174;0D:162;0E:150;0F:137;10:124;11:112;12:99;13:87;14:75;15:64;16:53;17:43;18:34;19:26;1A:19;1B:13;1C:8;1D:4;1E:1;1F:0;20:0;21:1;22:4;23:8;24:13;25:19;26:26;27:34;28:43;29:53;2A:64;2B:75;2C:87;2D:99;2E:112;2F:124;30:137;31:150;32:162;33:174;34:186;35:197;36:207;37:217;38:225;39:233;3A:239;3B:245;3C:249;3D:252;3E:254;3F:255;END;95LPM_ROM定制,命名sindata.vhdFile->MegaWizardPlug-InManagerCreateanewcustommegafunctionvariation(變異)Storage->LPM_ROM->VHDL->directory\sindata.vhdQ:數(shù)據(jù)位寬度8address:地址線寬為6ROM中初始化文件sindata.mif,采用相對路徑.96LIBRARYieee;USEieee.std_logic_1164.all;ENTITYsindataIS PORT (address:INSTD_LOGIC_VECTOR(5DOWNTO0);
inclock:INSTD_LOGIC; q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDsindata;ARCHITECTURESYNOFsindataIS SIGNALsub_wire0 :STD_LOGIC_VECTOR(7DOWNTO0); COMPONENTlpm_rom GENERIC(
lpm_width :NATURAL;
lpm_widthad:NATURAL;
lpm_address_control :STRING;
lpm_outdata :STRING;
lpm_file :STRING ); 97 PORT(address :INSTD_LOGIC_VECTOR(5DOWNTO0);
inclock :INSTD_LOGIC; q:OUTSTD_LOGIC_VECTOR(7DOWNTO0)); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0);
lpm_rom_component:lpm_rom GENERICMAP( LPM_WIDTH=>8, LPM_WIDTHAD=>6, LPM_ADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"UNREGISTERED", LPM_FILE=>"sin_data.mif“) PORTMAP( address=>address,
inclock=>inclock, q=>sub_wire0 );ENDSYN;98仿真結(jié)果:996.6.1LPM_FIFO模塊FIFO:firstinfirstoutFile->MegaWizardPlug-InManagerCreateanewcustommegafunctionvariation(變異)Storage->LPM_FIFO->VHDL->directory\fifo2.vhd
數(shù)據(jù)位寬度8,數(shù)據(jù)深度512100LIBRARYieee;USEieee.std_logic_1164.all;ENTITYfifo2IS
PORT(data :INSTD_LOGIC_VECTOR(7DOWNTO0);
wrreq :INSTD_LOGIC;
rdreq :INSTD_LOGIC; clock :INSTD_LOGIC;
aclr :INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(7DOWNTO0); full :OUTSTD_LOGIC);ENDfifo2;ARCHITECTURESYNOFfifo2IS SIGNALsub_wire0 :STD_LOGIC_VECTOR(7DOWNTO0); SIGNALsub_wire1 :STD_LOGIC; COMPONENTlpm_fifo GENERIC(lpm_width :NATURAL;
lpm_numwords :NATURAL;
lpm_widthu :NATURAL;
lpm_showahead :STRING;
lpm_hint :STRING);101 PORT(rdreq:INSTD_LOGIC;
aclr:INSTD_LOGIC; clock:INSTD_LOGIC; q:OUTSTD_LOGIC_VECTOR(7DOWNTO0);
wrreq:INSTD_LOGIC; data:INSTD_LOGIC_VECTOR(7DOWNTO0);
ful:OUTSTD_LOGIC); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0); full<=sub_wire1;
lpm_fifo_component:lpm_fifo GENERICMAP( LPM_WIDTH=>8, LPM_NUMWORDS=>512, LPM_WIDTHU=>9, LPM_SHOWAHEAD=>"OFF", LPM_HINT=>"USE_EAB=ON,MAXIMIZE_SPEED=5“) PORTMAP(rdreq=>rdreq,aclr=>aclr, clock=>clock,wrreq=>wrreq, data=>data,q=>sub_wire0, full=>sub_wire1 );ENDSYN;102仿真結(jié)果:103104105106107108109com與reg進程分開時(mealy4.vhd)與mealy1.vhd結(jié)果一樣libraryieee;useieee.std_logic_1164.all;entitymealy4is
port(clk,datain,reset:instd_logic;Q:outstd_logic_vector(4downto0));end;architecturebhvofmealy4is typestatesis(st0,st1,st2,st3,st4);signalcurrent_state,next_state:states;begin
reg:process(clk,reset)begin ifreset='1'thencurrent_state<=st0;elseifclk'eventandclk='1'then
current_state<=next_state;endif;endif;endprocess; 110com與reg進程分開時com:process(current_state,datain)begin casecurrent_stateiswhenst0=>ifdatain='1'thennext_state<=st1;Q<="10000";elsenext_state<=st0;Q<="01010";endif; whenst1=>ifdatain='0'thennext_state<=st2;Q<="10111"; elsenext_state<=st1;Q<="10100";endif; whenst2=>ifdatain='1'thennext_state<=st3;Q<="10101"; elsenext_state<=st2;Q<="10011";endif; whenst3=>ifdatain='0'thennext_state<=st4;Q<="11011"; elsenext_state<=st3;Q<="01001";endif; whenst4=>ifdata
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年海南建筑安全員知識題庫及答案
- 中國傳統(tǒng)文化主題:對聯(lián)
- 長度與時間的測量課件
- 《電路中的能量轉(zhuǎn)化》課件
- 石油加工原油組成教學課件
- 病理生理學課件凝血和抗凝血平衡紊亂
- 一年級語文下冊《語文園地六》課件
- 《心血管急癥》課件
- 固定收益點評報告:把握跨年后的信用配置窗口
- 單位管理制度展示大全【職員管理】
- 2024年設備維修部管理制度(6篇)
- 胃鏡超聲內(nèi)鏡護理配合
- 精神科護理工作計劃例文
- 2024山地買賣合同模板
- 河北省承德市2023-2024學年高一上學期期末物理試卷(含答案)
- 【初中化學】二氧化碳的實驗室制取教學課件-2024-2025學年九年級化學人教版上冊
- 出租車行業(yè)服務質(zhì)量提升方案
- 景區(qū)安全管理教育培訓
- 工業(yè)氣瓶使用安全管理規(guī)定(5篇)
- 《高中體育與健康》考試復習題庫及答案
- 高空拋物安全宣傳教育課件
評論
0/150
提交評論