OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /altor32/trunk/rtl/soc
    from Rev 27 to Rev 32
    Reverse comparison

Rev 27 → Rev 32

/dmem_mux3.v
1,3 → 1,39
//-----------------------------------------------------------------
// AltOR32
// Alternative Lightweight OpenRisc
// V2.0
// Ultra-Embedded.com
// Copyright 2011 - 2013
//
// Email: admin@ultra-embedded.com
//
// License: LGPL
//-----------------------------------------------------------------
//
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
//
// This source file may be used and distributed without
// restriction provided that this copyright statement is not
// removed from the file and that any derivative work contains
// the original copyright notice and the associated disclaimer.
//
// This source file is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any
// later version.
//
// This source is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General
// Public License along with this source; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330,
// Boston, MA 02111-1307 USA
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// Module:
5,40 → 41,50
module dmem_mux3
(
// Outputs
out0_addr_o,
out0_data_o,
out0_data_i,
out0_wr_o,
out0_rd_o,
out0_burst_o,
out0_ack_i,
out0_accept_i,
out1_addr_o,
out1_data_o,
out1_data_i,
out1_wr_o,
out1_rd_o,
out1_burst_o,
out1_ack_i,
out1_accept_i,
out2_addr_o,
out2_data_o,
out2_data_i,
out2_wr_o,
out2_rd_o,
out2_burst_o,
out2_ack_i,
out2_accept_i,
output reg [31:0] out0_addr_o,
output reg [31:0] out0_data_o,
input [31:0] out0_data_i,
output reg [3:0] out0_sel_o,
output reg out0_we_o,
output reg out0_stb_o,
output reg out0_cyc_o,
output reg [2:0] out0_cti_o,
input out0_ack_i,
input out0_stall_i,
 
output reg [31:0] out1_addr_o,
output reg [31:0] out1_data_o,
input [31:0] out1_data_i,
output reg [3:0] out1_sel_o,
output reg out1_we_o,
output reg out1_stb_o,
output reg out1_cyc_o,
output reg [2:0] out1_cti_o,
input out1_ack_i,
input out1_stall_i,
 
output reg [31:0] out2_addr_o,
output reg [31:0] out2_data_o,
input [31:0] out2_data_i,
output reg [3:0] out2_sel_o,
output reg out2_we_o,
output reg out2_stb_o,
output reg out2_cyc_o,
output reg [2:0] out2_cti_o,
input out2_ack_i,
input out2_stall_i,
 
// Input
mem_addr_i,
mem_data_i,
mem_data_o,
mem_burst_i,
mem_wr_i,
mem_rd_i,
mem_ack_o,
mem_accept_o
input [31:0] mem_addr_i,
input [31:0] mem_data_i,
output reg[31:0] mem_data_o,
input [3:0] mem_sel_i,
input mem_we_i,
input mem_stb_i,
input mem_cyc_i,
input [2:0] mem_cti_i,
output reg mem_ack_o,
output reg mem_stall_o
);
 
//-----------------------------------------------------------------
47,87 → 93,32
parameter ADDR_MUX_START = 28;
 
//-----------------------------------------------------------------
// I/O
// Request
//-----------------------------------------------------------------
input [31:0] mem_addr_i /*verilator public*/;
input [31:0] mem_data_i /*verilator public*/;
output [31:0] mem_data_o /*verilator public*/;
input [3:0] mem_wr_i /*verilator public*/;
input mem_rd_i /*verilator public*/;
input mem_burst_i /*verilator public*/;
output mem_ack_o /*verilator public*/;
output mem_accept_o /*verilator public*/;
output [31:0] out0_addr_o /*verilator public*/;
output [31:0] out0_data_o /*verilator public*/;
input [31:0] out0_data_i /*verilator public*/;
output [3:0] out0_wr_o /*verilator public*/;
output out0_rd_o /*verilator public*/;
output out0_burst_o /*verilator public*/;
input out0_ack_i /*verilator public*/;
input out0_accept_i /*verilator public*/;
output [31:0] out1_addr_o /*verilator public*/;
output [31:0] out1_data_o /*verilator public*/;
input [31:0] out1_data_i /*verilator public*/;
output [3:0] out1_wr_o /*verilator public*/;
output out1_rd_o /*verilator public*/;
output out1_burst_o /*verilator public*/;
input out1_ack_i /*verilator public*/;
input out1_accept_i /*verilator public*/;
output [31:0] out2_addr_o /*verilator public*/;
output [31:0] out2_data_o /*verilator public*/;
input [31:0] out2_data_i /*verilator public*/;
output [3:0] out2_wr_o /*verilator public*/;
output out2_rd_o /*verilator public*/;
output out2_burst_o /*verilator public*/;
input out2_ack_i /*verilator public*/;
input out2_accept_i /*verilator public*/;
 
//-----------------------------------------------------------------
// Registers
//-----------------------------------------------------------------
 
// Output Signals
reg mem_ack_o;
reg mem_accept_o;
reg [31:0] mem_data_o;
 
reg [31:0] out0_addr_o;
reg [31:0] out0_data_o;
reg [3:0] out0_wr_o;
reg out0_rd_o;
reg out0_burst_o;
reg [31:0] out1_addr_o;
reg [31:0] out1_data_o;
reg [3:0] out1_wr_o;
reg out1_rd_o;
reg out1_burst_o;
reg [31:0] out2_addr_o;
reg [31:0] out2_data_o;
reg [3:0] out2_wr_o;
reg out2_rd_o;
reg out2_burst_o;
 
//-----------------------------------------------------------------
// Memory Map
//-----------------------------------------------------------------
always @ (mem_addr_i or mem_wr_i or mem_rd_i or mem_data_i or mem_burst_i)
always @ *
begin
 
out0_addr_o = 32'h00000000;
out0_wr_o = 4'b0000;
out0_rd_o = 1'b0;
out0_data_o = 32'h00000000;
out0_burst_o = 1'b0;
out0_sel_o = 4'b0000;
out0_we_o = 1'b0;
out0_stb_o = 1'b0;
out0_cyc_o = 1'b0;
out0_cti_o = 3'b0;
out1_addr_o = 32'h00000000;
out1_wr_o = 4'b0000;
out1_rd_o = 1'b0;
out1_data_o = 32'h00000000;
out1_burst_o = 1'b0;
out1_sel_o = 4'b0000;
out1_we_o = 1'b0;
out1_stb_o = 1'b0;
out1_cyc_o = 1'b0;
out1_cti_o = 3'b0;
out2_addr_o = 32'h00000000;
out2_wr_o = 4'b0000;
out2_rd_o = 1'b0;
out2_data_o = 32'h00000000;
out2_burst_o = 1'b0;
out2_sel_o = 4'b0000;
out2_we_o = 1'b0;
out2_stb_o = 1'b0;
out2_cyc_o = 1'b0;
out2_cti_o = 3'b0;
 
case (mem_addr_i[ADDR_MUX_START+2-1:ADDR_MUX_START])
 
134,26 → 125,32
2'd0:
begin
out0_addr_o = mem_addr_i;
out0_wr_o = mem_wr_i;
out0_rd_o = mem_rd_i;
out0_data_o = mem_data_i;
out0_burst_o = mem_burst_i;
out0_sel_o = mem_sel_i;
out0_we_o = mem_we_i;
out0_stb_o = mem_stb_i;
out0_cyc_o = mem_cyc_i;
out0_cti_o = mem_cti_i;
end
2'd1:
begin
out1_addr_o = mem_addr_i;
out1_wr_o = mem_wr_i;
out1_rd_o = mem_rd_i;
out1_data_o = mem_data_i;
out1_burst_o = mem_burst_i;
out1_sel_o = mem_sel_i;
out1_we_o = mem_we_i;
out1_stb_o = mem_stb_i;
out1_cyc_o = mem_cyc_i;
out1_cti_o = mem_cti_i;
end
2'd2:
begin
out2_addr_o = mem_addr_i;
out2_wr_o = mem_wr_i;
out2_rd_o = mem_rd_i;
out2_data_o = mem_data_i;
out2_burst_o = mem_burst_i;
out2_sel_o = mem_sel_i;
out2_we_o = mem_we_i;
out2_stb_o = mem_stb_i;
out2_cyc_o = mem_cyc_i;
out2_cti_o = mem_cti_i;
end
 
default :
162,7 → 159,7
end
 
//-----------------------------------------------------------------
// Read Port
// Response
//-----------------------------------------------------------------
always @ *
begin
171,19 → 168,19
2'd0:
begin
mem_data_o = out0_data_i;
mem_accept_o = out0_accept_i;
mem_stall_o = out0_stall_i;
mem_ack_o = out0_ack_i;
end
2'd1:
begin
mem_data_o = out1_data_i;
mem_accept_o = out1_accept_i;
mem_stall_o = out1_stall_i;
mem_ack_o = out1_ack_i;
end
2'd2:
begin
mem_data_o = out2_data_i;
mem_accept_o = out2_accept_i;
mem_stall_o = out2_stall_i;
mem_ack_o = out2_ack_i;
end
 
190,7 → 187,7
default :
begin
mem_data_o = 32'h00000000;
mem_accept_o = 1'b0;
mem_stall_o = 1'b0;
mem_ack_o = 1'b0;
end
endcase
/soc.v
1,3 → 1,39
//-----------------------------------------------------------------
// AltOR32
// Alternative Lightweight OpenRisc
// V2.0
// Ultra-Embedded.com
// Copyright 2011 - 2013
//
// Email: admin@ultra-embedded.com
//
// License: LGPL
//-----------------------------------------------------------------
//
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
//
// This source file may be used and distributed without
// restriction provided that this copyright statement is not
// removed from the file and that any derivative work contains
// the original copyright notice and the associated disclaimer.
//
// This source file is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any
// later version.
//
// This source is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General
// Public License along with this source; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330,
// Boston, MA 02111-1307 USA
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// Module:
10,20 → 46,13
ext_intr_i,
intr_o,
 
 
 
 
 
 
 
 
 
// Memory interface
io_addr_i,
io_data_i,
io_data_o,
io_wr_i,
io_rd_i
io_we_i,
io_stb_i,
io_ack_o
);
 
//-----------------------------------------------------------------
30,9 → 59,6
// Params
//-----------------------------------------------------------------
parameter [31:0] CLK_KHZ = 12288;
parameter [31:0] UART_BAUD = 115200;
parameter [31:0] SPI_FLASH_CLK_KHZ = (12288/2);
parameter SD_CLK_KHZ = 8000;
parameter [31:0] EXTERNAL_INTERRUPTS = 1;
parameter SYSTICK_INTR_MS = 1;
parameter ENABLE_SYSTICK_TIMER = "ENABLED";
46,37 → 72,22
input [(EXTERNAL_INTERRUPTS - 1):0] ext_intr_i /*verilator public*/;
output intr_o /*verilator public*/;
 
 
// Memory Port
input [31:0] io_addr_i /*verilator public*/;
input [31:0] io_data_i /*verilator public*/;
output [31:0] io_data_o /*verilator public*/;
input [3:0] io_wr_i /*verilator public*/;
input io_rd_i /*verilator public*/;
input io_we_i /*verilator public*/;
input io_stb_i /*verilator public*/;
output io_ack_o /*verilator public*/;
 
 
 
 
 
 
 
 
//-----------------------------------------------------------------
// Registers / Wires
//-----------------------------------------------------------------
 
 
 
 
 
 
 
 
wire [7:0] timer_addr;
wire [31:0] timer_data_o;
wire [31:0] timer_data_i;
wire [3:0] timer_wr;
wire timer_rd;
wire timer_we;
wire timer_stb;
wire timer_intr_systick;
wire timer_intr_hires;
 
83,8 → 94,8
wire [7:0] intr_addr;
wire [31:0] intr_data_o;
wire [31:0] intr_data_i;
wire [3:0] intr_wr;
wire intr_rd;
wire intr_we;
wire intr_stb;
 
//-----------------------------------------------------------------
// Peripheral Interconnect
101,8 → 112,9
.io_addr_i(io_addr_i),
.io_data_i(io_data_i),
.io_data_o(io_data_o),
.io_wr_i(io_wr_i),
.io_rd_i(io_rd_i),
.io_we_i(io_we_i),
.io_stb_i(io_stb_i),
.io_ack_o(io_ack_o),
 
// Peripherals
// Unused = 0x12000000 - 0x120000FF
109,88 → 121,60
.periph0_addr_o(/*open*/),
.periph0_data_o(/*open*/),
.periph0_data_i(32'h00000000),
.periph0_wr_o(/*open*/),
.periph0_rd_o(/*open*/),
.periph0_we_o(/*open*/),
.periph0_stb_o(/*open*/),
 
// Timer = 0x12000100 - 0x120001FF
.periph1_addr_o(timer_addr),
.periph1_data_o(timer_data_o),
.periph1_data_i(timer_data_i),
.periph1_wr_o(timer_wr),
.periph1_rd_o(timer_rd),
.periph1_we_o(timer_we),
.periph1_stb_o(timer_stb),
 
// Interrupt Controller = 0x12000200 - 0x120002FF
.periph2_addr_o(intr_addr),
.periph2_data_o(intr_data_o),
.periph2_data_i(intr_data_i),
.periph2_wr_o(intr_wr),
.periph2_rd_o(intr_rd),
.periph2_we_o(intr_we),
.periph2_stb_o(intr_stb),
 
// Unused = 0x12000300 - 0x120003FF
.periph3_addr_o(/*open*/),
.periph3_data_o(/*open*/),
.periph3_data_i(32'h00000000),
.periph3_wr_o(/*open*/),
.periph3_rd_o(/*open*/),
.periph3_we_o(/*open*/),
.periph3_stb_o(/*open*/),
 
// Unused = 0x12000400 - 0x120004FF
.periph4_addr_o(/*open*/),
.periph4_data_o(/*open*/),
.periph4_data_i(32'h00000000),
.periph4_wr_o(/*open*/),
.periph4_rd_o(/*open*/),
.periph4_we_o(/*open*/),
.periph4_stb_o(/*open*/),
 
// Unused = 0x12000500 - 0x120005FF
.periph5_addr_o(/*open*/),
.periph5_data_o(/*open*/),
.periph5_data_i(32'h00000000),
.periph5_wr_o(/*open*/),
.periph5_rd_o(/*open*/),
.periph5_we_o(/*open*/),
.periph5_stb_o(/*open*/),
 
// Unused = 0x12000600 - 0x120006FF
.periph6_addr_o(/*open*/),
.periph6_data_o(/*open*/),
.periph6_data_i(32'h00000000),
.periph6_wr_o(/*open*/),
.periph6_rd_o(/*open*/),
.periph6_we_o(/*open*/),
.periph6_stb_o(/*open*/),
 
// Unused = 0x12000700 - 0x120007FF
.periph7_addr_o(/*open*/),
.periph7_data_o(/*open*/),
.periph7_data_i(32'h00000000),
.periph7_wr_o(/*open*/),
.periph7_rd_o(/*open*/)
.periph7_we_o(/*open*/),
.periph7_stb_o(/*open*/)
);
 
//-----------------------------------------------------------------
// Memory master arbiter
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// UART
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// GPIO
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// SPI Flash Master
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// DMA
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// SD
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// Generic Register
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// Timer
//-----------------------------------------------------------------
timer_periph
209,8 → 193,8
.addr_i(timer_addr),
.data_o(timer_data_i),
.data_i(timer_data_o),
.wr_i(timer_wr),
.rd_i(timer_rd)
.we_i(timer_we),
.stb_i(timer_stb)
);
 
//-----------------------------------------------------------------
244,8 → 228,8
.addr_i(intr_addr),
.data_o(intr_data_i),
.data_i(intr_data_o),
.wr_i(intr_wr),
.rd_i(intr_rd)
.we_i(intr_we),
.stb_i(intr_stb)
);
 
//-------------------------------------------------------------------
/cpu_if.v
1,3 → 1,39
//-----------------------------------------------------------------
// AltOR32
// Alternative Lightweight OpenRisc
// V2.0
// Ultra-Embedded.com
// Copyright 2011 - 2013
//
// Email: admin@ultra-embedded.com
//
// License: LGPL
//-----------------------------------------------------------------
//
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
//
// This source file may be used and distributed without
// restriction provided that this copyright statement is not
// removed from the file and that any derivative work contains
// the original copyright notice and the associated disclaimer.
//
// This source file is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any
// later version.
//
// This source is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General
// Public License along with this source; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330,
// Boston, MA 02111-1307 USA
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// Module:
5,126 → 41,92
module cpu_if
(
// General - Clocking & Reset
clk_i,
rst_i,
input clk_i,
input rst_i,
 
// Instruction Memory 0 (0x10000000 - 0x10FFFFFF)
imem0_addr_o,
imem0_rd_o,
imem0_burst_o,
imem0_data_in_i,
imem0_accept_i,
imem0_ack_i,
output [31:0] imem0_addr_o,
input [31:0] imem0_data_i,
output [3:0] imem0_sel_o,
output imem0_stb_o,
output imem0_cyc_o,
output [2:0] imem0_cti_o,
input imem0_ack_i,
input imem0_stall_i,
 
// Data Memory 0 (0x10000000 - 0x10FFFFFF)
dmem0_addr_o,
dmem0_data_o,
dmem0_data_i,
dmem0_wr_o,
dmem0_rd_o,
dmem0_burst_o,
dmem0_accept_i,
dmem0_ack_i,
output [31:0] dmem0_addr_o,
output [31:0] dmem0_data_o,
input [31:0] dmem0_data_i,
output [3:0] dmem0_sel_o,
output dmem0_we_o,
output dmem0_stb_o,
output dmem0_cyc_o,
output [2:0] dmem0_cti_o,
input dmem0_ack_i,
input dmem0_stall_i,
 
// Data Memory 1 (0x11000000 - 0x11FFFFFF)
dmem1_addr_o,
dmem1_data_o,
dmem1_data_i,
dmem1_wr_o,
dmem1_rd_o,
dmem1_burst_o,
dmem1_accept_i,
dmem1_ack_i,
output [31:0] dmem1_addr_o,
output [31:0] dmem1_data_o,
input [31:0] dmem1_data_i,
output [3:0] dmem1_sel_o,
output dmem1_we_o,
output dmem1_stb_o,
output dmem1_cyc_o,
output [2:0] dmem1_cti_o,
input dmem1_ack_i,
input dmem1_stall_i,
 
// Data Memory 2 (0x12000000 - 0x12FFFFFF)
dmem2_addr_o,
dmem2_data_o,
dmem2_data_i,
dmem2_wr_o,
dmem2_rd_o,
dmem2_burst_o,
dmem2_accept_i,
dmem2_ack_i,
output [31:0] dmem2_addr_o,
output [31:0] dmem2_data_o,
input [31:0] dmem2_data_i,
output [3:0] dmem2_sel_o,
output dmem2_we_o,
output dmem2_stb_o,
output dmem2_cyc_o,
output [2:0] dmem2_cti_o,
input dmem2_ack_i,
input dmem2_stall_i,
 
fault_o,
break_o,
intr_i,
nmi_i
output fault_o,
output break_o,
input intr_i,
input nmi_i
);
 
//-----------------------------------------------------------------
// Params
//-----------------------------------------------------------------
parameter [31:0] CLK_KHZ = 12288;
parameter CLK_KHZ = 12288;
parameter ENABLE_ICACHE = "ENABLED";
parameter ENABLE_DCACHE = "DISABLED";
parameter ENABLE_DCACHE = "ENABLED";
parameter BOOT_VECTOR = 0;
parameter ISR_VECTOR = 0;
parameter REGISTER_FILE_TYPE = "SIMULATION";
 
//-----------------------------------------------------------------
// I/O
//-----------------------------------------------------------------
input clk_i /*verilator public*/;
input rst_i /*verilator public*/;
 
// Instruction Memory 0 (0x10000000 - 0x10FFFFFF)
output [31:0] imem0_addr_o /*verilator public*/;
output imem0_rd_o /*verilator public*/;
output imem0_burst_o /*verilator public*/;
input [31:0] imem0_data_in_i /*verilator public*/;
input imem0_accept_i /*verilator public*/;
input imem0_ack_i /*verilator public*/;
 
// Data Memory 0 (0x10000000 - 0x10FFFFFF)
output [31:0] dmem0_addr_o /*verilator public*/;
output [31:0] dmem0_data_o /*verilator public*/;
input [31:0] dmem0_data_i /*verilator public*/;
output [3:0] dmem0_wr_o /*verilator public*/;
output dmem0_rd_o /*verilator public*/;
output dmem0_burst_o /*verilator public*/;
input dmem0_accept_i /*verilator public*/;
input dmem0_ack_i /*verilator public*/;
// Data Memory 1 (0x11000000 - 0x11FFFFFF)
output [31:0] dmem1_addr_o /*verilator public*/;
output [31:0] dmem1_data_o /*verilator public*/;
input [31:0] dmem1_data_i /*verilator public*/;
output [3:0] dmem1_wr_o /*verilator public*/;
output dmem1_rd_o /*verilator public*/;
output dmem1_burst_o /*verilator public*/;
input dmem1_accept_i /*verilator public*/;
input dmem1_ack_i /*verilator public*/;
// Data Memory 2 (0x12000000 - 0x12FFFFFF)
output [31:0] dmem2_addr_o /*verilator public*/;
output [31:0] dmem2_data_o /*verilator public*/;
input [31:0] dmem2_data_i /*verilator public*/;
output [3:0] dmem2_wr_o /*verilator public*/;
output dmem2_rd_o /*verilator public*/;
output dmem2_burst_o /*verilator public*/;
input dmem2_accept_i /*verilator public*/;
input dmem2_ack_i /*verilator public*/;
 
output fault_o /*verilator public*/;
output break_o /*verilator public*/;
input nmi_i /*verilator public*/;
input intr_i /*verilator public*/;
 
//-----------------------------------------------------------------
// Registers
//-----------------------------------------------------------------
wire [31:0] cpu_address;
wire [3:0] cpu_wr;
wire cpu_rd;
wire cpu_burst;
wire [31:0] cpu_data_w;
wire [31:0] cpu_data_r;
wire cpu_accept;
wire cpu_ack;
wire [31:0] dmem_addr;
wire [31:0] dmem_data_w;
wire [31:0] dmem_data_r;
wire [3:0] dmem_sel;
wire [2:0] dmem_cti;
wire dmem_cyc;
wire dmem_we;
wire dmem_stb;
wire dmem_stall;
wire dmem_ack;
wire [31:0] imem_address;
wire [31:0] imem_data;
wire imem_rd;
wire imem_burst;
wire [2:0] imem_cti;
wire imem_cyc;
wire imem_stb;
wire imem_stall;
wire imem_ack;
wire imem_accept;
 
//-----------------------------------------------------------------
// CPU core
151,21 → 153,24
// Instruction memory
.imem_addr_o(imem_address),
.imem_rd_o(imem_rd),
.imem_burst_o(imem_burst),
.imem_data_in_i(imem_data),
.imem_accept_i(imem_accept),
.imem_ack_i(imem_ack),
.imem_dat_i(imem_data),
.imem_cti_o(imem_cti),
.imem_cyc_o(imem_cyc),
.imem_stb_o(imem_stb),
.imem_stall_i(imem_stall),
.imem_ack_i(imem_ack),
// Data memory
.dmem_addr_o(cpu_address),
.dmem_data_out_o(cpu_data_w),
.dmem_data_in_i(cpu_data_r),
.dmem_wr_o(cpu_wr),
.dmem_rd_o(cpu_rd),
.dmem_burst_o(cpu_burst),
.dmem_accept_i(cpu_accept),
.dmem_ack_i(cpu_ack)
.dmem_addr_o(dmem_addr),
.dmem_dat_o(dmem_data_w),
.dmem_dat_i(dmem_data_r),
.dmem_sel_o(dmem_sel),
.dmem_cti_o(dmem_cti),
.dmem_cyc_o(dmem_cyc),
.dmem_we_o(dmem_we),
.dmem_stb_o(dmem_stb),
.dmem_stall_i(dmem_stall),
.dmem_ack_i(dmem_ack)
);
 
//-----------------------------------------------------------------
173,10 → 178,12
//-----------------------------------------------------------------
 
assign imem0_addr_o = imem_address;
assign imem0_rd_o = imem_rd;
assign imem0_burst_o = imem_burst;
assign imem_data = imem0_data_in_i;
assign imem_accept = imem0_accept_i;
assign imem0_sel_o = 4'b1111;
assign imem0_stb_o = imem_stb;
assign imem0_cyc_o = imem_cyc;
assign imem0_cti_o = imem_cti;
assign imem_data = imem0_data_i;
assign imem_stall = imem0_stall_i;
assign imem_ack = imem0_ack_i;
 
 
194,39 → 201,49
.out0_addr_o(dmem0_addr_o),
.out0_data_o(dmem0_data_o),
.out0_data_i(dmem0_data_i),
.out0_wr_o(dmem0_wr_o),
.out0_rd_o(dmem0_rd_o),
.out0_burst_o(dmem0_burst_o),
.out0_sel_o(dmem0_sel_o),
.out0_we_o(dmem0_we_o),
.out0_stb_o(dmem0_stb_o),
.out0_cyc_o(dmem0_cyc_o),
.out0_cti_o(dmem0_cti_o),
.out0_ack_i(dmem0_ack_i),
.out0_accept_i(dmem0_accept_i),
.out0_stall_i(dmem0_stall_i),
 
// 0x11000000 - 0x11FFFFFF
.out1_addr_o(dmem1_addr_o),
.out1_data_o(dmem1_data_o),
.out1_data_i(dmem1_data_i),
.out1_wr_o(dmem1_wr_o),
.out1_rd_o(dmem1_rd_o),
.out1_burst_o(dmem1_burst_o),
.out1_sel_o(dmem1_sel_o),
.out1_we_o(dmem1_we_o),
.out1_stb_o(dmem1_stb_o),
.out1_cyc_o(dmem1_cyc_o),
.out1_cti_o(dmem1_cti_o),
.out1_ack_i(dmem1_ack_i),
.out1_accept_i(dmem1_accept_i),
.out1_stall_i(dmem1_stall_i),
 
// 0x12000000 - 0x12FFFFFF
.out2_addr_o(dmem2_addr_o),
.out2_data_o(dmem2_data_o),
.out2_data_i(dmem2_data_i),
.out2_wr_o(dmem2_wr_o),
.out2_rd_o(dmem2_rd_o),
.out2_burst_o(dmem2_burst_o),
.out2_sel_o(dmem2_sel_o),
.out2_we_o(dmem2_we_o),
.out2_stb_o(dmem2_stb_o),
.out2_cyc_o(dmem2_cyc_o),
.out2_cti_o(dmem2_cti_o),
.out2_ack_i(dmem2_ack_i),
.out2_accept_i(dmem2_accept_i),
.out2_stall_i(dmem2_stall_i),
 
// Input - CPU core bus
.mem_addr_i(cpu_address),
.mem_data_i(cpu_data_w),
.mem_data_o(cpu_data_r),
.mem_wr_i(cpu_wr),
.mem_rd_i(cpu_rd),
.mem_burst_i(cpu_burst),
.mem_ack_o(cpu_ack),
.mem_accept_o(cpu_accept)
.mem_addr_i(dmem_addr),
.mem_data_i(dmem_data_w),
.mem_data_o(dmem_data_r),
.mem_sel_i(dmem_sel),
.mem_we_i(dmem_we),
.mem_stb_i(dmem_stb),
.mem_cyc_i(dmem_cyc),
.mem_cti_i(dmem_cti),
.mem_ack_o(dmem_ack),
.mem_stall_o(dmem_stall)
);
 
endmodule
/soc_pif8.v
1,3 → 1,39
//-----------------------------------------------------------------
// AltOR32
// Alternative Lightweight OpenRisc
// V2.0
// Ultra-Embedded.com
// Copyright 2011 - 2013
//
// Email: admin@ultra-embedded.com
//
// License: LGPL
//-----------------------------------------------------------------
//
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
//
// This source file may be used and distributed without
// restriction provided that this copyright statement is not
// removed from the file and that any derivative work contains
// the original copyright notice and the associated disclaimer.
//
// This source file is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any
// later version.
//
// This source is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General
// Public License along with this source; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330,
// Boston, MA 02111-1307 USA
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
// Module:
5,190 → 41,109
module soc_pif8
(
// General - Clocking & Reset
clk_i,
rst_i,
input clk_i,
input rst_i,
 
// Peripherals
periph0_addr_o,
periph0_data_o,
periph0_data_i,
periph0_wr_o,
periph0_rd_o,
periph1_addr_o,
periph1_data_o,
periph1_data_i,
periph1_wr_o,
periph1_rd_o,
periph2_addr_o,
periph2_data_o,
periph2_data_i,
periph2_wr_o,
periph2_rd_o,
periph3_addr_o,
periph3_data_o,
periph3_data_i,
periph3_wr_o,
periph3_rd_o,
periph4_addr_o,
periph4_data_o,
periph4_data_i,
periph4_wr_o,
periph4_rd_o,
periph5_addr_o,
periph5_data_o,
periph5_data_i,
periph5_wr_o,
periph5_rd_o,
periph6_addr_o,
periph6_data_o,
periph6_data_i,
periph6_wr_o,
periph6_rd_o,
periph7_addr_o,
periph7_data_o,
periph7_data_i,
periph7_wr_o,
periph7_rd_o,
output [7:0] periph0_addr_o,
output [31:0] periph0_data_o,
input [31:0] periph0_data_i,
output reg periph0_we_o,
output reg periph0_stb_o,
 
// I/O bus
io_addr_i,
io_data_i,
io_data_o,
io_wr_i,
io_rd_i
);
output [7:0] periph1_addr_o,
output [31:0] periph1_data_o,
input [31:0] periph1_data_i,
output reg periph1_we_o,
output reg periph1_stb_o,
 
//-----------------------------------------------------------------
// I/O
//-----------------------------------------------------------------
input clk_i /*verilator public*/;
input rst_i /*verilator public*/;
output [7:0] periph2_addr_o,
output [31:0] periph2_data_o,
input [31:0] periph2_data_i,
output reg periph2_we_o,
output reg periph2_stb_o,
 
input [31:0] io_addr_i /*verilator public*/;
output [31:0] io_data_o /*verilator public*/;
input [31:0] io_data_i /*verilator public*/;
input [3:0] io_wr_i /*verilator public*/;
input io_rd_i /*verilator public*/;
output [7:0] periph3_addr_o,
output [31:0] periph3_data_o,
input [31:0] periph3_data_i,
output reg periph3_we_o,
output reg periph3_stb_o,
 
output [7:0] periph0_addr_o /*verilator public*/;
output [31:0] periph0_data_o /*verilator public*/;
input [31:0] periph0_data_i /*verilator public*/;
output [3:0] periph0_wr_o /*verilator public*/;
output periph0_rd_o /*verilator public*/;
output [7:0] periph1_addr_o /*verilator public*/;
output [31:0] periph1_data_o /*verilator public*/;
input [31:0] periph1_data_i /*verilator public*/;
output [3:0] periph1_wr_o /*verilator public*/;
output periph1_rd_o /*verilator public*/;
output [7:0] periph2_addr_o /*verilator public*/;
output [31:0] periph2_data_o /*verilator public*/;
input [31:0] periph2_data_i /*verilator public*/;
output [3:0] periph2_wr_o /*verilator public*/;
output periph2_rd_o /*verilator public*/;
output [7:0] periph3_addr_o /*verilator public*/;
output [31:0] periph3_data_o /*verilator public*/;
input [31:0] periph3_data_i /*verilator public*/;
output [3:0] periph3_wr_o /*verilator public*/;
output periph3_rd_o /*verilator public*/;
output [7:0] periph4_addr_o /*verilator public*/;
output [31:0] periph4_data_o /*verilator public*/;
input [31:0] periph4_data_i /*verilator public*/;
output [3:0] periph4_wr_o /*verilator public*/;
output periph4_rd_o /*verilator public*/;
output [7:0] periph5_addr_o /*verilator public*/;
output [31:0] periph5_data_o /*verilator public*/;
input [31:0] periph5_data_i /*verilator public*/;
output [3:0] periph5_wr_o /*verilator public*/;
output periph5_rd_o /*verilator public*/;
output [7:0] periph6_addr_o /*verilator public*/;
output [31:0] periph6_data_o /*verilator public*/;
input [31:0] periph6_data_i /*verilator public*/;
output [3:0] periph6_wr_o /*verilator public*/;
output periph6_rd_o /*verilator public*/;
output [7:0] periph7_addr_o /*verilator public*/;
output [31:0] periph7_data_o /*verilator public*/;
input [31:0] periph7_data_i /*verilator public*/;
output [3:0] periph7_wr_o /*verilator public*/;
output periph7_rd_o /*verilator public*/;
output [7:0] periph4_addr_o,
output [31:0] periph4_data_o,
input [31:0] periph4_data_i,
output reg periph4_we_o,
output reg periph4_stb_o,
 
//-----------------------------------------------------------------
// Registers
//-----------------------------------------------------------------
reg [3:0] r_mem_sel;
output [7:0] periph5_addr_o,
output [31:0] periph5_data_o,
input [31:0] periph5_data_i,
output reg periph5_we_o,
output reg periph5_stb_o,
 
reg [31:0] io_data_o;
output [7:0] periph6_addr_o,
output [31:0] periph6_data_o,
input [31:0] periph6_data_i,
output reg periph6_we_o,
output reg periph6_stb_o,
 
reg [7:0] periph0_addr_o;
reg [31:0] periph0_data_o;
reg [3:0] periph0_wr_o;
reg periph0_rd_o;
reg [7:0] periph1_addr_o;
reg [31:0] periph1_data_o;
reg [3:0] periph1_wr_o;
reg periph1_rd_o;
reg [7:0] periph2_addr_o;
reg [31:0] periph2_data_o;
reg [3:0] periph2_wr_o;
reg periph2_rd_o;
reg [7:0] periph3_addr_o;
reg [31:0] periph3_data_o;
reg [3:0] periph3_wr_o;
reg periph3_rd_o;
reg [7:0] periph4_addr_o;
reg [31:0] periph4_data_o;
reg [3:0] periph4_wr_o;
reg periph4_rd_o;
reg [7:0] periph5_addr_o;
reg [31:0] periph5_data_o;
reg [3:0] periph5_wr_o;
reg periph5_rd_o;
reg [7:0] periph6_addr_o;
reg [31:0] periph6_data_o;
reg [3:0] periph6_wr_o;
reg periph6_rd_o;
reg [7:0] periph7_addr_o;
reg [31:0] periph7_data_o;
reg [3:0] periph7_wr_o;
reg periph7_rd_o;
output [7:0] periph7_addr_o,
output [31:0] periph7_data_o,
input [31:0] periph7_data_i,
output reg periph7_we_o,
output reg periph7_stb_o,
 
// I/O bus
input [31:0] io_addr_i,
input [31:0] io_data_i,
output reg [31:0] io_data_o,
input io_we_i,
input io_stb_i,
output reg io_ack_o
);
 
//-----------------------------------------------------------------
// Memory Map
//-----------------------------------------------------------------
always @ (io_addr_i or io_wr_i or io_rd_i or io_data_i)
 
// Route data / address to all peripherals
assign periph0_addr_o = io_addr_i[7:0];
assign periph0_data_o = io_data_i;
assign periph1_addr_o = io_addr_i[7:0];
assign periph1_data_o = io_data_i;
assign periph2_addr_o = io_addr_i[7:0];
assign periph2_data_o = io_data_i;
assign periph3_addr_o = io_addr_i[7:0];
assign periph3_data_o = io_data_i;
assign periph4_addr_o = io_addr_i[7:0];
assign periph4_data_o = io_data_i;
assign periph5_addr_o = io_addr_i[7:0];
assign periph5_data_o = io_data_i;
assign periph6_addr_o = io_addr_i[7:0];
assign periph6_data_o = io_data_i;
assign periph7_addr_o = io_addr_i[7:0];
assign periph7_data_o = io_data_i;
 
// Select correct target
always @ *
begin
 
periph0_addr_o = 8'h00;
periph0_wr_o = 4'b0000;
periph0_rd_o = 1'b0;
periph0_data_o = 32'h00000000;
periph1_addr_o = 8'h00;
periph1_wr_o = 4'b0000;
periph1_rd_o = 1'b0;
periph1_data_o = 32'h00000000;
periph2_addr_o = 8'h00;
periph2_wr_o = 4'b0000;
periph2_rd_o = 1'b0;
periph2_data_o = 32'h00000000;
periph3_addr_o = 8'h00;
periph3_wr_o = 4'b0000;
periph3_rd_o = 1'b0;
periph3_data_o = 32'h00000000;
periph4_addr_o = 8'h00;
periph4_wr_o = 4'b0000;
periph4_rd_o = 1'b0;
periph4_data_o = 32'h00000000;
periph5_addr_o = 8'h00;
periph5_wr_o = 4'b0000;
periph5_rd_o = 1'b0;
periph5_data_o = 32'h00000000;
periph6_addr_o = 8'h00;
periph6_wr_o = 4'b0000;
periph6_rd_o = 1'b0;
periph6_data_o = 32'h00000000;
periph7_addr_o = 8'h00;
periph7_wr_o = 4'b0000;
periph7_rd_o = 1'b0;
periph7_data_o = 32'h00000000;
periph0_we_o = 1'b0;
periph0_stb_o = 1'b0;
periph1_we_o = 1'b0;
periph1_stb_o = 1'b0;
periph2_we_o = 1'b0;
periph2_stb_o = 1'b0;
periph3_we_o = 1'b0;
periph3_stb_o = 1'b0;
periph4_we_o = 1'b0;
periph4_stb_o = 1'b0;
periph5_we_o = 1'b0;
periph5_stb_o = 1'b0;
periph6_we_o = 1'b0;
periph6_stb_o = 1'b0;
periph7_we_o = 1'b0;
periph7_stb_o = 1'b0;
 
// Decode 4-bit peripheral select
case (io_addr_i[11:8])
196,66 → 151,50
// Peripheral 0
4'd 0 :
begin
periph0_addr_o = io_addr_i[7:0];
periph0_wr_o = io_wr_i;
periph0_rd_o = io_rd_i;
periph0_data_o = io_data_i;
periph0_we_o = io_we_i;
periph0_stb_o = io_stb_i;
end
// Peripheral 1
4'd 1 :
begin
periph1_addr_o = io_addr_i[7:0];
periph1_wr_o = io_wr_i;
periph1_rd_o = io_rd_i;
periph1_data_o = io_data_i;
periph1_we_o = io_we_i;
periph1_stb_o = io_stb_i;
end
// Peripheral 2
4'd 2 :
begin
periph2_addr_o = io_addr_i[7:0];
periph2_wr_o = io_wr_i;
periph2_rd_o = io_rd_i;
periph2_data_o = io_data_i;
periph2_we_o = io_we_i;
periph2_stb_o = io_stb_i;
end
// Peripheral 3
4'd 3 :
begin
periph3_addr_o = io_addr_i[7:0];
periph3_wr_o = io_wr_i;
periph3_rd_o = io_rd_i;
periph3_data_o = io_data_i;
periph3_we_o = io_we_i;
periph3_stb_o = io_stb_i;
end
// Peripheral 4
4'd 4 :
begin
periph4_addr_o = io_addr_i[7:0];
periph4_wr_o = io_wr_i;
periph4_rd_o = io_rd_i;
periph4_data_o = io_data_i;
periph4_we_o = io_we_i;
periph4_stb_o = io_stb_i;
end
// Peripheral 5
4'd 5 :
begin
periph5_addr_o = io_addr_i[7:0];
periph5_wr_o = io_wr_i;
periph5_rd_o = io_rd_i;
periph5_data_o = io_data_i;
periph5_we_o = io_we_i;
periph5_stb_o = io_stb_i;
end
// Peripheral 6
4'd 6 :
begin
periph6_addr_o = io_addr_i[7:0];
periph6_wr_o = io_wr_i;
periph6_rd_o = io_rd_i;
periph6_data_o = io_data_i;
periph6_we_o = io_we_i;
periph6_stb_o = io_stb_i;
end
// Peripheral 7
4'd 7 :
begin
periph7_addr_o = io_addr_i[7:0];
periph7_wr_o = io_wr_i;
periph7_rd_o = io_rd_i;
periph7_data_o = io_data_i;
periph7_we_o = io_we_i;
periph7_stb_o = io_stb_i;
end
 
default :
266,67 → 205,42
//-----------------------------------------------------------------
// Read Port
//-----------------------------------------------------------------
always @ *
always @ (posedge clk_i or posedge rst_i)
begin
case (r_mem_sel)
 
// Peripheral 0
4'd 0 :
if (rst_i == 1'b1)
begin
io_data_o = periph0_data_i;
io_data_o <= 32'b0;
io_ack_o <= 1'b0;
end
// Peripheral 1
4'd 1 :
else
begin
io_data_o = periph1_data_i;
end
// Peripheral 2
4'd 2 :
begin
io_data_o = periph2_data_i;
end
// Peripheral 3
4'd 3 :
begin
io_data_o = periph3_data_i;
end
// Peripheral 4
4'd 4 :
begin
io_data_o = periph4_data_i;
end
// Peripheral 5
4'd 5 :
begin
io_data_o = periph5_data_i;
end
// Peripheral 6
4'd 6 :
begin
io_data_o = periph6_data_i;
end
// Peripheral 7
4'd 7 :
begin
io_data_o = periph7_data_i;
end
if (io_stb_i)
begin
// Decode 4-bit peripheral select
case (io_addr_i[11:8])
// Peripheral 0
4'd 0 : io_data_o <= periph0_data_i;
// Peripheral 1
4'd 1 : io_data_o <= periph1_data_i;
// Peripheral 2
4'd 2 : io_data_o <= periph2_data_i;
// Peripheral 3
4'd 3 : io_data_o <= periph3_data_i;
// Peripheral 4
4'd 4 : io_data_o <= periph4_data_i;
// Peripheral 5
4'd 5 : io_data_o <= periph5_data_i;
// Peripheral 6
4'd 6 : io_data_o <= periph6_data_i;
// Peripheral 7
4'd 7 : io_data_o <= periph7_data_i;
 
default :
begin
io_data_o = 32'h00000000;
default : io_data_o <= 32'h00000000;
endcase
end
 
io_ack_o <= io_stb_i;
end
endcase
end
 
//-----------------------------------------------------------------
// Registered peripheral select
//-----------------------------------------------------------------
always @ (posedge clk_i or posedge rst_i)
begin
if (rst_i == 1'b1)
r_mem_sel <= 4'h0;
else
r_mem_sel <= io_addr_i[11:8];
end
 
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.