blob: 6c3ab5285640edf3f934e5fd4cd4a0863c96f6d2 [file] [log] [blame]
Matt Venn08cd6eb2020-11-16 12:01:14 +01001`default_nettype none
shalanfd13eb52020-08-21 16:48:07 +02002module wb_intercon #(
3 parameter DW = 32, // Data Width
4 parameter AW = 32, // Address Width
5 parameter NS = 6 // Number of Slaves
6) (
7 // Master Interface
8 input [AW-1:0] wbm_adr_i,
9 input wbm_stb_i,
10
11 output reg [DW-1:0] wbm_dat_o,
12 output wbm_ack_o,
13
14 // Slave Interface
15 input [NS*DW-1:0] wbs_dat_i,
16 input [NS-1:0] wbs_ack_i,
17 output [NS-1:0] wbs_stb_o
18);
19 parameter [NS*AW-1:0] ADR_MASK = { // Page & Sub-page bits
20 {8'hFF, {24{1'b0}} },
21 {8'hFF, {24{1'b0}} },
22 {8'hFF, {24{1'b0}} },
23 {8'hFF, {24{1'b0}} },
24 {8'hFF, {24{1'b0}} },
25 {8'hFF, {24{1'b0}} }
26 };
27 parameter [NS*AW-1:0] SLAVE_ADR = {
Tim Edwards04ba17f2020-10-02 22:27:50 -040028 { 32'h2800_0000 }, // Flash Configuration Register
29 { 32'h2200_0000 }, // System Control
30 { 32'h2100_0000 }, // GPIOs
31 { 32'h2000_0000 }, // UART
32 { 32'h1000_0000 }, // Flash
33 { 32'h0000_0000 } // RAM
shalanfd13eb52020-08-21 16:48:07 +020034 };
35
36 wire [NS-1: 0] slave_sel;
37
38 // Address decoder
39 genvar iS;
40 generate
41 for (iS = 0; iS < NS; iS = iS + 1) begin
42 assign slave_sel[iS] =
43 ((wbm_adr_i & ADR_MASK[(iS+1)*AW-1:iS*AW]) == SLAVE_ADR[(iS+1)*AW-1:iS*AW]);
44 end
45 endgenerate
46
47 // Data-out Assignment
48 assign wbm_ack_o = |(wbs_ack_i & slave_sel);
49 assign wbs_stb_o = {NS{wbm_stb_i}} & slave_sel;
50
51 integer i;
52 always @(*) begin
53 wbm_dat_o = {DW{1'b0}};
54 for (i=0; i<(NS*DW); i=i+1)
55 wbm_dat_o[i%DW] = wbm_dat_o[i%DW] | (slave_sel[i/DW] & wbs_dat_i[i]);
56 end
57
Tim Edwards04ba17f2020-10-02 22:27:50 -040058endmodule
Tim Edwards581068f2020-11-19 12:45:25 -050059`default_nettype wire