日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

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

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

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

          4.4.2 FSM設(shè)計(jì)實(shí)例

          本文引用地址:http://yuyingmama.com.cn/article/189516.htm


          例4.5:宇宙飛船控制器的狀態(tài)機(jī)。

          module statmch1( launch_shuttle, land_shuttle, start_countdown,
          start_trip_meter, clk, all_systems_go,
          just_launched, is_landed, cnt, abort_mission
          );
          // I/O說(shuō)明
          output launch_shuttle, land_shuttle, start_countdown,start_trip_meter;
          input clk, just_launched, is_landed, abort_mission,all_systems_go;
          input [3:0] cnt;
          reg launch_shuttle, land_shuttle, start_countdown,start_trip_meter;
          reg [4:0] present_state, next_state;
          //設(shè)置獨(dú)熱碼狀態(tài)的參數(shù)
          parameter HOLD=5'h1, SEQUENCE=5'h2, LAUNCH=5'h4;
          parameter ON_MISSION=5'h8, LAND=5'h10;

          always @(negedge clk or posedge abort_mission) begin
          //把輸出設(shè)置成某個(gè)缺省值,在下面的case語(yǔ)句中就不必再設(shè)置輸出的缺省值
          {launch_shuttle, land_shuttle, start_trip_meter, start_countdown} = 4'b0;
          //檢查異步reset的值,即abort_mission的值
          if(abort_mission)
          next_state = LAND;
          else begin
          //如果abort_mission為零,把next_state賦值為present_state
          next_state = present_state;
          //根據(jù) present_state 和輸入信號(hào),設(shè)置 next_state和輸出output
          case ( present_state )
          HOLD: //HOLD狀態(tài)
          if(all_systems_go) begin
          next_state = SEQUENCE;
          start_countdown = 1;
          end
          SEQUENCE: //SEQUENCE狀態(tài)
          if(cnt==0)
          next_state = LAUNCH;
          LAUNCH: begin //LAUNCH狀態(tài)
          next_state = ON_MISSION;
          launch_shuttle = 1;
          end
          ON_MISSION: //ON_MISSION狀態(tài)
          if(just_launched)
          start_trip_meter = 1; //取消使命前,一直留在使命狀態(tài)
          LAND: //LAND狀態(tài)
          if(is_landed)
          next_state = HOLD;
          else land_shuttle = 1;
          default: next_state = 'bx;//把缺省狀態(tài)設(shè)置為'bx(無(wú)關(guān))或某種已
          //知狀態(tài),使其在做仿真時(shí),在復(fù)位前就
          //與實(shí)際情況相一致
          endcase
          end // if-else語(yǔ)句結(jié)束
          present_state = next_state; //把當(dāng)前狀態(tài)變量設(shè)置為下一狀態(tài),
          //待下一有效時(shí)鐘沿來(lái)到時(shí),當(dāng)前狀
          //態(tài)變量已設(shè)置了正確的狀態(tài)值
          end //always塊結(jié)束
          endmodule


          4.4.3 設(shè)計(jì)可綜合狀態(tài)機(jī)的指導(dǎo)原則
          (1)獨(dú)熱碼。
          因?yàn)榇蠖鄶?shù)FPGA內(nèi)部的觸發(fā)器數(shù)目相當(dāng)多,又加上獨(dú)熱碼狀態(tài)機(jī)(one hot state machine)的譯碼邏輯最為簡(jiǎn)單,所以在設(shè)計(jì)采用FPGA實(shí)現(xiàn)的狀態(tài)機(jī)時(shí),往往采用獨(dú)熱碼狀態(tài)機(jī)(即每個(gè)狀態(tài)只有一個(gè)寄存器置位的狀態(tài)機(jī))。


          (2)case語(yǔ)句。
          建議采用case、casex或casez語(yǔ)句來(lái)建立狀態(tài)機(jī)的模型。因?yàn)檫@些語(yǔ)句表達(dá)清晰明了,可以方便地從當(dāng)前狀態(tài)分支轉(zhuǎn)向下一個(gè)狀態(tài)并設(shè)置輸出。


          采用這些語(yǔ)句設(shè)計(jì)狀態(tài)機(jī)時(shí),不要忘記寫(xiě)上case語(yǔ)句的最后一個(gè)分支default,并將狀態(tài)變量設(shè)為'bx。這就等于告知綜合器:case語(yǔ)句已經(jīng)指定了所有的狀態(tài)。這樣綜合器就可以刪除不需要的譯碼電路,使生成的電路簡(jiǎn)潔,并與設(shè)計(jì)要求一致。


          如果將缺省狀態(tài)設(shè)置為某一確定的狀態(tài)(例如:設(shè)置default:state = state1),行不行呢?”這樣做有一個(gè)問(wèn)題需要注意:因?yàn)楸M管綜合器產(chǎn)生的邏輯和設(shè)置“default:state='bx”時(shí)相同,但是狀態(tài)機(jī)的 模型綜合前和綜合后的仿真結(jié)果會(huì)不一致。


          為什么會(huì)是這樣呢?因?yàn)閱?dòng)仿真器時(shí),狀態(tài)機(jī)所有的輸入都不確定,因此立即進(jìn)入default狀態(tài)。如果通過(guò)設(shè)置將狀態(tài)變量設(shè)為state1,但是實(shí)際硬件電路的狀態(tài)機(jī)在通電之后,進(jìn)入的狀態(tài)是不確定的,很可能不是state1的狀態(tài),這樣就會(huì)產(chǎn)生不必要的沖突。


          因此,還是設(shè)置“default:state='bx”與實(shí)際硬件電路相一致。但在有多余狀態(tài)的情況下還是應(yīng)將缺省狀態(tài)設(shè)置為某一確定的有效狀態(tài),因?yàn)檫@樣做能使?fàn)顟B(tài)機(jī)若偶然進(jìn)入多余狀態(tài)后仍能在下一時(shí)鐘跳變沿時(shí)返回正常工作狀態(tài),否則會(huì)引起死鎖。


          (3)復(fù)位。
          狀態(tài)機(jī)應(yīng)該有一個(gè)異步或同步復(fù)位端,以便在通電時(shí)將硬件電路復(fù)位到有效狀態(tài),也可以在操作中將硬件電路復(fù)位(大多數(shù)FPGA結(jié)構(gòu)都允許使用異步復(fù)位端)。


          (4)惟一觸發(fā)。
          目前大多數(shù)綜合器往往不支持在一個(gè)always塊中由多個(gè)事件觸發(fā)的狀態(tài)機(jī)(即隱含狀態(tài)機(jī),implicit state machines)。因此為了能綜合出有效的電路,用 描述的狀態(tài)機(jī)應(yīng)明確地由惟一時(shí)鐘觸發(fā)。


          (5)異步狀態(tài)機(jī)。
          異步狀態(tài)機(jī)是沒(méi)有確定時(shí)鐘的狀態(tài)機(jī),它的狀態(tài)轉(zhuǎn)移不是由惟一的時(shí)鐘跳變沿所觸發(fā)。目前大多數(shù)綜合器不能綜合采用 描述的異步狀態(tài)機(jī)。


          因此應(yīng)盡量不要使用綜合工具來(lái)設(shè)計(jì)異步狀態(tài)機(jī)。因?yàn)槟壳按蠖鄶?shù)綜合工具在對(duì)異步狀態(tài)機(jī)進(jìn)行邏輯優(yōu)化時(shí)會(huì)胡亂地簡(jiǎn)化邏輯,使綜合后的異步狀態(tài)機(jī)不能正常工作。如果一定要設(shè)計(jì)異步狀態(tài)機(jī),建議采用電路圖輸入的方法,而不要用Verilog HDL輸入的方法。


          (6)狀態(tài)賦值。
          Verilog HDL中,狀態(tài)必須明確賦值,通常使用參數(shù)parameters或宏定義define語(yǔ)句加上賦值語(yǔ)句來(lái)實(shí)現(xiàn)。


          使用參數(shù)parameters語(yǔ)句賦狀態(tài)值如下所示:

          parameter state1 = 2 'h1, state2 = 2 'h2;
          ...
          current_state = state2; //把current state設(shè)置成 2'h2
          ...

          使用宏定義define語(yǔ)句賦狀態(tài)值如下所示:

          'define state1 2 'h1
          'define state2 2 'h2
          ...
          current_state = 'state2; //把current state設(shè)置成 2 'h2


          上一頁(yè) 1 2 3 下一頁(yè)

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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉