OR1200處理器的計時器模組TT介紹

來源:互聯網
上載者:User

標籤:or1200 openrisc 軟核處理   or1200 軟核處理器   tt 定時器模組   處理器   軟核   

以下內容摘自《步步驚芯——軟核處理器內部設計分析》一書

 

16.2.1 TT介紹

      計時器模組(Tick Timer:TT)一般用在作業系統的進程調度、使用者程式的定時參考等。TT內部會對刻度計數,當計數值達到一個預設值時,會產生中斷,通知處理器進行處理。其實現的主體是兩個特殊寄存器:計時器單元計數寄存器TTCR、計時器單元模式寄存器TTMR,通過這兩個SPR的不同配置,實現不同的工作模式,以及計時中斷的產生。TTCR、TTMR是第10組特殊寄存器,如表16.4所示。TTCR、TTMR的格式分別如表16.5、16.6所示。

      TTMR中各個標誌位的含義如下:

  •   TP:預設的計時器周期,範圍是0x0-0xFFFFFFF
  •   IP:為1表示有計時器中斷等待處理
  •   IE:為1表示允許計時器產生中斷,反之計時器不會產生中斷
  •   M:計時器的工作模式

      其中TTMR[M]的值決定了計時器的工作模式,共有4種工作模式,每種模式下計時器的工作過程如下:

      (1)自動重新開始模式Auto-restart Mode

      TTMR[M]等於2’b01時,TT工作於自動重新開始模式,在這種模式下,當TTCR[27:0]的值等於TTMR[TP]的值時,會將TTCR清零,然後繼續計時,如果TTMR[IE]為1,那麼還會聲明計時器中斷。

      (2)一次計時模式One-shot Mode

      TTMR[M]等於2’b10時,TT工作於一次計時模式,在這種模式下,當TTCR[27:0]的值等於TTMR[TP]的值時,會停止計時,如果TTMR[IE]為1,那麼還會聲明計時器中斷。改寫TTCR後,可以繼續計時。

      (3)連續計時模式Continuous Mode

      TTMR[M]等於2’b11時,TT工作於連續計時模式,在這種模式下,當TTCR[27:0]的值等於TTMR[TP]的值時,會繼續計時,也就是TTCR的值繼續累加,如果TTMR[IE]為1,那麼還會聲明計時器中斷。

      (4)計時器停止模式Stop Mode

      TTMR[M]等於2’b00時,TT停止工作。

      上述各種模式下,聲明計時器中斷實際就是設定TTMR[IP]的值為1,處理器響應計時器中斷後會進入計時器中斷處理常式,但是TTMR[IP]不會自動清零,需要通程式過向TTMR[IP]寫入0的方式清零。

16.2.2 TT的對外串連關係及相關宏定義

      OR1200中計時器模組TT的對外串連關係16.2所示,通過箭頭方向表示該訊號是輸入還是輸出。以spr_xxx開始的介面都是與特殊寄存器讀寫有關的訊號,含義也很明了,此外,intr為1表示計時器中斷髮生,該訊號輸出到CPU模組的介面sig_tick。

      OR1200中與計時器有關的宏定義如下:

or1200_defines.v`define OR1200_TT_IMPLEMENTED                //是否實施TT模組,TT模組是可選模組`define OR1200_TT_OFS_TTMR 1'd0              //TTMR、TTCR寄存器在第10組特殊寄存器中的索引            `define OR1200_TT_OFS_TTCR 1'd1`define OR1200_TTOFS_BITS 0`define OR1200_TT_TTMR                       //需要定義這個宏才能使用TTMR寄存器`define OR1200_TT_TTCR                       //需要定義這個宏才能使用TTCR寄存器`define OR1200_TT_TTMR_TP 27:0               //TTMR中各個標識位的位移`define OR1200_TT_TTMR_IP 28`define OR1200_TT_TTMR_IE 29`define OR1200_TT_TTMR_M 31:30`define OR1200_TT_READREGS                    //有了這個宏定義標識,才可以讀TT中的特殊寄存器TTMR、TTCR


 

16.2.3 TT程式碼分析

      TT的代碼主要就是配置計時器不同的工作模式,並在各種工作模式下改變TTCR、控制計時器中斷的產生。程式碼分析如下(為了便於理解,筆者改變了代碼順序):

or1200_tt.vmodule or1200_tt(// RISC Internal Interfaceclk, rst, du_stall, spr_cs, spr_write, spr_addr, spr_dat_i, spr_dat_o, intr);……`ifdef OR1200_TT_IMPLEMENTED`ifdef OR1200_TT_TTMRreg[31:0]ttmr;                          //TTMR寄存器                        `elsewire[31:0]ttmr;`endif`ifdef OR1200_TT_TTCRreg[31:0]ttcr;                       // TTCR寄存器`elsewire[31:0]ttcr;`endif……//如果spr_cs為1,那麼依據spr_addr的最低位判斷指令l.mfspr/l.mtspr的訪問目標是//TTMR還是TTCR,ttmr_sel為1,表示訪問目標是TTMR;ttcr_sel為1,表示訪問目標是TTCRassign ttmr_sel = (spr_cs && (spr_addr[`OR1200_TTOFS_BITS] == `OR1200_TT_OFS_TTMR)) ?                   1'b1 : 1'b0;assign ttcr_sel = (spr_cs && (spr_addr[`OR1200_TTOFS_BITS] == `OR1200_TT_OFS_TTCR)) ?                   1'b1 : 1'b0;//當TTMR[TP]等於TTCR[27:0]時,match等於1assign match = (ttmr[`OR1200_TT_TTMR_TP] == ttcr[27:0]) ? 1'b1 : 1'b0;   //當工作在Auto-retart模式,且TTMR[TP]等於TTCR[27:0]時,會設定restart為1assign restart = match && (ttmr[`OR1200_TT_TTMR_M] == 2'b01);//stop為1的情況有三種:(1)當工作在One-shot模式,且TTMR[TP]等於TTCR[27:0]時,//會停止計時,設定stop為1;(2)當TTMR[M]為2’b00時,計時器不工作,stop為1;//(3)外部中斷單元設定定時器停止,此時du_stall為1assign stop = match &              (ttmr[`OR1200_TT_TTMR_M] == 2'b10) | (ttmr[`OR1200_TT_TTMR_M] == 2'b00) | du_stall;`ifdef OR1200_TT_TTMRalways @(posedge clk or `OR1200_RST_EVENT rst)   if (rst == `OR1200_RST_VALUE)  ttmr <= 32'b0;   else if (ttmr_sel && spr_write)               ttmr <=  spr_dat_i;                //如果ttmr_sel為1,且spr_write為1,表示寫TTMR   else if (ttmr[`OR1200_TT_TTMR_IE])      // TTMR[IE]為1表示中斷使能,那麼當match等於1時,                                             //會設定TTMR[IP]為1,並且TTMR[IP]的值不會自動清零ttmr[`OR1200_TT_TTMR_IP] <=  ttmr[`OR1200_TT_TTMR_IP] | (match & ttmr[`OR1200_TT_TTMR_IE]);`else  assign ttmr = {2'b11, 30'b0};       //沒有設定TTMR寄存器的情況下,變數ttmr的值`endif//從圖16.2可知intr串連至CPU的輸入sig_tick介面,intr的值就是TTMR[IP]的值,表示計時器中斷是否發生assign intr = ttmr[`OR1200_TT_TTMR_IP];`ifdef OR1200_TT_TTCRalways @(posedge clk or `OR1200_RST_EVENT rst)   if (rst == `OR1200_RST_VALUE) ttcr <= 32'b0;   else if (restart)            //當工作在Auto-restart模式,且TTMR[TP]等於TTCR[27:0]                                  //時會設定restart為1,此時將TTCR清零,重新開始計數  ttcr <=  32'b0;   else if (ttcr_sel && spr_write)              //ttcr_sel為1,且spr_write為1,表示寫TTCR寄存器 ttcr <=  spr_dat_i;   else if (!stop)                              //只要stop不為1,那麼每個刻度TTCR的值加1 ttcr <=  ttcr + 32'd1;`elseassign ttcr = 32'b0;                         //沒有設定TTCR寄存器的情況下,變數ttcr的值`endifalways @(spr_addr or ttmr or ttcr)case (spr_addr[`OR1200_TTOFS_BITS])// synopsys parallel_case`OR1200_TT_OFS_TTMR: spr_dat_o = ttmr;      //讀TTMRdefault: spr_dat_o = ttcr;                  //讀TTCRendcase`else                                        //在沒有配置TT模組的情況下intr始終為0,沒有計時器中斷assign intr = 1'b0;assign spr_dat_o = 32'b0;`endifendmodule


 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.