`timescale 1ns / 1ps // ============================================================================ // __ // \\__/ o\ (C) 2014 Robert Finch, Stratford // \ __ / All rights reserved. // \/_// robfinch@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 . // // ============================================================================ // `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