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 |
|
|
`timescale 1ns / 1ps
|
21 |
|
|
`default_nettype none
|
22 |
|
|
////////////////////////////////////////////////////////////////////////////////
|
23 |
|
|
// Company:
|
24 |
|
|
// Engineer:
|
25 |
|
|
//
|
26 |
|
|
// Create Date: 20:52:58 12/21/05
|
27 |
|
|
// Design Name:
|
28 |
|
|
// Module Name: FrontPanel
|
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 |
|
|
// I rearranged these from version 1
|
43 |
|
|
`define p_sw 4'b100 // when points==4 show switches
|
44 |
|
|
`define p_acc 4'b10 // when points==2 show acc
|
45 |
|
|
`define p_ir 4'b1000 // when points==8 show ir
|
46 |
|
|
`define p_pc 4'b1 // when points==1 show pc
|
47 |
|
|
|
48 |
|
|
|
49 |
|
|
// after operating for awhile I'm not sure the original order was best
|
50 |
|
|
// Seems like regsel should be #1 followed by loadpc, exam, deposit, step, start
|
51 |
|
|
`define i_lpc 6'b10 // load pc
|
52 |
|
|
`define i_exam 6'b100 // examine
|
53 |
|
|
`define i_deposit 6'b1000 // deposit
|
54 |
|
|
`define i_regsel 6'b1 // register select
|
55 |
|
|
`define i_step 6'b10000 // single step
|
56 |
|
|
`define i_start 6'b100000 // run/stop
|
57 |
|
|
|
58 |
|
|
|
59 |
|
|
module FrontPanel(input wire clockin, input wire pb0, input wire pb1, input wire pb2, input wire pb3,
|
60 |
|
|
input wire [7:0] sw, output wire [7:0] led, output wire [6:0] display, output dp,
|
61 |
|
|
output [3:0] digsel, output wire clear, output wire start, output wire stop,
|
62 |
|
|
output wire lpc, output wire exam, output wire dep, input wire xrun,
|
63 |
|
|
output wire [15:0] swreg, input wire [15:0] irin, input wire [15:0] acin, input wire [11:0] pcin,
|
64 |
|
|
input wire Q, input wire setswreg, input wire [15:0] databus);
|
65 |
|
|
|
66 |
|
|
wire select; // select input buttons
|
67 |
|
|
reg [5:0] inselect; // state
|
68 |
|
|
|
69 |
|
|
wire [15:0] ledbus;
|
70 |
|
|
reg [3:0] points;
|
71 |
|
|
wire [3:0] pts; // decimal points
|
72 |
|
|
wire act, ent;
|
73 |
|
|
wire step;
|
74 |
|
|
|
75 |
|
|
|
76 |
|
|
assign pts=(pb0?`p_sw:points);
|
77 |
|
|
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
|
81 |
|
|
|
82 |
|
|
DisplayHex hexdisp(clockin,clear,ledbus[7:0],ledbus[15:8],~pts,display[0],display[1],
|
83 |
|
|
display[2],display[3],display[4],display[5],display[6],dp,digsel[0],digsel[1],digsel[2],digsel[3]);
|
84 |
|
|
|
85 |
|
|
// switches get latched in 8 bits at a time
|
86 |
|
|
reg [15:0] switches;
|
87 |
|
|
assign swreg=switches;
|
88 |
|
|
|
89 |
|
|
// very strange. This gave unpredicatble results with setswreg controling the mux but works
|
90 |
|
|
// with ent controlling!
|
91 |
|
|
always @(posedge clockin or posedge clear) begin
|
92 |
|
|
if (clear) switches<=0;
|
93 |
|
|
else if (setswreg | ent)
|
94 |
|
|
begin
|
95 |
|
|
switches[15:8]<=ent?switches[7:0]:databus[15:8];
|
96 |
|
|
switches[7:0]<=ent?sw:databus[7:0];
|
97 |
|
|
end
|
98 |
|
|
end
|
99 |
|
|
|
100 |
|
|
assign ledbus=((points==`p_sw||pb0==1'b1)?switches:((points==`p_acc)?acin:((points==`p_ir)?irin:((points==`p_pc)?pcin:0))));
|
101 |
|
|
|
102 |
|
|
//reg pb3s0, pb3s1;
|
103 |
|
|
|
104 |
|
|
assign clear=pb3;
|
105 |
|
|
// assign clear=pb3s0 | pb3s1;
|
106 |
|
|
// always @(posedge clockin)
|
107 |
|
|
// begin
|
108 |
|
|
// pb3s1<=pb3s0;
|
109 |
|
|
// pb3s0<=pb3;
|
110 |
|
|
// end
|
111 |
|
|
|
112 |
|
|
Debouncer dselect(clockin,clear,pb2,,select,);
|
113 |
|
|
Debouncer daction(clockin, clear, pb1,,act,);
|
114 |
|
|
Debouncer denter(clockin, clear, pb0,,ent,);
|
115 |
|
|
|
116 |
|
|
assign led[7]=Q;
|
117 |
|
|
assign led[6]=xrun;
|
118 |
|
|
assign led[5]=inselect[5];
|
119 |
|
|
assign led[4]=inselect[4];
|
120 |
|
|
assign led[3]=inselect[3];
|
121 |
|
|
assign led[2]=inselect[2];
|
122 |
|
|
assign led[1]=inselect[1];
|
123 |
|
|
assign led[0]=inselect[0];
|
124 |
|
|
|
125 |
|
|
// I don't want to use the cycle names here because we always
|
126 |
|
|
// want them to go 1, 2, 3, 4... even if the meanings of 1, 2, 3, 4 change
|
127 |
|
|
always @(posedge clockin or posedge clear) begin
|
128 |
|
|
if (clear) inselect<=6'b1;
|
129 |
|
|
else if (select) case (inselect)
|
130 |
|
|
6'b1: inselect<=6'b10;
|
131 |
|
|
6'b10: inselect<=6'b100;
|
132 |
|
|
6'b100: inselect<=6'b1000;
|
133 |
|
|
6'b1000: inselect<=6'b10000;
|
134 |
|
|
6'b10000: inselect<=6'b100000;
|
135 |
|
|
6'b100000: inselect<=6'b1;
|
136 |
|
|
default: inselect<=6'b1;
|
137 |
|
|
endcase
|
138 |
|
|
end
|
139 |
|
|
|
140 |
|
|
|
141 |
|
|
assign lpc=act&(inselect==`i_lpc);
|
142 |
|
|
assign exam=act&(inselect==`i_exam);
|
143 |
|
|
assign dep=act&(inselect==`i_deposit);
|
144 |
|
|
// state 1000 is register display select
|
145 |
|
|
// Note we use 1 here and not a particular define because we always want to start at 1
|
146 |
|
|
always @(posedge clockin or posedge clear) begin
|
147 |
|
|
if (clear) points=4'b1;
|
148 |
|
|
else
|
149 |
|
|
if (act & (inselect==`i_regsel)) begin
|
150 |
|
|
points=points<<1;
|
151 |
|
|
if (points==4'b0) points=4'b1;
|
152 |
|
|
end
|
153 |
|
|
end
|
154 |
|
|
|
155 |
|
|
|
156 |
|
|
// state 10000 is step
|
157 |
|
|
assign step=(inselect==`i_step) & act;
|
158 |
|
|
|
159 |
|
|
assign start=((~xrun) & act & (inselect==`i_start)) | step;
|
160 |
|
|
assign stop=(xrun & act & (inselect==`i_start)) | step; // potential for harmless stop before start glitch?
|
161 |
|
|
|
162 |
|
|
|
163 |
|
|
|
164 |
|
|
|
165 |
|
|
|
166 |
|
|
endmodule
|