標籤: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