summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Blake Kongslie2021-10-24 15:02:31 -0700
committerJulian Blake Kongslie2021-10-24 15:08:18 -0700
commit15daf2fe9fd13e18609b2141c3346fec6389bda9 (patch)
treea6724dcfb7bb9769bd8dec67fd06dd9e17f5c1e6
parentIgnore backup files created by Altera GUI. (diff)
downloadnoncpu-15daf2fe9fd13e18609b2141c3346fec6389bda9.tar.xz
More blinkenlights work.
Diffstat (limited to '')
-rw-r--r--PLAN17
-rw-r--r--hdl/core.sv73
-rw-r--r--hdl/panel.sv8
-rw-r--r--hdl/top.sv112
-rw-r--r--mem/hello.pal2
5 files changed, 183 insertions, 29 deletions
diff --git a/PLAN b/PLAN
index d5c2311..ffc0ba1 100644
--- a/PLAN
+++ b/PLAN
@@ -1,3 +1,20 @@
1Turn on blinkenlights from the PDP core
2
3There's probably a bug in the UART TX code that's dropping characters when it gets full
4
5Debounce switches
6
7Implement switch features:
8 Start
9 Load_Add
10 Deposit
11 Examine
12 Continue
13 Stop
14 Single_Step
15 Single_Inst
16 The DF* IF* and SR* data switches
17
1Don't ignore 6000 and 6001 18Don't ignore 6000 and 6001
2 19
3Add "interrupts enabled" flag 20Add "interrupts enabled" flag
diff --git a/hdl/core.sv b/hdl/core.sv
index 1b61944..c0e1a63 100644
--- a/hdl/core.sv
+++ b/hdl/core.sv
@@ -6,21 +6,58 @@ module core
6 ) 6 )
7 ( input bit clk 7 ( input bit clk
8 , input bit reset 8 , input bit reset
9
10 , input bit switch_cont
11
12 , output bit [0:ADDR_BITS-1] led_pc
13 , output bit [0:ADDR_BITS-1] led_memaddr
14 , output bit [0:DATA_BITS-1] led_memdata
15 , output bit [0:DATA_BITS-1] led_acc
16 , output bit [0:DATA_BITS-1] led_mq
17 , output bit led_and
18 , output bit led_tad
19 , output bit led_isz
20 , output bit led_dca
21 , output bit led_jms
22 , output bit led_jmp
23 , output bit led_iot
24 , output bit led_opr
25 , output bit led_fetch
26 , output bit led_execute
27 , output bit led_defer
28 , output bit led_word_count
29 , output bit led_current_address
30 , output bit led_break
31 , output bit led_ion
32 , output bit led_pause
33 , output bit led_run
34 , output bit [0:4] led_step_counter
35 , output bit [0:2] led_df
36 , output bit [0:2] led_if
37 , output bit led_link
9 ); 38 );
10 39
40bit run;
41assign led_run = run;
42
11bit mem_ready; 43bit mem_ready;
12bit mem_valid; 44bit mem_valid;
13bit mem_write; 45bit mem_write;
14bit [ADDR_BITS-1:0] mem_address; 46bit [ADDR_BITS-1:0] mem_address;
15bit [DATA_BITS-1:0] mem_write_data; 47bit [DATA_BITS-1:0] mem_write_data;
16 48
49assign led_df = 0;
50assign led_if = 0;
51assign led_memaddr = mem_address;
52
17bit mem_read_valid; 53bit mem_read_valid;
18bit [DATA_BITS-1:0] mem_read_data; 54bit [DATA_BITS-1:0] mem_read_data;
19 55
20mem 56mem
21 #( .ADDR_BITS(ADDR_BITS) 57 #( .ADDR_BITS(ADDR_BITS)
22 , .DATA_BITS(DATA_BITS) 58 , .DATA_BITS(DATA_BITS)
23 , .INIT_FILE("mem/focal69.loaded.hex") 59// , .INIT_FILE("mem/focal69.loaded.hex")
60 , .INIT_FILE("build/mem/hello.hex")
24 ) 61 )
25 memory 62 memory
26 ( .clk(clk) 63 ( .clk(clk)
@@ -67,6 +104,19 @@ bit [8:0] operand;
67bit [DATA_BITS-1:0] acc; 104bit [DATA_BITS-1:0] acc;
68bit link; 105bit link;
69 106
107assign led_pc = pc;
108assign led_acc = acc;
109assign led_link = link;
110
111assign led_and = opcode == 0;
112assign led_tad = opcode == 1;
113assign led_isz = opcode == 2;
114assign led_dca = opcode == 3;
115assign led_jms = opcode == 4;
116assign led_jmp = opcode == 5;
117assign led_iot = opcode == 6;
118assign led_opr = opcode == 7;
119
70bit kbd_valid; 120bit kbd_valid;
71bit [DATA_BITS-1:0] kbd_data; 121bit [DATA_BITS-1:0] kbd_data;
72 122
@@ -87,8 +137,14 @@ enum
87 , HALT 137 , HALT
88 } state; 138 } state;
89 139
140assign led_fetch = state == FETCH || state == DECODE;
141assign led_execute = state == AGEN || state == EXEC;
142assign led_defer = state == INDIRECT || state == INDIRECTED || state == PREINC;
143assign led_pause = state == MEMWAIT || state == HALT;
144
90always_ff @(posedge clk) begin 145always_ff @(posedge clk) begin
91 if (reset) begin 146 if (reset) begin
147 run = 0;
92 mem_valid = 0; 148 mem_valid = 0;
93 rx_ready = 0; 149 rx_ready = 0;
94 tx_valid = 0; 150 tx_valid = 0;
@@ -98,7 +154,9 @@ always_ff @(posedge clk) begin
98 link = 1; 154 link = 1;
99 kbd_valid = 0; 155 kbd_valid = 0;
100 state = state.first; 156 state = state.first;
101 end else begin 157 end else if (run || switch_cont) begin
158 run = 1;
159
102 if (`lag(tx_ready)) tx_valid = 0; 160 if (`lag(tx_ready)) tx_valid = 0;
103 if (rx_ready && `lag(rx_valid)) begin 161 if (rx_ready && `lag(rx_valid)) begin
104 kbd_valid = 1; 162 kbd_valid = 1;
@@ -122,6 +180,7 @@ always_ff @(posedge clk) begin
122 mem_write = 0; 180 mem_write = 0;
123 if (`lag(mem_read_valid)) begin 181 if (`lag(mem_read_valid)) begin
124 state = FETCH; 182 state = FETCH;
183 led_memdata = `lag(mem_read_data);
125 {opcode, operand} = `lag(mem_read_data); 184 {opcode, operand} = `lag(mem_read_data);
126// $display("%o: decode %o %o", pc-1, opcode, operand); 185// $display("%o: decode %o %o", pc-1, opcode, operand);
127 // verilator lint_off WIDTH 186 // verilator lint_off WIDTH
@@ -261,10 +320,12 @@ always_ff @(posedge clk) begin
261 end 320 end
262 if (`lag(mem_read_valid)) begin 321 if (`lag(mem_read_valid)) begin
263 if (address[7:3] == 5'b00001) begin 322 if (address[7:3] == 5'b00001) begin
323 led_memdata = `lag(mem_read_data);
264 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)}; 324 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)};
265 address += 1; 325 address += 1;
266 state = PREINC; 326 state = PREINC;
267 end else begin 327 end else begin
328 led_memdata = `lag(mem_read_data);
268 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)}; 329 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)};
269 case (opcode) 330 case (opcode)
270 'o0, 'o1, 'o2: state = AGEN; 331 'o0, 'o1, 'o2: state = AGEN;
@@ -282,6 +343,7 @@ always_ff @(posedge clk) begin
282 mem_valid = 1; 343 mem_valid = 1;
283 mem_write = 1; 344 mem_write = 1;
284 mem_write_data = address[DATA_BITS-1:0]; 345 mem_write_data = address[DATA_BITS-1:0];
346 led_memdata = mem_write_data;
285 case (opcode) 347 case (opcode)
286 'o0, 'o1, 'o2: state = `lag(mem_ready) ? AGEN : PREINC; 348 'o0, 'o1, 'o2: state = `lag(mem_ready) ? AGEN : PREINC;
287 'o3, 'o4, 'o5: state = `lag(mem_ready) ? EXEC : PREINC; 349 'o3, 'o4, 'o5: state = `lag(mem_ready) ? EXEC : PREINC;
@@ -311,13 +373,14 @@ always_ff @(posedge clk) begin
311 if (! stall) begin 373 if (! stall) begin
312 state = FETCH; 374 state = FETCH;
313 case (opcode) 375 case (opcode)
314 'o0: acc &= `lag(mem_read_data); 376 'o0: begin led_memdata = `lag(mem_read_data); acc &= `lag(mem_read_data); end
315 'o1: {link, acc} += {1'b0, `lag(mem_read_data)}; 377 'o1: begin led_memdata = `lag(mem_read_data); {link, acc} += {1'b0, `lag(mem_read_data)}; end
316 'o2: begin 378 'o2: begin
317 mem_valid = 1; 379 mem_valid = 1;
318 mem_address = address; 380 mem_address = address;
319 mem_write = 1; 381 mem_write = 1;
320 mem_write_data = `lag(mem_read_data) + 1; 382 mem_write_data = `lag(mem_read_data) + 1;
383 led_memdata = mem_write_data;
321 if (mem_write_data == 0) ++pc; 384 if (mem_write_data == 0) ++pc;
322 state = MEMWAIT; 385 state = MEMWAIT;
323 end 386 end
@@ -326,6 +389,7 @@ always_ff @(posedge clk) begin
326 mem_address = address; 389 mem_address = address;
327 mem_write = 1; 390 mem_write = 1;
328 mem_write_data = acc; 391 mem_write_data = acc;
392 led_memdata = mem_write_data;
329 acc = 0; 393 acc = 0;
330 state = MEMWAIT; 394 state = MEMWAIT;
331 end 395 end
@@ -334,6 +398,7 @@ always_ff @(posedge clk) begin
334 mem_address = address; 398 mem_address = address;
335 mem_write = 1; 399 mem_write = 1;
336 mem_write_data = pc[DATA_BITS-1:0]; 400 mem_write_data = pc[DATA_BITS-1:0];
401 led_memdata = mem_write_data;
337 pc = address + 1; 402 pc = address + 1;
338 state = MEMWAIT; 403 state = MEMWAIT;
339 end 404 end
diff --git a/hdl/panel.sv b/hdl/panel.sv
index fc1f718..5d47484 100644
--- a/hdl/panel.sv
+++ b/hdl/panel.sv
@@ -14,13 +14,21 @@ module panel
14 14
15enum 15enum
16 { LED_ROW1 16 { LED_ROW1
17 , DEAD_ROW2
17 , LED_ROW2 18 , LED_ROW2
19 , DEAD_ROW3
18 , LED_ROW3 20 , LED_ROW3
21 , DEAD_ROW4
19 , LED_ROW4 22 , LED_ROW4
23 , DEAD_ROW5
20 , LED_ROW5 24 , LED_ROW5
25 , DEAD_ROW6
21 , LED_ROW6 26 , LED_ROW6
27 , DEAD_ROW7
22 , LED_ROW7 28 , LED_ROW7
29 , DEAD_ROW8
23 , LED_ROW8 30 , LED_ROW8
31 , DEAD_ROW9
24 , SWITCH_PREP 32 , SWITCH_PREP
25 , SWITCH_ROW1 33 , SWITCH_ROW1
26 , SWITCH_ROW2 34 , SWITCH_ROW2
diff --git a/hdl/top.sv b/hdl/top.sv
index abd6f30..4af7ad4 100644
--- a/hdl/top.sv
+++ b/hdl/top.sv
@@ -12,7 +12,7 @@ module top
12bit clk; 12bit clk;
13bit reset; 13bit reset;
14 14
15clock 15clock // 45 MHz
16 #( .MULTIPLY_BY(9) 16 #( .MULTIPLY_BY(9)
17 , .DIVIDE_BY(10) 17 , .DIVIDE_BY(10)
18 ) pll 18 ) pll
@@ -24,9 +24,9 @@ clock
24 24
25bit slowclk; 25bit slowclk;
26bit slowreset; 26bit slowreset;
27clock 27clock // 100 kHz
28 #( .MULTIPLY_BY(1) 28 #( .MULTIPLY_BY(1)
29 , .DIVIDE_BY(5000) 29 , .DIVIDE_BY(500)
30 ) slowpll 30 ) slowpll
31 ( .native_clk(native_clk) 31 ( .native_clk(native_clk)
32 , .reset_n(reset_n) 32 , .reset_n(reset_n)
@@ -49,34 +49,98 @@ panel fp
49 , .gpioc(gpioc) 49 , .gpioc(gpioc)
50 ); 50 );
51 51
52assign led[1] = switch[1]; 52bit [3:1] switch_df;
53assign led[2] = switch[2]; 53bit [3:1] switch_if;
54assign led[3] = switch[3]; 54bit [12:1] switch_sr;
55assign led[4] = 0; 55bit switch_start;
56assign led[5] = 0; 56bit switch_load_add;
57assign led[6] = 0; 57bit switch_dep;
58assign led[7] = 0; 58bit switch_exam;
59assign led[8] = 0; 59bit switch_cont;
60bit switch_stop;
61bit switch_sing_step;
62bit switch_sing_inst;
60 63
61/* 64assign switch_df = switch[2][3:1];
62wire [7:0] debugchar; 65assign switch_if = switch[2][6:4];
63assign debugchar = "0" + {switch[1][1], switch[1][2], switch[3][1]}; 66assign switch_sr = switch[1];
67assign switch_start = switch[3][1];
68assign switch_load_add = switch[3][2];
69assign switch_dep = switch[3][3];
70assign switch_exam = switch[3][4];
71assign switch_cont = switch[3][5];
72assign switch_stop = switch[3][6];
73assign switch_sing_step = switch[3][7];
74assign switch_sing_inst = switch[3][8];
64 75
65jtag_uart debug 76bit [11:0] led_pc;
66 ( .clk(slowclk) 77bit [11:0] led_memaddr;
67 , .reset(slowreset) 78bit [11:0] led_memdata;
79bit [11:0] led_acc;
80bit [11:0] led_mq;
81bit led_and;
82bit led_tad;
83bit led_isz;
84bit led_dca;
85bit led_jms;
86bit led_jmp;
87bit led_iot;
88bit led_opr;
89bit led_fetch;
90bit led_execute;
91bit led_defer;
92bit led_word_count;
93bit led_current_address;
94bit led_break;
95bit led_ion;
96bit led_pause;
97bit led_run;
98bit [4:0] led_step_counter;
99bit [2:0] led_df;
100bit [2:0] led_if;
101bit led_link;
68 102
69 , .rx_ready(0) 103assign led[1] = {led_pc[0], led_pc[1], led_pc[2], led_pc[3], led_pc[4], led_pc[5], led_pc[6], led_pc[7], led_pc[8], led_pc[9], led_pc[10], led_pc[11]};
70 , .tx_valid(1) 104assign led[2] = {led_memaddr[0], led_memaddr[1], led_memaddr[2], led_memaddr[3], led_memaddr[4], led_memaddr[5], led_memaddr[6], led_memaddr[7], led_memaddr[8], led_memaddr[9], led_memaddr[10], led_memaddr[11]};
71 , .tx_data(debugchar) 105assign led[3] = {led_memdata[0], led_memdata[1], led_memdata[2], led_memdata[3], led_memdata[4], led_memdata[5], led_memdata[6], led_memdata[7], led_memdata[8], led_memdata[9], led_memdata[10], led_memdata[11]};
72 ); 106assign led[4] = {led_acc[0], led_acc[1], led_acc[2], led_acc[3], led_acc[4], led_acc[5], led_acc[6], led_acc[7], led_acc[8], led_acc[9], led_acc[10], led_acc[11]};
73*/ 107assign led[5] = {led_mq[0], led_mq[1], led_mq[2], led_mq[3], led_mq[4], led_mq[5], led_mq[6], led_mq[7], led_mq[8], led_mq[9], led_mq[10], led_mq[11]};
108assign led[6] = {led_word_count, led_defer, led_execute, led_fetch, led_opr, led_iot, led_jmp, led_jms, led_dca, led_isz, led_tad, led_and};
109assign led[7] = {led_step_counter, led_run, led_pause, led_ion, led_break, led_current_address};
110assign led[8] = {led_link, led_if, led_df};
74 111
75/*
76core cpu 112core cpu
77 ( .clk(clk) 113 ( .clk(clk)
78 , .reset(reset) 114 , .reset(reset)
115
116 , .switch_cont(switch_cont)
117
118 , .led_pc(led_pc)
119 , .led_memaddr(led_memaddr)
120 , .led_memdata(led_memdata)
121 , .led_acc(led_acc)
122 , .led_mq(led_mq)
123 , .led_and(led_and)
124 , .led_tad(led_tad)
125 , .led_isz(led_isz)
126 , .led_dca(led_dca)
127 , .led_jms(led_jms)
128 , .led_jmp(led_jmp)
129 , .led_iot(led_iot)
130 , .led_opr(led_opr)
131 , .led_fetch(led_fetch)
132 , .led_execute(led_execute)
133 , .led_defer(led_defer)
134 , .led_word_count(led_word_count)
135 , .led_current_address(led_current_address)
136 , .led_break(led_break)
137 , .led_ion(led_ion)
138 , .led_pause(led_pause)
139 , .led_run(led_run)
140 , .led_step_counter(led_step_counter)
141 , .led_df(led_df)
142 , .led_if(led_if)
143 , .led_link(led_link)
79 ); 144 );
80*/
81 145
82endmodule 146endmodule
diff --git a/mem/hello.pal b/mem/hello.pal
index 989eff8..ef93f87 100644
--- a/mem/hello.pal
+++ b/mem/hello.pal
@@ -7,7 +7,7 @@ LOOP, TAD I 10
7 JMP ECHO 7 JMP ECHO
8 TLS 8 TLS
9 TSF 9 TSF
10 JMP .-1 10 JMP START
11 CLA 11 CLA
12 JMP LOOP 12 JMP LOOP
13ECHO, KSF 13ECHO, KSF