repo2/ultimate_cart/veronica/FT816Sys.v @ 1475
438 | markw | `timescale 1ns / 1ps
|
|
// ============================================================================
|
|||
// __
|
|||
// \\__/ o\ (C) 2014 Robert Finch, Stratford
|
|||
// \ __ / All rights reserved.
|
|||
// \/_// robfinch<remove>@finitron.ca
|
|||
// ||
|
|||
//
|
|||
// FT816Sys.v
|
|||
// - Top Module for 16 bit CPU
|
|||
//
|
|||
// 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 3 of the License, or
|
|||
// (at your option) any later version.
|
|||
//
|
|||
// This source file 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 General Public License for more details.
|
|||
//
|
|||
// You should have received a copy of the GNU General Public License
|
|||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
//
|
|||
// ============================================================================
|
|||
//
|
|||
`define TRUE 1'b1
|
|||
`define FALSE 1'b0
|
|||
module FT816Sys(btn, xclk, Led, sw);
|
|||
input [5:0] btn;
|
|||
input xclk;
|
|||
output [7:0] Led;
|
|||
reg [7:0] Led;
|
|||
input [7:0] sw;
|
|||
wire xreset = ~btn[0];
|
|||
wire irq = btn[1];
|
|||
reg [32:0] rommem [2047:0];
|
|||
reg [7:0] rammem [8191:0];
|
|||
wire rw;
|
|||
wire [23:0] ad;
|
|||
tri [7:0] db;
|
|||
wire cs0,cs1,cs4,cs6;
|
|||
initial begin
|
|||
`include "..\..\software\asm\test816.ver"
|
|||
end
|
|||
wire locked;
|
|||
wire clk200u,clk85u,clk;
|
|||
BUFG bg5 (.I(clk85u), .O(clk) );
|
|||
DCM dcm0(
|
|||
.RST(xreset),
|
|||
.PSCLK(gnd),
|
|||
.PSEN(gnd),
|
|||
.PSINCDEC(gnd),
|
|||
.DSSEN(gnd),
|
|||
.CLKIN(xclk),
|
|||
.CLKFB(clk200u), // 200.000 MHz
|
|||
.CLKDV(),
|
|||
.CLKFX(clk85u), // 85.714 MHz unbuffered
|
|||
.CLKFX180(),
|
|||
.CLK0(),
|
|||
.CLK2X(clk200u), // 200.xxx MHz
|
|||
.CLK2X180(),
|
|||
.CLK90(),
|
|||
.CLK180(),
|
|||
.CLK270(),
|
|||
.LOCKED(locked),
|
|||
.PSDONE(),
|
|||
.STATUS()
|
|||
);
|
|||
defparam dcm0.CLK_FEEDBACK = "2x";
|
|||
defparam dcm0.CLKDV_DIVIDE = 5.0;
|
|||
defparam dcm0.CLKFX_DIVIDE = 25; // (16/25)*100 = 64 MHz
|
|||
defparam dcm0.CLKFX_MULTIPLY = 16;
|
|||
defparam dcm0.CLKIN_DIVIDE_BY_2 = "FALSE";
|
|||
defparam dcm0.CLKIN_PERIOD = 10.000;
|
|||
defparam dcm0.CLKOUT_PHASE_SHIFT = "NONE";
|
|||
defparam dcm0.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
|
|||
defparam dcm0.DFS_FREQUENCY_MODE = "LOW";
|
|||
defparam dcm0.DLL_FREQUENCY_MODE = "LOW";
|
|||
defparam dcm0.DUTY_CYCLE_CORRECTION = "FALSE";
|
|||
// defparam dcm0.FACTORY_JF = 16'h8080;
|
|||
defparam dcm0.PHASE_SHIFT = 0;
|
|||
defparam dcm0.STARTUP_WAIT = "FALSE";
|
|||
always @(posedge clk)
|
|||
if (~locked)
|
|||
Led <= 8'h00;
|
|||
else begin
|
|||
if (~cs0 && ~rw && ad[7:0]==8'h00)
|
|||
Led <= db;
|
|||
end
|
|||
always @(posedge clk)
|
|||
if (~cs6 & ~rw)
|
|||
rammem[ad[12:0]] <= db;
|
|||
reg [7:0] ro;
|
|||
always @*
|
|||
case(ad[1:0])
|
|||
2'd0: ro <= rommem[ad[12:2]][7:0];
|
|||
2'd1: ro <= rommem[ad[12:2]][15:8];
|
|||
2'd2: ro <= rommem[ad[12:2]][23:16];
|
|||
2'd3: ro <= rommem[ad[12:2]][31:24];
|
|||
endcase
|
|||
assign db = rw & ~cs1 ? sw : {8{1'bz}};
|
|||
assign db = rw & ~cs4 ? ro : {8{1'bz}};
|
|||
assign db = rw & ~cs6 ? rammem[ad[12:0]] : {8{1'bz}};
|
|||
FT816mpu u1
|
|||
(
|
|||
.rst(~locked),
|
|||
.clk(clk),
|
|||
.phi11(),
|
|||
.phi12(),
|
|||
.phi81(),
|
|||
.phi82(),
|
|||
.rdy(1'b1),
|
|||
.e(),
|
|||
.mx(),
|
|||
.nmi(1'b0),
|
|||
.irq(btn[1]),
|
|||
.be(1'b1),
|
|||
.vpa(),
|
|||
.vda(),
|
|||
.mlb(),
|
|||
.vpb(),
|
|||
.rw(rw),
|
|||
.ad(ad),
|
|||
.db(db),
|
|||
.cs0(cs0),
|
|||
.cs1(cs1),
|
|||
.cs2(),
|
|||
.cs3(),
|
|||
.cs4(cs4),
|
|||
.cs5(),
|
|||
.cs6(cs6)
|
|||
);
|
|||
endmodule
|