/* * top.v * * vim: ts=4 sw=4 * * Copyright (C) 2019 Sylvain Munaut * All rights reserved. * * BSD 3-clause, see LICENSE.bsd * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ `default_nettype none `include "boards.vh" module top ( // SPI inout wire spi_mosi, inout wire spi_miso, inout wire spi_clk, inout wire spi_flash_cs_n, `ifdef HAS_PSRAM inout wire spi_ram_cs_n, `endif // USB inout wire usb_dp, inout wire usb_dn, output wire usb_pu, // Debug UART input wire uart_rx, output wire uart_tx, // Button input wire btn, // LED output wire [2:0] rgb, // Clock input wire clk_in ); localparam WB_N = 6; localparam WB_DW = 32; localparam WB_AW = 16; localparam WB_AI = 2; localparam SPRAM_AW = 14; /* 14 => 64k, 15 => 128k */ genvar i; // 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 // USB Core // EP Buffer wire [ 8:0] ep_tx_addr_0; wire [31:0] ep_tx_data_0; wire ep_tx_we_0; wire [ 8:0] ep_rx_addr_0; wire [31:0] ep_rx_data_1; wire ep_rx_re_0; // Bus interface wire [11:0] ub_addr; wire [15:0] ub_wdata; wire [15:0] ub_rdata; wire ub_cyc; wire ub_we; wire ub_ack; // SPI wire [7:0] sb_addr; wire [7:0] sb_di; wire [7:0] sb_do; wire sb_rw; wire sb_stb; wire sb_ack; wire sb_irq; wire sb_wkup; wire sio_miso_o, sio_miso_oe, sio_miso_i; wire sio_mosi_o, sio_mosi_oe, sio_mosi_i; wire sio_clk_o, sio_clk_oe, sio_clk_i; wire [3:0] sio_csn_o, sio_csn_oe; // LEDs reg [4:0] led_ctrl; wire [2:0] rgb_pwm; // WarmBoot reg boot_now; reg [1:0] boot_sel; // Clock / Reset logic wire clk_24m; wire clk_48m; wire rst; // 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 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), .wb_rdata(wb_rdata_flat), .wb_cyc(wb_cyc), .wb_we(wb_we), .wb_ack(wb_ack), .clk(clk_24m), .rst(rst) ); for (i=0; i