blob: 05861cd2d5be72a47ced4480b5fa457d66ed5322 [file] [log] [blame]
shalan114091e2020-08-21 16:48:07 +02001module sysctrl_wb #(
2 parameter BASE_ADR = 32'h2F00_0000,
shalan114091e2020-08-21 16:48:07 +02003 parameter PLL_OUT = 8'h0c,
4 parameter TRAP_OUT = 8'h10,
5 parameter IRQ7_SRC = 8'h14,
Tim Edwards9f385692020-09-22 17:20:06 -04006 parameter IRQ8_SRC = 8'h18
shalan114091e2020-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 Edwards9f385692020-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
shalan114091e2020-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),
shalan114091e2020-08-21 16:48:07 +020041 .PLL_OUT(PLL_OUT),
42 .TRAP_OUT(TRAP_OUT),
43 .IRQ7_SRC(IRQ7_SRC),
Tim Edwards9f385692020-09-22 17:20:06 -040044 .IRQ8_SRC(IRQ8_SRC)
shalan114091e2020-08-21 16:48:07 +020045 ) sysctrl (
46 .clk(wb_clk_i),
47 .resetn(resetn),
48
shalan114091e2020-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
shalan114091e2020-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 Edwards9f385692020-09-22 17:20:06 -040060 .irq_8_inputsrc(irq_8_inputsrc)
shalan114091e2020-08-21 16:48:07 +020061 );
62
63endmodule
64
65module sysctrl #(
66 parameter BASE_ADR = 32'h2300_0000,
shalan114091e2020-08-21 16:48:07 +020067 parameter PLL_OUT = 8'h0c,
68 parameter TRAP_OUT = 8'h10,
69 parameter IRQ7_SRC = 8'h14,
Tim Edwards9f385692020-09-22 17:20:06 -040070 parameter IRQ8_SRC = 8'h18
shalan114091e2020-08-21 16:48:07 +020071) (
72 input clk,
73 input resetn,
74
shalan114091e2020-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 Edwards9f385692020-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
shalan114091e2020-08-21 16:48:07 +020086);
shalan114091e2020-08-21 16:48:07 +020087
Tim Edwards9f385692020-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
shalan114091e2020-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);
95 assign xtal_out_sel = (iomem_addr[7:0] == XTAL_OUT);
96
97 assign irq7_sel = (iomem_addr[7:0] == IRQ7_SRC);
98 assign irq8_sel = (iomem_addr[7:0] == IRQ8_SRC);
99
shalan114091e2020-08-21 16:48:07 +0200100 always @(posedge clk) begin
101 if (!resetn) begin
shalan114091e2020-08-21 16:48:07 +0200102 pll_output_dest <= 0;
shalan114091e2020-08-21 16:48:07 +0200103 trap_output_dest <= 0;
104 irq_7_inputsrc <= 0;
105 irq_8_inputsrc <= 0;
shalan114091e2020-08-21 16:48:07 +0200106 end else begin
107 iomem_ready <= 0;
108 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
109 iomem_ready <= 1'b 1;
110
Tim Edwards9f385692020-09-22 17:20:06 -0400111 if (pll_out_sel) begin
112 iomem_rdata <= {31'd0, pll_output_dest};
shalan114091e2020-08-21 16:48:07 +0200113 if (iomem_wstrb[0])
Tim Edwards9f385692020-09-22 17:20:06 -0400114 pll_output_dest <= iomem_wdata[0];
shalan114091e2020-08-21 16:48:07 +0200115
116 end else if (trap_out_sel) begin
Tim Edwards9f385692020-09-22 17:20:06 -0400117 iomem_rdata <= {31'd0, trap_output_dest};
shalan114091e2020-08-21 16:48:07 +0200118 if (iomem_wstrb[0])
Tim Edwards9f385692020-09-22 17:20:06 -0400119 trap_output_dest <= iomem_wdata[0];
shalan114091e2020-08-21 16:48:07 +0200120
121 end else if (irq7_sel) begin
Tim Edwards9f385692020-09-22 17:20:06 -0400122 iomem_rdata <= {31'd0, irq_7_inputsrc};
shalan114091e2020-08-21 16:48:07 +0200123 if (iomem_wstrb[0])
Tim Edwards9f385692020-09-22 17:20:06 -0400124 irq_7_inputsrc <= iomem_wdata[0];
shalan114091e2020-08-21 16:48:07 +0200125
126 end else if (irq8_sel) begin
Tim Edwards9f385692020-09-22 17:20:06 -0400127 iomem_rdata <= {31'd0, irq_8_inputsrc};
shalan114091e2020-08-21 16:48:07 +0200128 if (iomem_wstrb[0])
Tim Edwards9f385692020-09-22 17:20:06 -0400129 irq_8_inputsrc <= iomem_wdata[0];
shalan114091e2020-08-21 16:48:07 +0200130
131 end
132 end
133 end
134 end
135
Tim Edwards9f385692020-09-22 17:20:06 -0400136endmodule