<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > Verilog HDL設(shè)計進(jìn)階:有限狀態(tài)機(jī)的設(shè)計原理及其代

          Verilog HDL設(shè)計進(jìn)階:有限狀態(tài)機(jī)的設(shè)計原理及其代

          作者: 時間:2013-08-27 來源:網(wǎng)絡(luò) 收藏

          對于用FPGA實現(xiàn)的有限狀態(tài)機(jī)建議采用獨熱碼。因為雖然采用獨熱編碼多用了兩個觸發(fā)器,但所用組合電路可省下許多,因而使電路的速度和可靠性有顯著提高,而總的單元數(shù)并無顯著增加。

          本文引用地址:http://www.ex-cimer.com/article/189516.htm


          采用了獨熱碼后有了多余的狀態(tài),就有一些不可到達(dá)的狀態(tài),為此在CASE語句的最后需要增加default分支項,以確保多余狀態(tài)能回到Idle狀態(tài)。


          另外還可以用另一種風(fēng)格的 模型來表示同一個有限狀態(tài)。在這個模型中,我們用always語句和連續(xù)賦值語句把狀態(tài)機(jī)的觸發(fā)器部分和組合邏輯部分分成兩部分來描述,如下所示。


          例4.3:有限狀態(tài)機(jī)模型3

          module fsm (Clock, Reset, A, F, G); //模塊聲明
          input Clock, Reset, A;
          output F,G;
          reg [1:0] state ;
          wire [1:0] Nextstate;

          parameter //狀態(tài)聲明
          Idle = 2’b00, Start = 2’b01,
          Stop = 2’b10, Clear = 2’b11;

          always @(posedge Clock)
          if (!Reset) begin
          state = Idle; //復(fù)位狀態(tài)
          end
          else
          state = Nextstate; //狀態(tài)轉(zhuǎn)換

          assign Nextstate = //狀態(tài)變換條件
          (state == Idle ) ? (A ? Start : Idle):
          (state==Start ) ? (!A ? Stop : Start ):
          (state== Stop ) ? (A ? Clear : Stop ):
          (state== Clear) ? (!A ? Idle : Clear) : Idle;

          assign F = (( state == Stop) A ); //狀態(tài)輸出
          assign G = (( state == Clear) (!A || !Reset)) //狀態(tài)輸出
          endmodule

          下面是第4種風(fēng)格的 模型來表示同一個有限狀態(tài)。在這個模型中,我們分別用沿觸發(fā)的always語句和電平敏感的always語句把狀態(tài)機(jī)的觸發(fā)器部分和組合邏輯部分分成兩部分來描述。


          例4.4:有限狀態(tài)機(jī)模型4。

          module fsm (Clock, Reset, A, F, G); //模塊聲明
          input Clock, Reset, A;
          output F,G;
          reg [1:0] state, Nextstate;

          parameter //狀態(tài)聲明
          Idle = 2’b00, Start = 2’b01,
          Stop = 2’b10, Clear = 2’b11;

          always @(posedge Clock)
          if (!Reset) begin
          state = Idle; //默認(rèn)狀態(tài)
          end
          else
          state = Nextstate; //狀態(tài)轉(zhuǎn)換

          always @( state or A ) begin
          F=0;
          G=0;
          if (state == Idle) begin //處于Idel狀態(tài)時,對A判斷
          if (A)
          Nextstate = Start; //Start狀態(tài)
          else
          Nextstate = Idle; //保持Idel狀態(tài)
          G=1;
          end
          else if (state == Start) //處于Start狀態(tài)時,對!A判斷
          if (!A)
          Nextstate = Stop; //Stop狀態(tài)
          else
          Nextstate = Start; //保持Start狀態(tài)
          else if (state == Stop) //處于Stop狀態(tài)時,對A判斷
          if (A)
          Nextstate = Clear; //Clear狀態(tài)
          else
          Nextstate = Stop; //保持Stop狀態(tài)
          else if (state == Clear) begin //處于Clear狀態(tài)時,對!A判斷
          if (!A)
          Nextstate = Idle; //Idel狀態(tài)
          else
          Nextstate = Clear; //保持Clear狀態(tài)
          F=1;
          end
          else
          Nextstate= Idle; //默認(rèn)狀態(tài)
          End
          endmodule

          上面4個例子是同一個狀態(tài)機(jī)的4種不同的 模型,它們都是可綜合的,在設(shè)計復(fù)雜程度不同的狀態(tài)機(jī)時有它們各自的優(yōu)勢。如用不同的綜合器對這4個例子進(jìn)行綜合,綜合出的邏輯電路可能會有些不同,但邏輯功能是相同的。


          下面講解有限狀態(tài)機(jī)設(shè)計的一般步驟。


          (1)邏輯抽象,得出狀態(tài)轉(zhuǎn)換圖。
          就是把給出的一個實際邏輯關(guān)系表示為時序邏輯函數(shù),可以用狀態(tài)轉(zhuǎn)換表來描述,也可以用狀態(tài)轉(zhuǎn)換圖來描述,這就需要完成以下任務(wù)。


          ① 分析給定的邏輯問題,確定輸入變量、輸出變量以及電路的狀態(tài)數(shù)。通常是取原因(或條件)作為輸入變量,取結(jié)果作為輸出變量。
          ② 定義輸入、輸出邏輯狀態(tài)的含意,并將電路狀態(tài)順序編號。
          ③ 按照要求列出電路的狀態(tài)轉(zhuǎn)換表或畫出狀態(tài)轉(zhuǎn)換圖。
          這樣,就把給定的邏輯問題抽象到一個時序邏輯函數(shù)了。


          (2)狀態(tài)化簡。
          如果在狀態(tài)轉(zhuǎn)換圖中出現(xiàn)這樣兩個狀態(tài),它們在相同的輸入下轉(zhuǎn)換到同一狀態(tài)去,并得到一樣的輸出,則稱它們?yōu)榈葍r狀態(tài)。顯然等價狀態(tài)是重復(fù)的,可以合并為一個。電路的狀態(tài)數(shù)越少,存儲電路也就越簡單。狀態(tài)化簡的目的就在于將等價狀態(tài)盡可能地合并,以得到最簡的狀態(tài)轉(zhuǎn)換圖。


          (3)狀態(tài)分配。
          狀態(tài)分配又稱狀態(tài)編碼。通常有很多編碼方法,編碼方案選擇得當(dāng),設(shè)計的電路可以很簡單。反之,若編碼方案選得不好,則設(shè)計的電路就會復(fù)雜許多。


          實際設(shè)計時,需綜合考慮電路復(fù)雜度與電路性能之間的折衷。在觸發(fā)器資源豐富的FPGA或ASIC設(shè)計中,采用獨熱編碼(one-hot-coding)既可以使電路性能得到保證,又可充分利用其觸發(fā)器數(shù)量多的優(yōu)勢。


          (4)選定觸發(fā)器的類型并求出狀態(tài)方程、驅(qū)動方程和輸出方程。


          (5)按照方程得出邏輯圖。

          用Verilog HDL來描述有限狀態(tài)機(jī),可以充分發(fā)揮硬件描述語言的抽象建模能力,使用always塊語句和case(if)等條件語句及賦值語句即可方便實現(xiàn)。具體的邏輯化簡及邏輯電路到觸發(fā)器映射均可由計算機(jī)自動完成。上述設(shè)計步驟中的第(2)、(4)、(5)步不再需要很多的人為干預(yù),使電路設(shè)計工作得到簡化,效率也有很大的提高。



          關(guān)鍵詞: Verilog HDL 進(jìn)階 代碼

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();