Project

General

Profile

438 markw
`timescale 1ns / 1ps
// ============================================================================
// __
// \\__/ o\ (C) 2014 Robert Finch, Stratford
// \ __ / All rights reserved.
// \/_// robfinch<remove>@finitron.ca
// ||
//
// FT816Sys2.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 FT816Sys2(btn, xclk, Led, sw, kclk, kd,
HDMIOUTCLKP, HDMIOUTCLKN,
HDMIOUTD0P,HDMIOUTD0N,
HDMIOUTD1P,HDMIOUTD1N,
HDMIOUTD2P,HDMIOUTD2N,
HDMIOUTSCL,HDMIOUTSDA
);
input [5:0] btn;
input xclk;
output [7:0] Led;
reg [7:0] Led;
input [7:0] sw;
inout kclk;
tri kclk;
inout kd;
tri kd;
output HDMIOUTCLKP;
output HDMIOUTCLKN;
output HDMIOUTD0P;
output HDMIOUTD0N;
output HDMIOUTD1P;
output HDMIOUTD1N;
output HDMIOUTD2P;
output HDMIOUTD2N;
inout HDMIOUTSCL;
inout HDMIOUTSDA;
tri HDMIOUTSCL;
tri HDMIOUTSDA;

wire xreset = ~btn[0];
wire irq = btn[1];
reg [32:0] rommem [4095:0];
reg [7:0] rammem [16383:0];
wire rw;
wire vda;
wire [23:0] ad;
tri [7:0] db;
wire cs0,cs1,cs4,cs6;
wire rst;
wire vclk,vclk2,vclk10;
wire hsync,vsync,blank,border;
wire [24:0] tc_rgb;

wire [3:0] TMDS;
wire [3:0] TMDSB;
assign HDMIOUTCLKP = TMDS[3];
assign HDMIOUTCLKN = TMDSB[3];
assign HDMIOUTD0P = TMDS[0];
assign HDMIOUTD0N = TMDSB[0];
assign HDMIOUTD1P = TMDS[1];
assign HDMIOUTD1N = TMDSB[1];
assign HDMIOUTD2P = TMDS[2];
assign HDMIOUTD2N = TMDSB[2];
//assign HDMIOUTSCL = 1'b0;
//assign HDMIOUTSDA = 1'b0;


initial begin
`include "..\..\software\asm\FTBios816.ver"
end

wire locked;
wire clk200u,clk85u,clk,sys_clk;

clkgen1366x768 u2
(
.xreset(xreset),
.xclk(xclk),
.rst(rst),
.clk100(),
.clk25(),
.clk200(),
.clk125(), // ETHERMAC clock
.vclk(vclk), // 85.7MHz
.vclk2(vclk2),
.vclk10(vclk10),
.bmp_clk(),
.sys_clk(sys_clk),
.dram_clk(),
.locked(locked),
.pulse1000Hz(),
.pulse100Hz()
);
assign clk = sys_clk;

dvi_out_native u3
(
.reset(rst),
.pll_lckd(locked),
.clkin(vclk), // pixel clock, from bufg
.clkx2in(vclk2), // pixel clock x2, from bufg
.clkx10in(vclk10), // pixel clock x10, unbuffered
.blue_din(tc_rgb[7:0]), // Blue data in
.green_din(tc_rgb[15:8]), // Green data in
.red_din(tc_rgb[23:16]), // Red data in
.hsync(hsync), // hsync data
.vsync(vsync), // vsync data
.de(!blank), // data enable

.TMDS(TMDS),
.TMDSB(TMDSB)
);

//VGASyncGen640x480_60Hz u4
WXGASyncGen1366x768_60Hz u4
(
.rst(rst),
.clk(vclk),
.hSync(hsync),
.vSync(vsync),
.blank(blank),
.border(border)
);

wire tc_rdy;
rtfTextController816 tc1
(
.rst(rst),
.clk(clk),
.rdy(tc_rdy),
.rw(rw),
.vda(vda),
.ad(ad),
.db(db),
.vclk(vclk),
.hsync(hsync),
.vsync(vsync),
.blank(blank),
.border(border),
.rgbIn(25'h0),
.rgbOut(tc_rgb)
);

wire kbd_rst;
wire kbd_rdy;
PS2KbdToAscii #(.pIOAddress(32'h00FEA110)) u_kbd
(
.rst_i(rst),
.clk_i(clk),
.cyc_i(vda),
.stb_i(vda),
.ack_o(kbd_rdy),
.we_i(~rw),
.adr_i({8'h00,ad}),
.dat_i(db),
.dat_o(),
.db(db),
.kclk(kclk),
.kd(kd),
.irq(),
.rst_o(kbd_rst)
);

PRNG u_prng
(
.rst(rst),
.clk(clk),
.vda(vda),
.rw(rw),
.ad(ad),
.db(db),
.rdy(prng_rdy)
);

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 && ad[23:15]==17'h0000)
rammem[ad[13:0]] <= db;

reg [7:0] ro;
always @(posedge clk)
case(ad[1:0])
2'd0: ro <= rommem[ad[13:2]][7:0];
2'd1: ro <= rommem[ad[13:2]][15:8];
2'd2: ro <= rommem[ad[13:2]][23:16];
2'd3: ro <= rommem[ad[13:2]][31:24];
endcase
/*
always @(posedge clk)
if (~cs4 & ~rw)
case(ad[1:0])
2'd0: rommem[ad[13:2]][7:0] <= db;
2'd0: rommem[ad[13:2]][15:8] <= db;
2'd0: rommem[ad[13:2]][23:16] <= db;
2'd0: rommem[ad[13:2]][31:24] <= db;
endcase
*/
reg [7:0] ramo;
reg ramrdy;
always @(posedge clk)
ramo <= rammem[ad[13:0]];
always @(posedge clk)
ramrdy <= ~cs6;
assign db = rw & ~cs1 ? sw : {8{1'bz}};
assign db = rw & ~cs4 ? ro : {8{1'bz}};
assign db = (rw & ~cs6 && ad[23:15]==17'h0000) ? ramo : {8{1'bz}};
wire ram_rdy = ~cs6 ? (~rw ? 1'b1 : ramrdy) : 1'b1;

FT816mpu u1
(
.rst(~rst),
.clk(clk),
.phi11(),
.phi12(),
.phi81(),
.phi82(),
.rdy(prng_rdy & tc_rdy & ram_rdy),
.e(),
.mx(),
.nmi(~kbd_rst),
.irq(~btn[1]),
.abort(1'b1),
.be(1'b1),
.vpa(),
.vda(vda),
.mlb(),
.vpb(),
.rw(rw),
.ad(ad),
.db(db),
.cs0(cs0),
.cs1(cs1),
.cs2(),
.cs3(),
.cs4(cs4),
.cs5(),
.cs6(cs6)
);

endmodule