//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// 8051 stack pointer ////
|
//// 8051 stack pointer ////
|
//// ////
|
//// ////
|
//// This file is part of the 8051 cores project ////
|
//// This file is part of the 8051 cores project ////
|
//// http://www.opencores.org/cores/oms8051mini/ ////
|
//// http://www.opencores.org/cores/oms8051mini/ ////
|
//// ////
|
//// ////
|
//// Description ////
|
//// Description ////
|
//// 8051 special function register: stack pointer. ////
|
//// 8051 special function register: stack pointer. ////
|
//// ////
|
//// ////
|
//// To Do: ////
|
//// To Do: ////
|
//// nothing ////
|
//// nothing ////
|
//// ////
|
//// ////
|
//// Author(s): ////
|
//// Author(s): ////
|
//// - Simon Teran, simont@opencores.org ////
|
//// - Simon Teran, simont@opencores.org ////
|
//// - Dinesh Annayya, dinesha@opencores.org ////
|
//// - Dinesh Annayya, dinesha@opencores.org ////
|
//// ////
|
//// ////
|
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//// v0.0 - Dinesh A, 5th Jan 2017
|
//// v0.0 - Dinesh A, 5th Jan 2017
|
//// 1. Active edge of reset changed from High to Low
|
//// 1. Active edge of reset changed from High to Low
|
//// v0.1 - Dinesh A, 6th Jan 2017
|
//// v0.1 - Dinesh A, 6th Jan 2017
|
//// 1. pc_next logic added
|
//// 1. pc_next logic added
|
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
|
//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
|
//// ////
|
//// ////
|
//// This source file may be used and distributed without ////
|
//// This source file may be used and distributed without ////
|
//// restriction provided that this copyright statement is not ////
|
//// restriction provided that this copyright statement is not ////
|
//// removed from the file and that any derivative work contains ////
|
//// removed from the file and that any derivative work contains ////
|
//// the original copyright notice and the associated disclaimer. ////
|
//// the original copyright notice and the associated disclaimer. ////
|
//// ////
|
//// ////
|
//// This source file is free software; you can redistribute it ////
|
//// This source file is free software; you can redistribute it ////
|
//// and/or modify it under the terms of the GNU Lesser General ////
|
//// and/or modify it under the terms of the GNU Lesser General ////
|
//// Public License as published by the Free Software Foundation; ////
|
//// Public License as published by the Free Software Foundation; ////
|
//// either version 2.1 of the License, or (at your option) any ////
|
//// either version 2.1 of the License, or (at your option) any ////
|
//// later version. ////
|
//// later version. ////
|
//// ////
|
//// ////
|
//// This source is distributed in the hope that it will be ////
|
//// This source is distributed in the hope that it will be ////
|
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
|
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
|
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
|
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
|
//// PURPOSE. See the GNU Lesser General Public License for more ////
|
//// PURPOSE. See the GNU Lesser General Public License for more ////
|
//// details. ////
|
//// details. ////
|
//// ////
|
//// ////
|
//// You should have received a copy of the GNU Lesser General ////
|
//// You should have received a copy of the GNU Lesser General ////
|
//// Public License along with this source; if not, download it ////
|
//// Public License along with this source; if not, download it ////
|
//// from http://www.opencores.org/lgpl.shtml ////
|
//// from http://www.opencores.org/lgpl.shtml ////
|
//// ////
|
//// ////
|
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
// Revision 1.5 2003/01/13 14:14:41 simont
|
// Revision 1.5 2003/01/13 14:14:41 simont
|
// replace some modules
|
// replace some modules
|
//
|
//
|
// Revision 1.4 2002/11/05 17:23:54 simont
|
// Revision 1.4 2002/11/05 17:23:54 simont
|
// add module oc8051_sfr, 256 bytes internal ram
|
// add module oc8051_sfr, 256 bytes internal ram
|
//
|
//
|
// Revision 1.3 2002/09/30 17:33:59 simont
|
// Revision 1.3 2002/09/30 17:33:59 simont
|
// prepared header
|
// prepared header
|
//
|
//
|
//
|
//
|
|
|
`include "top_defines.v"
|
`include "top_defines.v"
|
|
|
|
|
|
|
module oc8051_sp (
|
module oc8051_sp (
|
// General I/F
|
// General I/F
|
clk,
|
clk,
|
resetn,
|
resetn,
|
|
|
ram_rd_sel,
|
ram_rd_sel,
|
ram_wr_sel,
|
ram_wr_sel,
|
|
|
// SP Reg Write I/F
|
// SP Reg Write I/F
|
wr_addr,
|
wr_addr,
|
wr,
|
wr,
|
wr_bit,
|
wr_bit,
|
data_in,
|
data_in,
|
|
|
sp_out,
|
sp_out,
|
sp_w);
|
sp_w);
|
|
|
|
|
input clk, resetn, wr, wr_bit;
|
input clk, resetn, wr, wr_bit;
|
input [2:0] ram_rd_sel, ram_wr_sel;
|
input [2:0] ram_rd_sel, ram_wr_sel;
|
input [7:0] data_in, wr_addr;
|
input [7:0] data_in, wr_addr;
|
output [7:0] sp_out, sp_w;
|
output [7:0] sp_out, sp_w;
|
|
|
reg [7:0] sp_out, sp_w;
|
reg [7:0] sp_out, sp_w;
|
reg pop;
|
reg pop;
|
wire write;
|
wire write;
|
wire [7:0] sp_t;
|
wire [7:0] sp_t;
|
|
|
reg [7:0] sp;
|
reg [7:0] sp;
|
|
|
|
|
assign write = ((wr_addr==`OC8051_SFR_SP) & (wr) & !(wr_bit));
|
assign write = ((wr_addr==`OC8051_SFR_SP) & (wr) & !(wr_bit));
|
|
|
assign sp_t= write ? data_in : sp;
|
assign sp_t= write ? data_in : sp;
|
|
|
|
|
always @(posedge clk or negedge resetn)
|
always @(posedge clk or negedge resetn)
|
begin
|
begin
|
if (resetn == 1'b0)
|
if (resetn == 1'b0)
|
sp <= #1 `OC8051_RST_SP;
|
sp <= `OC8051_RST_SP;
|
else if (write)
|
else if (write)
|
sp <= #1 data_in;
|
sp <= data_in;
|
else
|
else
|
sp <= #1 sp_out;
|
sp <= sp_out;
|
end
|
end
|
|
|
|
|
always @(sp or ram_wr_sel)
|
always @(sp or ram_wr_sel)
|
begin
|
begin
|
//
|
//
|
// push
|
// push
|
if (ram_wr_sel==`OC8051_RWS_SP) sp_w = sp + 8'h01;
|
if (ram_wr_sel==`OC8051_RWS_SP) sp_w = sp + 8'h01;
|
else sp_w = sp;
|
else sp_w = sp;
|
|
|
end
|
end
|
|
|
|
|
always @(sp_t or ram_wr_sel or pop or write)
|
always @(sp_t or ram_wr_sel or pop or write)
|
begin
|
begin
|
//
|
//
|
// push
|
// push
|
if (write) sp_out = sp_t;
|
if (write) sp_out = sp_t;
|
else if (ram_wr_sel==`OC8051_RWS_SP) sp_out = sp_t + 8'h01;
|
else if (ram_wr_sel==`OC8051_RWS_SP) sp_out = sp_t + 8'h01;
|
else sp_out = sp_t - {7'b0, pop};
|
else sp_out = sp_t - {7'b0, pop};
|
|
|
end
|
end
|
|
|
|
|
always @(posedge clk or negedge resetn)
|
always @(posedge clk or negedge resetn)
|
begin
|
begin
|
if (resetn == 1'b0)
|
if (resetn == 1'b0)
|
pop <= #1 1'b0;
|
pop <= 1'b0;
|
else if (ram_rd_sel==`OC8051_RRS_SP) pop <= #1 1'b1;
|
else if (ram_rd_sel==`OC8051_RRS_SP) pop <= 1'b1;
|
else pop <= #1 1'b0;
|
else pop <= 1'b0;
|
end
|
end
|
|
|
endmodule
|
endmodule
|
|
|