blob: cfdfe7a6cf5c36cae7affff9384128d582104db7 [file] [log] [blame]
/*
APB Wrapper for TIMER32 macro
Automatically generated from a JSON description by Mohamed Shalan
Generated at 2020-11-26 12:31:7
*/
`timescale 1ns/1ns
module APB_TIMER32 (
// APB Interface
// clock and reset
input wire PCLK,
//input wire PCLKG, // Gated clock
input wire PRESETn, // Reset
// input ports
input wire PSEL, // Select
input wire [19:2] PADDR, // Address
input wire PENABLE, // Transfer control
input wire PWRITE, // Write control
input wire [31:0] PWDATA, // Write data
// output ports
output wire [31:0] PRDATA, // Read data
output wire PREADY,
// Device ready
// IP Interface
output IRQ,
// TMR register/fields
input [31:0] TMR,
// PRE register/fields
output [31:0] PRE,
// TMRCMP register/fields
output [31:0] TMRCMP,
// TMROV register/fields
input [0:0] TMROV,
// TMROVCLR register/fields
output [0:0] TMROVCLR,
// TMREN register/fields
output [0:0] TMREN
);
wire rd_enable;
wire wr_enable;
assign rd_enable = PSEL & (~PWRITE);
assign wr_enable = PSEL & PWRITE & (PENABLE);
assign PREADY = 1'b1;
reg [31:0] PRE;
reg [31:0] TMRCMP;
reg [0:0] TMROVCLR;
reg [0:0] TMREN;
wire[31:0] TMR;
wire[0:0] TMROV;
// Register: PRE
wire PRE_select = wr_enable & (PADDR[19:2] == 18'h1);
always @(posedge PCLK or negedge PRESETn)
begin
if (~PRESETn)
PRE <= 32'h0;
else if (PRE_select)
PRE <= PWDATA;
end
// Register: TMRCMP
wire TMRCMP_select = wr_enable & (PADDR[19:2] == 18'h2);
always @(posedge PCLK or negedge PRESETn)
begin
if (~PRESETn)
TMRCMP <= 32'h0;
else if (TMRCMP_select)
TMRCMP <= PWDATA;
end
// Register: TMROVCLR
wire TMROVCLR_select = wr_enable & (PADDR[19:2] == 18'h4);
always @(posedge PCLK or negedge PRESETn)
begin
if (~PRESETn)
TMROVCLR <= 1'h0;
else if (TMROVCLR_select)
TMROVCLR <= PWDATA;
end
// Register: TMREN
wire TMREN_select = wr_enable & (PADDR[19:2] == 18'h5);
always @(posedge PCLK or negedge PRESETn)
begin
if (~PRESETn)
TMREN <= 1'h0;
else if (TMREN_select)
TMREN <= PWDATA;
end
// IRQ Enable Register @ offset 0x100
reg[0:0] IRQEN;
wire IRQEN_select = wr_enable & (PADDR[19:2] == 18'h40);
always @(posedge PCLK or negedge PRESETn)
begin
if (~PRESETn)
IRQEN <= 1'h0;
else if (IRQEN_select)
IRQEN <= PWDATA;
end
assign IRQ = ( TMROV & IRQEN[0] ) ;
assign PRDATA =
(PADDR[19:2] == 18'h0) ? TMR :
(PADDR[19:2] == 18'h1) ? PRE :
(PADDR[19:2] == 18'h2) ? TMRCMP :
(PADDR[19:2] == 18'h3) ? {31'd0,TMROV} :
(PADDR[19:2] == 18'h4) ? {31'd0,TMROVCLR} :
(PADDR[19:2] == 18'h5) ? {31'd0,TMREN} :
(PADDR[19:2] == 18'h40) ? {31'd0,IRQEN} :
32'hDEADBEEF;
endmodule