|
@@ -39,12 +39,13 @@ module top (
|
|
|
input wire clk_in
|
|
|
);
|
|
|
|
|
|
- localparam WB_N = 6;
|
|
|
- localparam WB_DW = 32;
|
|
|
- localparam WB_AW = 16;
|
|
|
- localparam WB_AI = 2;
|
|
|
+ localparam integer SPRAM_AW = 14; /* 14 => 64k, 15 => 128k */
|
|
|
+ localparam integer WB_N = 6;
|
|
|
|
|
|
- localparam SPRAM_AW = 14; /* 14 => 64k, 15 => 128k */
|
|
|
+ localparam integer WB_DW = 32;
|
|
|
+ localparam integer WB_AW = 16;
|
|
|
+ localparam integer WB_RW = WB_DW * WB_N;
|
|
|
+ localparam integer WB_MW = WB_DW / 8;
|
|
|
|
|
|
genvar i;
|
|
|
|
|
@@ -52,41 +53,15 @@ module top (
|
|
|
// Signals
|
|
|
// -------
|
|
|
|
|
|
- // Memory bus
|
|
|
- wire mem_valid;
|
|
|
- wire mem_instr;
|
|
|
- wire mem_ready;
|
|
|
- wire [31:0] mem_addr;
|
|
|
- wire [31:0] mem_rdata;
|
|
|
- wire [31:0] mem_wdata;
|
|
|
- wire [ 3:0] mem_wstrb;
|
|
|
-
|
|
|
- // RAM
|
|
|
- // BRAM
|
|
|
- wire [ 7:0] bram_addr;
|
|
|
- wire [31:0] bram_rdata;
|
|
|
- wire [31:0] bram_wdata;
|
|
|
- wire [ 3:0] bram_wmsk;
|
|
|
- wire bram_we;
|
|
|
-
|
|
|
- // SPRAM
|
|
|
- wire [14:0] spram_addr;
|
|
|
- wire [31:0] spram_rdata;
|
|
|
- wire [31:0] spram_wdata;
|
|
|
- wire [ 3:0] spram_wmsk;
|
|
|
- wire spram_we;
|
|
|
-
|
|
|
// Wishbone
|
|
|
wire [WB_AW-1:0] wb_addr;
|
|
|
- wire [WB_DW-1:0] wb_wdata;
|
|
|
- wire [(WB_DW/8)-1:0] wb_wmsk;
|
|
|
wire [WB_DW-1:0] wb_rdata [0:WB_N-1];
|
|
|
- wire [(WB_DW*WB_N)-1:0] wb_rdata_flat;
|
|
|
- wire [WB_N-1:0] wb_cyc;
|
|
|
- wire wb_we;
|
|
|
- wire [WB_N-1:0] wb_ack;
|
|
|
-
|
|
|
- // UART
|
|
|
+ wire [WB_RW-1:0] wb_rdata_flat;
|
|
|
+ wire [WB_DW-1:0] wb_wdata;
|
|
|
+ wire [WB_MW-1:0] wb_wmsk;
|
|
|
+ wire [WB_N -1:0] wb_cyc;
|
|
|
+ wire wb_we;
|
|
|
+ wire [WB_N -1:0] wb_ack;
|
|
|
|
|
|
// USB Core
|
|
|
// EP Buffer
|
|
@@ -138,94 +113,26 @@ module top (
|
|
|
// SoC
|
|
|
// ---
|
|
|
|
|
|
- // CPU
|
|
|
- picorv32 #(
|
|
|
- .PROGADDR_RESET(32'h 0000_0000),
|
|
|
- .STACKADDR(32'h 0000_0400),
|
|
|
- .BARREL_SHIFTER(0),
|
|
|
- .COMPRESSED_ISA(0),
|
|
|
- .ENABLE_COUNTERS(0),
|
|
|
- .ENABLE_MUL(0),
|
|
|
- .ENABLE_DIV(0),
|
|
|
- .ENABLE_IRQ(0),
|
|
|
- .ENABLE_IRQ_QREGS(0),
|
|
|
- .CATCH_MISALIGN(0),
|
|
|
- .CATCH_ILLINSN(0)
|
|
|
- ) cpu_I (
|
|
|
- .clk (clk_24m),
|
|
|
- .resetn (~rst),
|
|
|
- .mem_valid (mem_valid),
|
|
|
- .mem_instr (mem_instr),
|
|
|
- .mem_ready (mem_ready),
|
|
|
- .mem_addr (mem_addr),
|
|
|
- .mem_wdata (mem_wdata),
|
|
|
- .mem_wstrb (mem_wstrb),
|
|
|
- .mem_rdata (mem_rdata)
|
|
|
- );
|
|
|
-
|
|
|
- // Bus interface
|
|
|
- soc_picorv32_bridge #(
|
|
|
- .WB_N(WB_N),
|
|
|
- .WB_DW(WB_DW),
|
|
|
- .WB_AW(WB_AW),
|
|
|
- .WB_AI(WB_AI)
|
|
|
- ) pb_I (
|
|
|
- .pb_addr(mem_addr),
|
|
|
- .pb_rdata(mem_rdata),
|
|
|
- .pb_wdata(mem_wdata),
|
|
|
- .pb_wstrb(mem_wstrb),
|
|
|
- .pb_valid(mem_valid),
|
|
|
- .pb_ready(mem_ready),
|
|
|
- .bram_addr(bram_addr),
|
|
|
- .bram_rdata(bram_rdata),
|
|
|
- .bram_wdata(bram_wdata),
|
|
|
- .bram_wmsk(bram_wmsk),
|
|
|
- .bram_we(bram_we),
|
|
|
- .spram_addr(spram_addr),
|
|
|
- .spram_rdata(spram_rdata),
|
|
|
- .spram_wdata(spram_wdata),
|
|
|
- .spram_wmsk(spram_wmsk),
|
|
|
- .spram_we(spram_we),
|
|
|
- .wb_addr(wb_addr),
|
|
|
- .wb_wdata(wb_wdata),
|
|
|
- .wb_wmsk(wb_wmsk),
|
|
|
+ soc_picorv32_base #(
|
|
|
+ .WB_N (WB_N),
|
|
|
+ .WB_DW (WB_DW),
|
|
|
+ .WB_AW (WB_AW),
|
|
|
+ .SPRAM_AW(SPRAM_AW)
|
|
|
+ ) base_I (
|
|
|
+ .wb_addr (wb_addr),
|
|
|
.wb_rdata(wb_rdata_flat),
|
|
|
- .wb_cyc(wb_cyc),
|
|
|
- .wb_we(wb_we),
|
|
|
- .wb_ack(wb_ack),
|
|
|
- .clk(clk_24m),
|
|
|
- .rst(rst)
|
|
|
+ .wb_wdata(wb_wdata),
|
|
|
+ .wb_wmsk (wb_wmsk),
|
|
|
+ .wb_we (wb_we),
|
|
|
+ .wb_cyc (wb_cyc),
|
|
|
+ .wb_ack (wb_ack),
|
|
|
+ .clk (clk_24m),
|
|
|
+ .rst (rst)
|
|
|
);
|
|
|
|
|
|
for (i=0; i<WB_N; i=i+1)
|
|
|
assign wb_rdata_flat[i*WB_DW+:WB_DW] = wb_rdata[i];
|
|
|
|
|
|
- assign wb_rdata[0] = 0;
|
|
|
- assign wb_ack[0] = wb_cyc[0];
|
|
|
-
|
|
|
- // Boot memory
|
|
|
- soc_bram #(
|
|
|
- .INIT_FILE("boot.hex")
|
|
|
- ) bram_I (
|
|
|
- .addr(bram_addr),
|
|
|
- .rdata(bram_rdata),
|
|
|
- .wdata(bram_wdata),
|
|
|
- .wmsk(bram_wmsk),
|
|
|
- .we(bram_we),
|
|
|
- .clk(clk_24m)
|
|
|
- );
|
|
|
-
|
|
|
- // Main memory
|
|
|
- soc_spram #(
|
|
|
- .AW(SPRAM_AW)
|
|
|
- ) spram_I (
|
|
|
- .addr(spram_addr[SPRAM_AW-1:0]),
|
|
|
- .rdata(spram_rdata),
|
|
|
- .wdata(spram_wdata),
|
|
|
- .wmsk(spram_wmsk),
|
|
|
- .we(spram_we),
|
|
|
- .clk(clk_24m)
|
|
|
- );
|
|
|
|
|
|
|
|
|
// UART
|
|
@@ -479,6 +386,9 @@ module top (
|
|
|
boot_sel <= wb_wdata[1:0];
|
|
|
end
|
|
|
|
|
|
+ assign wb_rdata[0] = 0;
|
|
|
+ assign wb_ack[0] = wb_cyc[0];
|
|
|
+
|
|
|
// Helper
|
|
|
dfu_helper #(
|
|
|
.TIMER_WIDTH(24),
|