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.v
module or1200_tt(
	// RISC Internal Interface
	clk, rst, du_stall, spr_cs, spr_write, spr_addr, spr_dat_i, spr_dat_o, intr
);
……

`ifdef OR1200_TT_IMPLEMENTED

`ifdef OR1200_TT_TTMR
reg	[31:0]	ttmr;                          	//TTMR寄存器
`else
wire	[31:0]	ttmr;
`endif

`ifdef OR1200_TT_TTCR
reg	[31:0]	ttcr;	                       // TTCR寄存器
`else
wire	[31:0]	ttcr;
`endif

……

//如果spr_cs为1,那么依据spr_addr的最低位判断指令l.mfspr/l.mtspr的访问目标是
//TTMR还是TTCR,ttmr_sel为1,表示访问目标是TTMR;ttcr_sel为1,表示访问目标是TTCR
assign 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等于1
assign match = (ttmr[`OR1200_TT_TTMR_TP] == ttcr[27:0]) ? 1'b1 : 1'b0;

   //当工作在Auto-retart模式,且TTMR[TP]等于TTCR[27:0]时,会设置restart为1
assign 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为1
assign stop = match &
             (ttmr[`OR1200_TT_TTMR_M] == 2'b10) | (ttmr[`OR1200_TT_TTMR_M] == 2'b00) | du_stall;

`ifdef OR1200_TT_TTMR
always @(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_TTCR
always @(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;
`else
assign ttcr = 32'b0;                         //没有设置TTCR寄存器的情况下,变量ttcr的值
`endif

always @(spr_addr or ttmr or ttcr)
	case (spr_addr[`OR1200_TTOFS_BITS])	// synopsys parallel_case
		`OR1200_TT_OFS_TTMR: spr_dat_o = ttmr;      //读TTMR
		default: spr_dat_o = ttcr;                  //读TTCR
	endcase
`else                                        //在没有配置TT模块的情况下intr始终为0,没有计时器中断
assign intr = 1'b0;
assign spr_dat_o = 32'b0;
`endif
endmodule

OR1200处理器的计时器模块TT介绍,布布扣,bubuko.com

时间: 2024-10-16 21:42:43

OR1200处理器的计时器模块TT介绍的相关文章

or1200处理器的异常处理类指令介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包括由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断(又称内中断或异常)两大类.在OR1200处理器中将中断称之为异常(exception),硬中断是其中的一种异常,当然这只是说法的不同而已.当异常发生时,有关处理器的状态信息被存储到某些寄存器,OR1200处理器转移到事先定义好的一个地址,在那个地址中往往有异常处理例程,在其中进行异常处理,这个地址称为异常处

OR1200处理器中Wishbone总线接口模块WB_BIU介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块,15.1节给出了WB_BIU模块的对外连接关系,并指出WB_BIU模块的三个作用.因为OR1200处理器支持Wishbone B3版本,所以在15.2节介绍了Wishbone B3版本中的寄存反馈总线周期,重点说明了其中的周期类型识别地址标签CTI_O/CTI_I.突发类型扩展地址标签BTE_O/BTE_I的作用. 15.1 WB_BIU模块的对外连接关系 通过

OR1200处理器的可编程中断控制器PIC分析

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 16.3可编程中断控制器PIC分析 16.3.1 PIC介绍 可编程中断控制器Programmable Interrupt Controller(PIC)用来响应各种中断事件,如:键盘事件.串口数据到达等,PIC收集所有的中断,并通知CPU中断到达,后者转入到中断处理例程进行处理.OR1200最多支持32个中断.其功能实现主要依靠两个特殊寄存器:中断屏蔽寄存器PICMR.中断状态寄存器PICSR.通过PICMR可以设置是否屏蔽某些中断,通

OR1200处理器的Store Buffer分析

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 14.1 SB模块的作用与工作过程 ICache是直接与Wishbone总线接口单元WB_BIU相连的,但是在DCache与Wishbone总线接口单元WB_BIU之间插入了一个Store Buffer(SB)模块,如图1.6所示. SB的作用是通过缓冲存储操作,从而加快存储操作.其原理是这样的:当执行存储操作时,可能需要通过WB_BIU将要写的数据写入外部Memory,尤其是在通写法模式下,每次执行存储操作都要将数据写入外部Memory

or1200处理器的数据流图

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 完整的OR1200处理器流水线数据通路图,如图9.12所示,图中显示了数据处理类.特殊寄存器访问类.转移类.异常处理类.乘法除法类.加载存储类指令处理过程中流水线各个阶段的数据流转. (1)取指阶段:GENPC模块计算指令地址,然后通过指令Wishbone总线从指令存储器中取得指令,取得的指令送入IF模块,该指令进入流水线. (2)译码阶段:取出指令需要的通用寄存器的值dataa.datab,同时对指令中可能有的立即数进行符号扩展或零扩展

Python3 基础 —— 模块 Module 介绍

1.模块的作用 在交互模式下输出的变量和函数定义,一旦终端重启后,这些定义就都不存在了,为了持久保存这些变量.函数等的定义,Python中引入了模块(Module)的概念.一个Python模块其实就是一个脚本文件,具有后缀".py",例如 hello.py 就是一个模块文件名,和普通文件一样可以被永久保存在本地存储磁盘中. 2.模块的内容 Python模块中存放的是一些程序代码,例如,变量定义.函数定义或是代码语句.下面是hello.py模块的内容,其中有一个变量 a,一个函数 fun

ERC功能模块特点介绍

ERC功能模块特点介绍 客户管理 客户自定义多级分组和等级管理首创的业务大厅协同工作处理中心首创的员工工作日记和业务跟踪管理通过客户服务中心协同各部门作业 销售管理 首创的订单处理中心和看板管理功能产销需求中心自动跟踪订单的执行适应加工型企业的特殊产销模式支持POS机开单和多仓库开单功能彻底解决开单与发货不在同一地点 采购管理 首创的采购处理中心,提供看板管理供应商客户自定义多级分组分等级在线解决采购和收货不在同一地点支持多种灵活的委外加工模式通过物料台账有效管理外加工物料 库存管理 彻底解决各

Winform开发框架中的内容及文档管理模块功能介绍

在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInform项目中利用ZetaHtmlEditControl进行HTML内容管理,以及利用TX TextControl控件进行WORD文档管理,这两方面都是我们一般进行内容和文档管理所必须的. 1.内容及文档管理模块功能介绍 整个模块,支持WInform框架和混合式开发框架两种模式,都是基于WInform

100G光模块的介绍

随着光通信行业的快速发展,用户需求的增大,早期低速率的光模块已经慢慢不能满用户的传输需求.在这样的情况之下,100G光模块市场成为了市场的焦点.100G光模块在这几年来凭借高速率和高性价而成为市场的霸主.这是一款怎样的光模块?100G QSFP28SR4光模块怎么样?好不好? 一.100G光模块的介绍 100G光模块是为了适应网络市场由10G逐渐向40G.100G发展的趋势而诞生的光模块产物,传输速率为100G,在构建100G网络系统中发挥了至关重要的作用. 二.100G光模块的技术发展 与2.