在NIOS II中有时需要对程序进行精确地时间测量,这时便可以采用NIOS II提供的Interval Timer Core内核进行精确到单个时钟周期的时间测量,即Timestamp的方式。
关于该部分的基本使用,不想多赘述,可以参考http://www.cnblogs.com/yuphone/archive/2010/04/18/1714628.html
的博文。
在本人的具体使用中,由于使用的是Quartus Prime 15.1版本的软件,Qsys中模块的参数界面如下图所示:
使用上图的设置在system.h生成的代码如下所示:
#define ALT_MODULE_CLASS_timerstamp altera_avalon_timer
#define TIMERSTAMP_ALWAYS_RUN 0
#define TIMERSTAMP_BASE 0x21000
#define TIMERSTAMP_COUNTER_SIZE 32
#define TIMERSTAMP_FIXED_PERIOD 0
#define TIMERSTAMP_FREQ 100000000
#define TIMERSTAMP_IRQ 1
#define TIMERSTAMP_IRQ_INTERRUPT_CONTROLLER_ID 0
#define TIMERSTAMP_LOAD_VALUE 99999
#define TIMERSTAMP_MULT 0.001
#define TIMERSTAMP_NAME "/dev/timerstamp"
#define TIMERSTAMP_PERIOD 1
#define TIMERSTAMP_PERIOD_UNITS "ms"
#define TIMERSTAMP_RESET_OUTPUT 0
#define TIMERSTAMP_SNAPSHOT 1
#define TIMERSTAMP_SPAN 32
#define TIMERSTAMP_TICKS_PER_SEC 1000
#define TIMERSTAMP_TIMEOUT_PULSE_OUTPUT 0
#define TIMERSTAMP_TYPE "altera_avalon_timer"
上面需要重点关注的是,TIMERSTAMP_ALWAYS_RUN 是0,表示该计数器不是连续运行的,只运行一次就结束了。
为了让计数器能够连续地运行,就需要自己写寄存器,
可以看到控制寄存器的bit1,即CONT位置一的时候,计数器连续运行;为零则只运行一次。
NIOS II中与寄存器的有关函数都在 altera_avalon_timer_regs.h 文件中。
NIOS II中timestamp的操作函数在 alt_timestamp.h中。
本文的参考手册包括:
《Nios II Gen2 Software Developer's Handbook》
《Embedded Peripherals IP User Guide》