1 |
2 |
wd5gnr |
/*
|
2 |
|
|
This file is part of Blue8.
|
3 |
|
|
|
4 |
|
|
Foobar is free software: you can redistribute it and/or modify
|
5 |
|
|
it under the terms of the GNU Lesser General Public License as published by
|
6 |
|
|
the Free Software Foundation, either version 3 of the License, or
|
7 |
|
|
(at your option) any later version.
|
8 |
|
|
|
9 |
|
|
Foobar is distributed in the hope that it will be useful,
|
10 |
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11 |
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12 |
|
|
GNU Lesser General Public License for more details.
|
13 |
|
|
|
14 |
|
|
You should have received a copy of the GNU Lesser General Public License
|
15 |
|
|
along with Blue8. If not, see <http://www.gnu.org/licenses/>.
|
16 |
|
|
|
17 |
|
|
Blue8 by Al Williams alw@al-williams.com
|
18 |
|
|
|
19 |
|
|
*/
|
20 |
|
|
|
21 |
|
|
`timescale 1ns / 1ps
|
22 |
|
|
////////////////////////////////////////////////////////////////////////////////
|
23 |
|
|
// Company:
|
24 |
|
|
// Engineer:
|
25 |
|
|
//
|
26 |
|
|
// Create Date: 10:26:07 12/28/05
|
27 |
|
|
// Design Name:
|
28 |
|
|
// Module Name: topbox
|
29 |
|
|
// Project Name:
|
30 |
|
|
// Target Device:
|
31 |
|
|
// Tool versions:
|
32 |
|
|
// Description:
|
33 |
|
|
//
|
34 |
|
|
// Dependencies:
|
35 |
|
|
//
|
36 |
|
|
// Revision:
|
37 |
|
|
// Revision 0.01 - File Created
|
38 |
|
|
// Additional Comments:
|
39 |
|
|
//
|
40 |
|
|
////////////////////////////////////////////////////////////////////////////////
|
41 |
|
|
|
42 |
|
|
`default_nettype none
|
43 |
|
|
module topbox(input clkin, input pb0, input pb1, input pb2, input pb3, input [7:0] sw,
|
44 |
|
|
output [7:0] led, output [6:0] display, output dp, output[3:0] digsel,
|
45 |
|
|
output wire [17:0] xmaddress, inout wire [15:0] xmdata, output wire xmwrite,
|
46 |
|
|
output wire xmsend, output wire xmce, output wire xmub, output wire xmlb,
|
47 |
|
|
output wire serialout, input wire serialin);
|
48 |
|
|
wire clk;
|
49 |
|
|
wire clear, start, stop, lpc, exam, dep, xrun;
|
50 |
|
|
wire [15:0] ir;
|
51 |
|
|
wire [15:0] ac;
|
52 |
|
|
wire [11:0] pc;
|
53 |
|
|
wire [15:0] swreg;
|
54 |
|
|
wire cpuwrite, cpusend;
|
55 |
|
|
wire ser_avail;
|
56 |
|
|
wire ser_tbe, ser_tse;
|
57 |
|
|
wire ser_ferr, ser_oerr;
|
58 |
|
|
wire [7:0] serialrx;
|
59 |
|
|
|
60 |
|
|
wire Q;
|
61 |
|
|
wire iomem;
|
62 |
|
|
|
63 |
|
|
assign iomem=xmaddress[17:4]==14'h0FF;
|
64 |
|
|
assign xmce=~((cpusend|cpuwrite)& ~iomem); // enable on all reads and writes except those in I/O block
|
65 |
|
|
assign xmub=1'b0;
|
66 |
|
|
assign xmlb=1'b0;
|
67 |
|
|
assign xmaddress[17:12]=6'b0;
|
68 |
|
|
assign xmwrite=~cpuwrite;
|
69 |
|
|
assign xmsend=~cpusend;
|
70 |
|
|
|
71 |
|
|
// start RS232 loader
|
72 |
|
|
reg loadlow;
|
73 |
|
|
reg loadnow;
|
74 |
|
|
reg [15:0] swregx;
|
75 |
|
|
reg [3:0] loaddelay;
|
76 |
|
|
|
77 |
|
|
always @(posedge clk or posedge clear)
|
78 |
|
|
begin
|
79 |
|
|
if (clear)
|
80 |
|
|
begin
|
81 |
|
|
loadlow<=1'b0;
|
82 |
|
|
loadnow<=1'b0;
|
83 |
|
|
loaddelay<=4'b0000; // hold swregx long enough for load cycle
|
84 |
|
|
end
|
85 |
|
|
else if (led[2] || led[4]) begin loadlow<=1'b0; loadnow<=1'b0; loaddelay<=4'b0000; end // reset if not in load mode
|
86 |
|
|
else if (led[3] & ~led[7]) // must be in load and not in running mode
|
87 |
|
|
begin
|
88 |
|
|
if (ser_avail & ~loadlow) begin swregx[15:8]<=serialrx; loadlow<=1; end
|
89 |
|
|
else if (ser_avail & loadlow) begin swregx[7:0]<=serialrx; loadlow<=1'b0; loadnow<=1'b1; end
|
90 |
|
|
else if (loadnow && loaddelay==4'b1000)
|
91 |
|
|
begin
|
92 |
|
|
loadnow<=1'b0;
|
93 |
|
|
loaddelay<=4'b0000;
|
94 |
|
|
end else if (loadnow)
|
95 |
|
|
loaddelay<=loaddelay+1;
|
96 |
|
|
end
|
97 |
|
|
end
|
98 |
|
|
|
99 |
|
|
|
100 |
|
|
// end loader
|
101 |
|
|
|
102 |
|
|
wire loadsw;
|
103 |
|
|
wire readuart, writeuart, readio, writeio;
|
104 |
|
|
assign readio=cpusend & iomem;
|
105 |
|
|
assign writeio=cpuwrite & iomem;
|
106 |
|
|
assign readuart=readio & xmaddress[3:0]==4'hf;
|
107 |
|
|
assign writeuart=writeio & xmaddress[3:0]==4'hf;
|
108 |
|
|
|
109 |
|
|
assign loadsw=cpuwrite & (xmaddress[3:0]==4'h0) & iomem;
|
110 |
|
|
assign xmdata=(readio & (xmaddress[3:0]==4'h0))? swreg : 16'bz;
|
111 |
|
|
assign xmdata=(readio & (xmaddress[3:0]==4'h1))? { pb3, 7'h0, sw }:16'bz;
|
112 |
|
|
|
113 |
|
|
// Note that a change in tactics means that pb3 is known as pb0 in the front panel!
|
114 |
|
|
// pb2 is pb1 etc. (ought to change it).
|
115 |
|
|
FrontPanel panel(clk, pb3, pb2, pb1, pb0, sw, led, display, dp, digsel,
|
116 |
|
|
clear, start, stop, lpc, exam, dep, xrun, swreg, ir, ac, pc, Q, loadsw, xmdata);
|
117 |
|
|
|
118 |
|
|
blue CPU(clear,clkin, ac, start,
|
119 |
|
|
stop, exam, dep|loadnow, pc,
|
120 |
|
|
loadnow?swregx:swreg, lpc, ir,xrun,xmaddress[11:0],xmdata,cpuwrite,cpusend,clk, Q);
|
121 |
|
|
|
122 |
|
|
|
123 |
|
|
|
124 |
|
|
|
125 |
|
|
assign xmdata= (readuart) ? { ser_avail, 7'b0000000, serialrx } : 16'bz;
|
126 |
|
|
assign xmdata= (readio & (xmaddress[3:0]==4'he)) ? { ser_tbe, ser_tse, ser_ferr, ser_oerr ,ser_avail, 11'b0 } : 16'bz;
|
127 |
|
|
|
128 |
|
|
defparam serialport.BAUD=57600;
|
129 |
|
|
defparam serialport.XTAL_CLK = 36000000;
|
130 |
|
|
|
131 |
|
|
uart serialport ( clk, clear, serialin, serialout, xmdata[7:0],
|
132 |
|
|
serialrx,ser_avail,readuart|(led[3]&~led[7]&ser_avail&~loadnow),ser_tbe,ser_tse,
|
133 |
|
|
writeuart ,ser_ferr,ser_oerr);
|
134 |
|
|
|
135 |
|
|
|
136 |
|
|
endmodule
|