blob: 62ed4fc08110935c7a4d8e31ed3d24b78df1b6ff [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,
Tim Edwards04ba17f2020-10-02 22:27:50 -04005 parameter IRQ7_SRC = 8'h14
shalanfd13eb52020-08-21 16:48:07 +02006) (
7 input wb_clk_i,
8 input wb_rst_i,
9
10 input [31:0] wb_dat_i,
11 input [31:0] wb_adr_i,
12 input [3:0] wb_sel_i,
13 input wb_cyc_i,
14 input wb_stb_i,
15 input wb_we_i,
16
17 output [31:0] wb_dat_o,
18 output wb_ack_o,
19
Tim Edwardsef8312e2020-09-22 17:20:06 -040020 output pll_output_dest,
21 output trap_output_dest,
Tim Edwards04ba17f2020-10-02 22:27:50 -040022 output irq_7_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020023
24);
25
26 wire resetn;
27 wire valid;
28 wire ready;
29 wire [3:0] iomem_we;
30
31 assign resetn = ~wb_rst_i;
32 assign valid = wb_stb_i && wb_cyc_i;
33
34 assign iomem_we = wb_sel_i & {4{wb_we_i}};
35 assign wb_ack_o = ready;
36
37 sysctrl #(
38 .BASE_ADR(BASE_ADR),
shalanfd13eb52020-08-21 16:48:07 +020039 .PLL_OUT(PLL_OUT),
40 .TRAP_OUT(TRAP_OUT),
Tim Edwards04ba17f2020-10-02 22:27:50 -040041 .IRQ7_SRC(IRQ7_SRC)
shalanfd13eb52020-08-21 16:48:07 +020042 ) sysctrl (
43 .clk(wb_clk_i),
44 .resetn(resetn),
45
shalanfd13eb52020-08-21 16:48:07 +020046 .iomem_addr(wb_adr_i),
47 .iomem_valid(valid),
48 .iomem_wstrb(iomem_we),
49 .iomem_wdata(wb_dat_i),
50 .iomem_rdata(wb_dat_o),
51 .iomem_ready(ready),
52
shalanfd13eb52020-08-21 16:48:07 +020053 .pll_output_dest(pll_output_dest),
54 .trap_output_dest(trap_output_dest),
55
Tim Edwards04ba17f2020-10-02 22:27:50 -040056 .irq_7_inputsrc(irq_7_inputsrc)
shalanfd13eb52020-08-21 16:48:07 +020057 );
58
59endmodule
60
61module sysctrl #(
62 parameter BASE_ADR = 32'h2300_0000,
shalanfd13eb52020-08-21 16:48:07 +020063 parameter PLL_OUT = 8'h0c,
64 parameter TRAP_OUT = 8'h10,
Tim Edwards04ba17f2020-10-02 22:27:50 -040065 parameter IRQ7_SRC = 8'h14
shalanfd13eb52020-08-21 16:48:07 +020066) (
67 input clk,
68 input resetn,
69
shalanfd13eb52020-08-21 16:48:07 +020070 input [31:0] iomem_addr,
71 input iomem_valid,
72 input [3:0] iomem_wstrb,
73 input [31:0] iomem_wdata,
74 output reg [31:0] iomem_rdata,
75 output reg iomem_ready,
76
Tim Edwardsef8312e2020-09-22 17:20:06 -040077 output pll_output_dest,
78 output trap_output_dest,
Tim Edwards04ba17f2020-10-02 22:27:50 -040079 output irq_7_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020080);
shalanfd13eb52020-08-21 16:48:07 +020081
Tim Edwardsef8312e2020-09-22 17:20:06 -040082 reg pll_output_dest;
83 reg trap_output_dest;
84 reg irq_7_inputsrc;
Tim Edwardsef8312e2020-09-22 17:20:06 -040085
shalanfd13eb52020-08-21 16:48:07 +020086 assign pll_out_sel = (iomem_addr[7:0] == PLL_OUT);
87 assign trap_out_sel = (iomem_addr[7:0] == TRAP_OUT);
shalanfd13eb52020-08-21 16:48:07 +020088
89 assign irq7_sel = (iomem_addr[7:0] == IRQ7_SRC);
shalanfd13eb52020-08-21 16:48:07 +020090
shalanfd13eb52020-08-21 16:48:07 +020091 always @(posedge clk) begin
92 if (!resetn) begin
shalanfd13eb52020-08-21 16:48:07 +020093 pll_output_dest <= 0;
shalanfd13eb52020-08-21 16:48:07 +020094 trap_output_dest <= 0;
95 irq_7_inputsrc <= 0;
shalanfd13eb52020-08-21 16:48:07 +020096 end else begin
97 iomem_ready <= 0;
98 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
99 iomem_ready <= 1'b 1;
100
Tim Edwardsef8312e2020-09-22 17:20:06 -0400101 if (pll_out_sel) begin
102 iomem_rdata <= {31'd0, pll_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200103 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400104 pll_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200105
106 end else if (trap_out_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400107 iomem_rdata <= {31'd0, trap_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200108 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400109 trap_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200110
111 end else if (irq7_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400112 iomem_rdata <= {31'd0, irq_7_inputsrc};
shalanfd13eb52020-08-21 16:48:07 +0200113 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400114 irq_7_inputsrc <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200115
shalanfd13eb52020-08-21 16:48:07 +0200116 end
117 end
118 end
119 end
120
Tim Edwardsef8312e2020-09-22 17:20:06 -0400121endmodule