源码阅读
首先是寄存器信息,RELOAD寄存器和Current VALUE寄存器和wdog基本一致,一个各个位对应不同控制信号的CTRL控制寄存器,一个中断寄存器
// Programmer's model
// 0x00 RW CTRL[3:0]
// [3] Timer Interrupt Enable
// [2] Select External input as Clock
// [1] Select External input as Enable
// [0] Enable
// 0x04 RW Current Value[31:0]
// 0x08 RW Reload Value[31:0]
// 0x0C R/Wc Timer Interrupt
// [0] Interrupt, write 1 to clear
// 0x3E0 - 0x3FC ID registers
首先获取读写操作信息,如果是写,要知道写的是CTRL,CURVAL,RELOAD,INTERRUPT那个寄存器
// Read and write control signals
assign read_enable = PSEL & (~PWRITE); // assert for whole APB read transfer
assign write_enable = PSEL & (~PENABLE) & PWRITE; // assert for 1st cycle of write transfer
assign write_enable00 = write_enable & (PADDR[11:2] == 10'h000);
assign write_enable04 = write_enable & (PADDR[11:2] == 10'h001);
assign write_enable08 = write_enable & (PADDR[11:2] == 10'h002);
assign write_enable0c = write_enable & (PADDR[11:2] == 10'h003);
对对应的寄存器(CTRL,RELOAD,CURVAL)进行写操作,注意cur_val寄存器除了要响应写操作,当计数器正常计数时,也需要随时钟更新值,这部分逻辑也在这里。
// Write operations
// Control register
always @(posedge PCLKG or negedge PRESETn)
begin
if (~PRESETn)
reg_ctrl <= {4{1'b0}};
else if (write_enable00)
reg_ctrl <= PWDATA[3:0];
end
// Current Value register
always @(posedge PCLK or negedge PRESETn)
begin
if (~PRESETn)
reg_curr_val <= {32{1'b0}};
else i