在NIOS II中有時需要對程序進行精確地時間測量,這時便可以采用NIOS II提供的Interval Timer Core內核進行精確到單個時鐘周期的時間測量,即Timestamp的方式。
關于該部分的基本使用,不想多贅述,可以參考http://www.cnblogs.com/yuphone/archive/2010/04/18/1714628.html
的博文。
在本人的具體使用中,由于使用的是Quartus Prime 15.1版本的軟件,Qsys中模塊的參數界面如下圖所示:
Interval Timer模塊界面
使用上圖的設置在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,表示該計數器不是連續運行的,只運行一次就結束了。
為了讓計數器能夠連續地運行,就需要自己寫寄存器,
32位寄存器表
控制寄存器表
可以看到控制寄存器的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》