blob: 3a2c58f68faaac88f6967957de2bfc6add7ac354 [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001module wb_intercon #(
2 parameter DW = 32, // Data Width
3 parameter AW = 32, // Address Width
4 parameter NS = 6 // Number of Slaves
5) (
6 // Master Interface
7 input [AW-1:0] wbm_adr_i,
8 input wbm_stb_i,
9
10 output reg [DW-1:0] wbm_dat_o,
11 output wbm_ack_o,
12
13 // Slave Interface
14 input [NS*DW-1:0] wbs_dat_i,
15 input [NS-1:0] wbs_ack_i,
16 output [NS-1:0] wbs_stb_o
17);
18 parameter [NS*AW-1:0] ADR_MASK = { // Page & Sub-page bits
19 {8'hFF, {24{1'b0}} },
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 };
26 parameter [NS*AW-1:0] SLAVE_ADR = {
27 {8'h28, {24{1'b0}} }, // Flash Configuration Register
28 {8'h23, {24{1'b0}} }, // System Control
29 {8'h21, {24{1'b0}} }, // GPIOs
30 {8'h20, {24{1'b0}} }, // UART
31 {8'h10, {24{1'b0}} }, // Flash
32 {8'h00, {24{1'b0}} } // RAM
33 };
34
35 wire [NS-1: 0] slave_sel;
36
37 // Address decoder
38 genvar iS;
39 generate
40 for (iS = 0; iS < NS; iS = iS + 1) begin
41 assign slave_sel[iS] =
42 ((wbm_adr_i & ADR_MASK[(iS+1)*AW-1:iS*AW]) == SLAVE_ADR[(iS+1)*AW-1:iS*AW]);
43 end
44 endgenerate
45
46 // Data-out Assignment
47 assign wbm_ack_o = |(wbs_ack_i & slave_sel);
48 assign wbs_stb_o = {NS{wbm_stb_i}} & slave_sel;
49
50 integer i;
51 always @(*) begin
52 wbm_dat_o = {DW{1'b0}};
53 for (i=0; i<(NS*DW); i=i+1)
54 wbm_dat_o[i%DW] = wbm_dat_o[i%DW] | (slave_sel[i/DW] & wbs_dat_i[i]);
55 end
56
57endmodule