|
`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
|