新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 影響FPGA設計中時鐘因素的探討

        影響FPGA設計中時鐘因素的探討

        ——
        作者: 時間:2008-07-21 來源:電子開發網 收藏

        et ;
        input req_0 ;
        input req_1 ;
        //-------------Output Ports----------------------------
        output gnt_0 ;
        output gnt_1 ;
        //-------------Input ports Data Type-------------------
        wire clock ;
        wire reset ;
        wire req_0 ;
        wire req_1 ;
        //-------------Output Ports Data Type------------------
        reg gnt_0 ;
        reg gnt_1 ;
        //-------------Internal Constants--------------------------
        parameter SIZE = 3 ;
        parameter IDLE = 3'b001 ,
        GNT0 = 3'b010 ,
        GNT1 = 3'b100 ;
        //-------------Internal Variables---------------------------
        reg [SIZE-1:0] state ;// Seq part of the FSM
        wire [SIZE-1:0] next_state ;// combo part of FSM
        //----------Code startes Here------------------------
        assign next_state = fsm_function(req_0, req_1);
        function [SIZE-1:0] fsm_function;
        input req_0;
        input req_1;
        case(state)
        IDLE : if (req_0 == 1'b1)
        fsm_function = GNT0;
        else if (req_1 == 1'b1)
        fsm_function= GNT1;
        else
        fsm_function = IDLE;
        GNT0 : if (req_0 == 1'b1)
        fsm_function = GNT0;
        else
        fsm_function = IDLE;
        GNT1 : if (req_1 == 1'b1)
        fsm_function = GNT1;
        else
        fsm_function =IDLE;
        default : fsm_function = IDLE;
        endcase
        endfunction
        always@(posedge clock)
        begin
        if (reset == 1'b1)
        state <=IDLE;
        else
        state <=next_state;
        end
        //----------Output Logic-----------------------------
        always @ (posedge clock)
        begin
        if (reset == 1'b1) begin
        gnt_0 <= #1 1'b0;
        gnt_1 <= #1 1'b0;
        end
        else begin
        case(state)
        IDLE : begin
        gnt_0 <= #1 1'b0;
        gnt_1 <= #1 1'b0;
        end
        GNT0 : begin
        gnt_0 <= #1 1'b1;
        gnt_1 <= #1 1'b0;
        end
        GNT1 : begin
        gnt_0 <= #1 1'b0;
        gnt_1 <= #1 1'b1;
        end
        default : begin
        gnt_0 <= #1 1'b0;
        gnt_1 <= #1 1'b0;
        end
        endcase
        end
        end // End Of Block OUTPUT_
        endmodule

        本文引用地址:http://www.104case.com/article/85938.htm

          狀態機通常要寫成3段式,從而避免出現過大的組合邏輯。

          上面說的都是可以通過流水的方式切割組合邏輯的情況,但是有些情況下我們是很 難去切割組合邏輯的,在這些情況下我們又該怎么做呢?

          狀態機就是這么一個例子,我們不能通過往狀態譯碼組合邏輯中加入流水。如果我們的設計中有一個幾十個狀態的狀態機,它的狀態譯碼邏輯將非常之巨大,毫無疑問,這極有可能是設計中的關鍵路徑。那我們該怎么做呢?還是老思路,減少組合邏輯。我們可以對狀態的輸出進行分析,對它們進行重新分類,并根據這個重新定義成一組組小狀態機,通過對輸入進行選擇(case語句)并去觸發相應的小狀態機,從而實現了將大的狀態機切割成小的狀態機。在ATA6的規范中(硬盤的標準),輸入的命令大概有20十種,每一個命令又對應很多種狀態,如果用一個大的狀態機(狀態套狀態)去做那是不可想象的,我們可以通過case語句去對命令進行譯碼,并觸發相應的狀態機,這樣做下來 這一個模塊的頻率就 可以跑得比較高了。



        關鍵詞: FPGA 時鐘

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 边坝县| 惠东县| 玉林市| 鄂州市| 松原市| 吉安市| 祁阳县| 白朗县| 施秉县| 荣昌县| 炎陵县| 平遥县| 宁蒗| 长岛县| 新乐市| 秦安县| 泰宁县| 平潭县| 镇雄县| 永兴县| 阿鲁科尔沁旗| 奎屯市| 厦门市| 古蔺县| 黔南| 望奎县| 沈丘县| 金阳县| 红河县| 宜兰市| 苏尼特右旗| 蒙山县| 富顺县| 雷州市| 奉节县| 新津县| 辉县市| 丹东市| 安康市| 东乡县| 石楼县|