中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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

        4.4.2 FSM設(shè)計實例

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


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

        module statmch1( launch_shuttle, land_shuttle, start_countdown,
        start_trip_meter, clk, all_systems_go,
        just_launched, is_landed, cnt, abort_mission
        );
        // I/O說明
        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è)置獨熱碼狀態(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è)置成某個缺省值,在下面的case語句中就不必再設(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 和輸入信號,設(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(無關(guān))或某種已
        //知狀態(tài),使其在做仿真時,在復(fù)位前就
        //與實際情況相一致
        endcase
        end // if-else語句結(jié)束
        present_state = next_state; //把當(dāng)前狀態(tài)變量設(shè)置為下一狀態(tài),
        //待下一有效時鐘沿來到時,當(dāng)前狀
        //態(tài)變量已設(shè)置了正確的狀態(tài)值
        end //always塊結(jié)束
        endmodule


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


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


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


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


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


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


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


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


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


        因此應(yīng)盡量不要使用綜合工具來設(shè)計異步狀態(tài)機。因為目前大多數(shù)綜合工具在對異步狀態(tài)機進行邏輯優(yōu)化時會胡亂地簡化邏輯,使綜合后的異步狀態(tài)機不能正常工作。如果一定要設(shè)計異步狀態(tài)機,建議采用電路圖輸入的方法,而不要用Verilog HDL輸入的方法。


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


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

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

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

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


        上一頁 1 2 3 下一頁

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

        評論


        相關(guān)推薦

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

        關(guān)閉