OpenCores
URL https://opencores.org/ocsvn/blue/blue/trunk

Subversion Repositories blue

[/] [blue/] [trunk/] [blue8/] [topbox.v] - Rev 2

Compare with Previous | Blame | View Log

/*
    This file is part of Blue8.
 
    Foobar 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.
 
    Foobar 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 Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public License
    along with Blue8.  If not, see <http://www.gnu.org/licenses/>.
 
    Blue8 by Al Williams alw@al-williams.com
 
*/
 
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:    10:26:07 12/28/05
// Design Name:    
// Module Name:    topbox
// Project Name:   
// Target Device:  
// Tool versions:  
// Description:
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////
 
`default_nettype	 none
module topbox(input clkin, input pb0, input pb1, input pb2, input pb3, input [7:0] sw,
output [7:0] led, output [6:0] display, output dp, output[3:0] digsel,
			 output wire [17:0] xmaddress, inout wire [15:0] xmdata, output wire xmwrite, 
				 output wire xmsend, output wire xmce, output wire xmub, output wire xmlb,	 
				 output wire serialout, input wire serialin);
wire clk;
wire clear, start, stop, lpc, exam, dep, xrun;
wire [15:0] ir;
wire [15:0] ac; 
wire [11:0] pc;
wire [15:0] swreg;
wire cpuwrite, cpusend;
wire ser_avail;	 
wire ser_tbe, ser_tse;
wire ser_ferr, ser_oerr;
wire [7:0] serialrx;
 
wire Q;
wire iomem;
 
assign iomem=xmaddress[17:4]==14'h0FF;
assign xmce=~((cpusend|cpuwrite)& ~iomem);  // enable on all reads and writes except those in I/O block
assign xmub=1'b0;
assign xmlb=1'b0;
assign xmaddress[17:12]=6'b0;
assign xmwrite=~cpuwrite;
assign xmsend=~cpusend;
 
// start RS232 loader
reg loadlow;
reg loadnow;
reg [15:0] swregx;
reg [3:0] loaddelay;
 
always @(posedge clk or posedge clear)
begin
if (clear) 
  begin
  loadlow<=1'b0;
  loadnow<=1'b0;
  loaddelay<=4'b0000;  // hold swregx long enough for load cycle
  end
else if (led[2] || led[4]) begin loadlow<=1'b0; loadnow<=1'b0; loaddelay<=4'b0000; end  // reset if not in load mode
else if (led[3] & ~led[7])  // must be in load and not in running mode
  begin
    	if (ser_avail & ~loadlow) begin swregx[15:8]<=serialrx; loadlow<=1; end
		else if (ser_avail & loadlow) begin swregx[7:0]<=serialrx; loadlow<=1'b0; loadnow<=1'b1; end
		else if (loadnow && loaddelay==4'b1000) 
		  begin
		    loadnow<=1'b0;
			 loaddelay<=4'b0000;
        end else if (loadnow)
		    loaddelay<=loaddelay+1;
     end
end
 
 
// end loader
 
wire loadsw;
wire readuart, writeuart, readio, writeio;
assign readio=cpusend & iomem;
assign writeio=cpuwrite & iomem;
assign readuart=readio & xmaddress[3:0]==4'hf;
assign writeuart=writeio & xmaddress[3:0]==4'hf;
 
assign loadsw=cpuwrite & (xmaddress[3:0]==4'h0) & iomem;
assign xmdata=(readio & (xmaddress[3:0]==4'h0))? swreg : 16'bz;
assign xmdata=(readio & (xmaddress[3:0]==4'h1))? { pb3, 7'h0, sw }:16'bz;
 
// Note that a change in tactics means that pb3 is known as pb0 in the front panel!
// pb2 is pb1 etc. (ought to change it).
FrontPanel panel(clk, pb3, pb2, pb1, pb0, sw, led, display, dp, digsel,
   clear, start, stop, lpc, exam, dep, xrun, swreg, ir, ac,  pc, Q, loadsw, xmdata);
 
blue CPU(clear,clkin, ac, start,
              stop,  exam,   dep|loadnow, pc,
				  loadnow?swregx:swreg, lpc, ir,xrun,xmaddress[11:0],xmdata,cpuwrite,cpusend,clk, Q);
 
 
 
 
assign xmdata= (readuart) ? { ser_avail, 7'b0000000, serialrx  } : 16'bz;
assign xmdata= (readio & (xmaddress[3:0]==4'he)) ? {  ser_tbe, ser_tse, ser_ferr, ser_oerr ,ser_avail, 11'b0 } : 16'bz;
 
defparam serialport.BAUD=57600;
defparam serialport.XTAL_CLK = 36000000;
 
uart serialport	(	clk, clear, serialin, serialout, xmdata[7:0],
				serialrx,ser_avail,readuart|(led[3]&~led[7]&ser_avail&~loadnow),ser_tbe,ser_tse,
				writeuart ,ser_ferr,ser_oerr);
 
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.