Line 1... |
Line 1... |
|
//-----------------------------------------------------------------
|
|
// 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:
|
// Module:
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
module soc_pif8
|
module soc_pif8
|
(
|
(
|
// General - Clocking & Reset
|
// General - Clocking & Reset
|
clk_i,
|
input clk_i,
|
rst_i,
|
input rst_i,
|
|
|
// Peripherals
|
// Peripherals
|
periph0_addr_o,
|
output [7:0] periph0_addr_o,
|
periph0_data_o,
|
output [31:0] periph0_data_o,
|
periph0_data_i,
|
input [31:0] periph0_data_i,
|
periph0_wr_o,
|
output reg periph0_we_o,
|
periph0_rd_o,
|
output reg periph0_stb_o,
|
periph1_addr_o,
|
|
periph1_data_o,
|
output [7:0] periph1_addr_o,
|
periph1_data_i,
|
output [31:0] periph1_data_o,
|
periph1_wr_o,
|
input [31:0] periph1_data_i,
|
periph1_rd_o,
|
output reg periph1_we_o,
|
periph2_addr_o,
|
output reg periph1_stb_o,
|
periph2_data_o,
|
|
periph2_data_i,
|
output [7:0] periph2_addr_o,
|
periph2_wr_o,
|
output [31:0] periph2_data_o,
|
periph2_rd_o,
|
input [31:0] periph2_data_i,
|
periph3_addr_o,
|
output reg periph2_we_o,
|
periph3_data_o,
|
output reg periph2_stb_o,
|
periph3_data_i,
|
|
periph3_wr_o,
|
output [7:0] periph3_addr_o,
|
periph3_rd_o,
|
output [31:0] periph3_data_o,
|
periph4_addr_o,
|
input [31:0] periph3_data_i,
|
periph4_data_o,
|
output reg periph3_we_o,
|
periph4_data_i,
|
output reg periph3_stb_o,
|
periph4_wr_o,
|
|
periph4_rd_o,
|
output [7:0] periph4_addr_o,
|
periph5_addr_o,
|
output [31:0] periph4_data_o,
|
periph5_data_o,
|
input [31:0] periph4_data_i,
|
periph5_data_i,
|
output reg periph4_we_o,
|
periph5_wr_o,
|
output reg periph4_stb_o,
|
periph5_rd_o,
|
|
periph6_addr_o,
|
output [7:0] periph5_addr_o,
|
periph6_data_o,
|
output [31:0] periph5_data_o,
|
periph6_data_i,
|
input [31:0] periph5_data_i,
|
periph6_wr_o,
|
output reg periph5_we_o,
|
periph6_rd_o,
|
output reg periph5_stb_o,
|
periph7_addr_o,
|
|
periph7_data_o,
|
output [7:0] periph6_addr_o,
|
periph7_data_i,
|
output [31:0] periph6_data_o,
|
periph7_wr_o,
|
input [31:0] periph6_data_i,
|
periph7_rd_o,
|
output reg periph6_we_o,
|
|
output reg periph6_stb_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
|
// I/O bus
|
io_addr_i,
|
input [31:0] io_addr_i,
|
io_data_i,
|
input [31:0] io_data_i,
|
io_data_o,
|
output reg [31:0] io_data_o,
|
io_wr_i,
|
input io_we_i,
|
io_rd_i
|
input io_stb_i,
|
|
output reg io_ack_o
|
);
|
);
|
|
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
// I/O
|
// Memory Map
|
//-----------------------------------------------------------------
|
|
input clk_i /*verilator public*/;
|
|
input rst_i /*verilator public*/;
|
|
|
|
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] 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*/;
|
|
|
|
//-----------------------------------------------------------------
|
|
// Registers
|
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
reg [3:0] r_mem_sel;
|
|
|
|
reg [31:0] io_data_o;
|
// 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;
|
|
|
reg [7:0] periph0_addr_o;
|
// Select correct target
|
reg [31:0] periph0_data_o;
|
always @ *
|
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;
|
|
|
|
//-----------------------------------------------------------------
|
|
// Memory Map
|
|
//-----------------------------------------------------------------
|
|
always @ (io_addr_i or io_wr_i or io_rd_i or io_data_i)
|
|
begin
|
begin
|
|
|
periph0_addr_o = 8'h00;
|
periph0_we_o = 1'b0;
|
periph0_wr_o = 4'b0000;
|
periph0_stb_o = 1'b0;
|
periph0_rd_o = 1'b0;
|
periph1_we_o = 1'b0;
|
periph0_data_o = 32'h00000000;
|
periph1_stb_o = 1'b0;
|
periph1_addr_o = 8'h00;
|
periph2_we_o = 1'b0;
|
periph1_wr_o = 4'b0000;
|
periph2_stb_o = 1'b0;
|
periph1_rd_o = 1'b0;
|
periph3_we_o = 1'b0;
|
periph1_data_o = 32'h00000000;
|
periph3_stb_o = 1'b0;
|
periph2_addr_o = 8'h00;
|
periph4_we_o = 1'b0;
|
periph2_wr_o = 4'b0000;
|
periph4_stb_o = 1'b0;
|
periph2_rd_o = 1'b0;
|
periph5_we_o = 1'b0;
|
periph2_data_o = 32'h00000000;
|
periph5_stb_o = 1'b0;
|
periph3_addr_o = 8'h00;
|
periph6_we_o = 1'b0;
|
periph3_wr_o = 4'b0000;
|
periph6_stb_o = 1'b0;
|
periph3_rd_o = 1'b0;
|
periph7_we_o = 1'b0;
|
periph3_data_o = 32'h00000000;
|
periph7_stb_o = 1'b0;
|
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;
|
|
|
|
// Decode 4-bit peripheral select
|
// Decode 4-bit peripheral select
|
case (io_addr_i[11:8])
|
case (io_addr_i[11:8])
|
|
|
// Peripheral 0
|
// Peripheral 0
|
4'd 0 :
|
4'd 0 :
|
begin
|
begin
|
periph0_addr_o = io_addr_i[7:0];
|
periph0_we_o = io_we_i;
|
periph0_wr_o = io_wr_i;
|
periph0_stb_o = io_stb_i;
|
periph0_rd_o = io_rd_i;
|
|
periph0_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 1
|
// Peripheral 1
|
4'd 1 :
|
4'd 1 :
|
begin
|
begin
|
periph1_addr_o = io_addr_i[7:0];
|
periph1_we_o = io_we_i;
|
periph1_wr_o = io_wr_i;
|
periph1_stb_o = io_stb_i;
|
periph1_rd_o = io_rd_i;
|
|
periph1_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 2
|
// Peripheral 2
|
4'd 2 :
|
4'd 2 :
|
begin
|
begin
|
periph2_addr_o = io_addr_i[7:0];
|
periph2_we_o = io_we_i;
|
periph2_wr_o = io_wr_i;
|
periph2_stb_o = io_stb_i;
|
periph2_rd_o = io_rd_i;
|
|
periph2_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 3
|
// Peripheral 3
|
4'd 3 :
|
4'd 3 :
|
begin
|
begin
|
periph3_addr_o = io_addr_i[7:0];
|
periph3_we_o = io_we_i;
|
periph3_wr_o = io_wr_i;
|
periph3_stb_o = io_stb_i;
|
periph3_rd_o = io_rd_i;
|
|
periph3_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 4
|
// Peripheral 4
|
4'd 4 :
|
4'd 4 :
|
begin
|
begin
|
periph4_addr_o = io_addr_i[7:0];
|
periph4_we_o = io_we_i;
|
periph4_wr_o = io_wr_i;
|
periph4_stb_o = io_stb_i;
|
periph4_rd_o = io_rd_i;
|
|
periph4_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 5
|
// Peripheral 5
|
4'd 5 :
|
4'd 5 :
|
begin
|
begin
|
periph5_addr_o = io_addr_i[7:0];
|
periph5_we_o = io_we_i;
|
periph5_wr_o = io_wr_i;
|
periph5_stb_o = io_stb_i;
|
periph5_rd_o = io_rd_i;
|
|
periph5_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 6
|
// Peripheral 6
|
4'd 6 :
|
4'd 6 :
|
begin
|
begin
|
periph6_addr_o = io_addr_i[7:0];
|
periph6_we_o = io_we_i;
|
periph6_wr_o = io_wr_i;
|
periph6_stb_o = io_stb_i;
|
periph6_rd_o = io_rd_i;
|
|
periph6_data_o = io_data_i;
|
|
end
|
end
|
// Peripheral 7
|
// Peripheral 7
|
4'd 7 :
|
4'd 7 :
|
begin
|
begin
|
periph7_addr_o = io_addr_i[7:0];
|
periph7_we_o = io_we_i;
|
periph7_wr_o = io_wr_i;
|
periph7_stb_o = io_stb_i;
|
periph7_rd_o = io_rd_i;
|
|
periph7_data_o = io_data_i;
|
|
end
|
end
|
|
|
default :
|
default :
|
;
|
;
|
endcase
|
endcase
|
end
|
end
|
|
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
// Read Port
|
// Read Port
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
always @ *
|
always @ (posedge clk_i or posedge rst_i)
|
begin
|
begin
|
case (r_mem_sel)
|
if (rst_i == 1'b1)
|
|
|
// Peripheral 0
|
|
4'd 0 :
|
|
begin
|
begin
|
io_data_o = periph0_data_i;
|
io_data_o <= 32'b0;
|
|
io_ack_o <= 1'b0;
|
end
|
end
|
// Peripheral 1
|
else
|
4'd 1 :
|
|
begin
|
begin
|
io_data_o = periph1_data_i;
|
if (io_stb_i)
|
end
|
|
// Peripheral 2
|
|
4'd 2 :
|
|
begin
|
begin
|
io_data_o = periph2_data_i;
|
// Decode 4-bit peripheral select
|
end
|
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
|
// Peripheral 3
|
4'd 3 :
|
4'd 3 : io_data_o <= periph3_data_i;
|
begin
|
|
io_data_o = periph3_data_i;
|
|
end
|
|
// Peripheral 4
|
// Peripheral 4
|
4'd 4 :
|
4'd 4 : io_data_o <= periph4_data_i;
|
begin
|
|
io_data_o = periph4_data_i;
|
|
end
|
|
// Peripheral 5
|
// Peripheral 5
|
4'd 5 :
|
4'd 5 : io_data_o <= periph5_data_i;
|
begin
|
|
io_data_o = periph5_data_i;
|
|
end
|
|
// Peripheral 6
|
// Peripheral 6
|
4'd 6 :
|
4'd 6 : io_data_o <= periph6_data_i;
|
begin
|
|
io_data_o = periph6_data_i;
|
|
end
|
|
// Peripheral 7
|
// Peripheral 7
|
4'd 7 :
|
4'd 7 : io_data_o <= periph7_data_i;
|
begin
|
|
io_data_o = periph7_data_i;
|
|
end
|
|
|
|
default :
|
default : io_data_o <= 32'h00000000;
|
begin
|
|
io_data_o = 32'h00000000;
|
|
end
|
|
endcase
|
endcase
|
end
|
end
|
|
|
//-----------------------------------------------------------------
|
io_ack_o <= io_stb_i;
|
// Registered peripheral select
|
end
|
//-----------------------------------------------------------------
|
|
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
|
end
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|