reg [31:0] prescale, prescalar; reg [31:0] counter, reload; reg int_enable, ovf, int_pending; always @(posedge clk) begin ovf <= (prescale == prescalar); prescale <= (ovf) ? 0: prescale+1; if (ovf) counter <= counter -1; if (counter == 0) begin int_pending <= 1; counter <= reload; end if (host_op) int_pending <= 0; end wire host_op = hwen && addr == 32; assign interrupt = int_pending && int_enable;
Timer (illustrated in RTL) : counts pre-scaled system clock. Counter: counts external event pulses (e.g. car rev counter).
Four to eight, versatile, configurable counter/timers provided in one block (only one shown in RTL).
All registers also configured as bus target read/write resources.
Interrupt cleared by host programmed I/O to host_op.