blob: 9d66e661b7a0513905143e781c34a76bb2cf401e [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001module sysctrl_wb #(
2 parameter BASE_ADR = 32'h2F00_0000,
shalanfd13eb52020-08-21 16:48:07 +02003 parameter PLL_OUT = 8'h0c,
4 parameter TRAP_OUT = 8'h10,
5 parameter IRQ7_SRC = 8'h14,
Tim Edwardsef8312e2020-09-22 17:20:06 -04006 parameter IRQ8_SRC = 8'h18
shalanfd13eb52020-08-21 16:48:07 +02007) (
8 input wb_clk_i,
9 input wb_rst_i,
10
11 input [31:0] wb_dat_i,
12 input [31:0] wb_adr_i,
13 input [3:0] wb_sel_i,
14 input wb_cyc_i,
15 input wb_stb_i,
16 input wb_we_i,
17
18 output [31:0] wb_dat_o,
19 output wb_ack_o,
20
Tim Edwardsef8312e2020-09-22 17:20:06 -040021 output pll_output_dest,
22 output trap_output_dest,
23 output irq_7_inputsrc,
24 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020025
26);
27
28 wire resetn;
29 wire valid;
30 wire ready;
31 wire [3:0] iomem_we;
32
33 assign resetn = ~wb_rst_i;
34 assign valid = wb_stb_i && wb_cyc_i;
35
36 assign iomem_we = wb_sel_i & {4{wb_we_i}};
37 assign wb_ack_o = ready;
38
39 sysctrl #(
40 .BASE_ADR(BASE_ADR),
shalanfd13eb52020-08-21 16:48:07 +020041 .PLL_OUT(PLL_OUT),
42 .TRAP_OUT(TRAP_OUT),
43 .IRQ7_SRC(IRQ7_SRC),
Tim Edwardsef8312e2020-09-22 17:20:06 -040044 .IRQ8_SRC(IRQ8_SRC)
shalanfd13eb52020-08-21 16:48:07 +020045 ) sysctrl (
46 .clk(wb_clk_i),
47 .resetn(resetn),
48
shalanfd13eb52020-08-21 16:48:07 +020049 .iomem_addr(wb_adr_i),
50 .iomem_valid(valid),
51 .iomem_wstrb(iomem_we),
52 .iomem_wdata(wb_dat_i),
53 .iomem_rdata(wb_dat_o),
54 .iomem_ready(ready),
55
shalanfd13eb52020-08-21 16:48:07 +020056 .pll_output_dest(pll_output_dest),
57 .trap_output_dest(trap_output_dest),
58
59 .irq_7_inputsrc(irq_7_inputsrc),
Tim Edwardsef8312e2020-09-22 17:20:06 -040060 .irq_8_inputsrc(irq_8_inputsrc)
shalanfd13eb52020-08-21 16:48:07 +020061 );
62
63endmodule
64
65module sysctrl #(
66 parameter BASE_ADR = 32'h2300_0000,
shalanfd13eb52020-08-21 16:48:07 +020067 parameter PLL_OUT = 8'h0c,
68 parameter TRAP_OUT = 8'h10,
69 parameter IRQ7_SRC = 8'h14,
Tim Edwardsef8312e2020-09-22 17:20:06 -040070 parameter IRQ8_SRC = 8'h18
shalanfd13eb52020-08-21 16:48:07 +020071) (
72 input clk,
73 input resetn,
74
shalanfd13eb52020-08-21 16:48:07 +020075 input [31:0] iomem_addr,
76 input iomem_valid,
77 input [3:0] iomem_wstrb,
78 input [31:0] iomem_wdata,
79 output reg [31:0] iomem_rdata,
80 output reg iomem_ready,
81
Tim Edwardsef8312e2020-09-22 17:20:06 -040082 output pll_output_dest,
83 output trap_output_dest,
84 output irq_7_inputsrc,
85 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020086);
shalanfd13eb52020-08-21 16:48:07 +020087
Tim Edwardsef8312e2020-09-22 17:20:06 -040088 reg pll_output_dest;
89 reg trap_output_dest;
90 reg irq_7_inputsrc;
91 reg irq_8_inputsrc;
92
shalanfd13eb52020-08-21 16:48:07 +020093 assign pll_out_sel = (iomem_addr[7:0] == PLL_OUT);
94 assign trap_out_sel = (iomem_addr[7:0] == TRAP_OUT);
shalanfd13eb52020-08-21 16:48:07 +020095
96 assign irq7_sel = (iomem_addr[7:0] == IRQ7_SRC);
97 assign irq8_sel = (iomem_addr[7:0] == IRQ8_SRC);
98
shalanfd13eb52020-08-21 16:48:07 +020099 always @(posedge clk) begin
100 if (!resetn) begin
shalanfd13eb52020-08-21 16:48:07 +0200101 pll_output_dest <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200102 trap_output_dest <= 0;
103 irq_7_inputsrc <= 0;
104 irq_8_inputsrc <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200105 end else begin
106 iomem_ready <= 0;
107 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
108 iomem_ready <= 1'b 1;
109
Tim Edwardsef8312e2020-09-22 17:20:06 -0400110 if (pll_out_sel) begin
111 iomem_rdata <= {31'd0, pll_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200112 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400113 pll_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200114
115 end else if (trap_out_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400116 iomem_rdata <= {31'd0, trap_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200117 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400118 trap_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200119
120 end else if (irq7_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400121 iomem_rdata <= {31'd0, irq_7_inputsrc};
shalanfd13eb52020-08-21 16:48:07 +0200122 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400123 irq_7_inputsrc <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200124
125 end else if (irq8_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400126 iomem_rdata <= {31'd0, irq_8_inputsrc};
shalanfd13eb52020-08-21 16:48:07 +0200127 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400128 irq_8_inputsrc <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200129
130 end
131 end
132 end
133 end
134
Tim Edwardsef8312e2020-09-22 17:20:06 -0400135endmodule