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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 影響FPGA設(shè)計中時鐘因素的探討

          影響FPGA設(shè)計中時鐘因素的探討

          ——
          作者: 時間:2008-07-21 來源:電子開發(fā)網(wǎng) 收藏

          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.ex-cimer.com/article/85938.htm

            狀態(tài)機通常要寫成3段式,從而避免出現(xiàn)過大的組合邏輯。

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

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



          關(guān)鍵詞: FPGA 時鐘

          評論


          相關(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); })();