diff options
Diffstat (limited to '')
| -rw-r--r-- | hdl/core.sv | 73 | ||||
| -rw-r--r-- | hdl/panel.sv | 8 | ||||
| -rw-r--r-- | hdl/top.sv | 112 |
3 files changed, 165 insertions, 28 deletions
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 | ||
| 40 | bit run; | ||
| 41 | assign led_run = run; | ||
| 42 | |||
| 11 | bit mem_ready; | 43 | bit mem_ready; |
| 12 | bit mem_valid; | 44 | bit mem_valid; |
| 13 | bit mem_write; | 45 | bit mem_write; |
| 14 | bit [ADDR_BITS-1:0] mem_address; | 46 | bit [ADDR_BITS-1:0] mem_address; |
| 15 | bit [DATA_BITS-1:0] mem_write_data; | 47 | bit [DATA_BITS-1:0] mem_write_data; |
| 16 | 48 | ||
| 49 | assign led_df = 0; | ||
| 50 | assign led_if = 0; | ||
| 51 | assign led_memaddr = mem_address; | ||
| 52 | |||
| 17 | bit mem_read_valid; | 53 | bit mem_read_valid; |
| 18 | bit [DATA_BITS-1:0] mem_read_data; | 54 | bit [DATA_BITS-1:0] mem_read_data; |
| 19 | 55 | ||
| 20 | mem | 56 | mem |
| 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; | |||
| 67 | bit [DATA_BITS-1:0] acc; | 104 | bit [DATA_BITS-1:0] acc; |
| 68 | bit link; | 105 | bit link; |
| 69 | 106 | ||
| 107 | assign led_pc = pc; | ||
| 108 | assign led_acc = acc; | ||
| 109 | assign led_link = link; | ||
| 110 | |||
| 111 | assign led_and = opcode == 0; | ||
| 112 | assign led_tad = opcode == 1; | ||
| 113 | assign led_isz = opcode == 2; | ||
| 114 | assign led_dca = opcode == 3; | ||
| 115 | assign led_jms = opcode == 4; | ||
| 116 | assign led_jmp = opcode == 5; | ||
| 117 | assign led_iot = opcode == 6; | ||
| 118 | assign led_opr = opcode == 7; | ||
| 119 | |||
| 70 | bit kbd_valid; | 120 | bit kbd_valid; |
| 71 | bit [DATA_BITS-1:0] kbd_data; | 121 | bit [DATA_BITS-1:0] kbd_data; |
| 72 | 122 | ||
| @@ -87,8 +137,14 @@ enum | |||
| 87 | , HALT | 137 | , HALT |
| 88 | } state; | 138 | } state; |
| 89 | 139 | ||
| 140 | assign led_fetch = state == FETCH || state == DECODE; | ||
| 141 | assign led_execute = state == AGEN || state == EXEC; | ||
| 142 | assign led_defer = state == INDIRECT || state == INDIRECTED || state == PREINC; | ||
| 143 | assign led_pause = state == MEMWAIT || state == HALT; | ||
| 144 | |||
| 90 | always_ff @(posedge clk) begin | 145 | always_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 | ||
| 15 | enum | 15 | enum |
| 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 |
| @@ -12,7 +12,7 @@ module top | |||
| 12 | bit clk; | 12 | bit clk; |
| 13 | bit reset; | 13 | bit reset; |
| 14 | 14 | ||
| 15 | clock | 15 | clock // 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 | ||
| 25 | bit slowclk; | 25 | bit slowclk; |
| 26 | bit slowreset; | 26 | bit slowreset; |
| 27 | clock | 27 | clock // 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 | ||
| 52 | assign led[1] = switch[1]; | 52 | bit [3:1] switch_df; |
| 53 | assign led[2] = switch[2]; | 53 | bit [3:1] switch_if; |
| 54 | assign led[3] = switch[3]; | 54 | bit [12:1] switch_sr; |
| 55 | assign led[4] = 0; | 55 | bit switch_start; |
| 56 | assign led[5] = 0; | 56 | bit switch_load_add; |
| 57 | assign led[6] = 0; | 57 | bit switch_dep; |
| 58 | assign led[7] = 0; | 58 | bit switch_exam; |
| 59 | assign led[8] = 0; | 59 | bit switch_cont; |
| 60 | bit switch_stop; | ||
| 61 | bit switch_sing_step; | ||
| 62 | bit switch_sing_inst; | ||
| 60 | 63 | ||
| 61 | /* | 64 | assign switch_df = switch[2][3:1]; |
| 62 | wire [7:0] debugchar; | 65 | assign switch_if = switch[2][6:4]; |
| 63 | assign debugchar = "0" + {switch[1][1], switch[1][2], switch[3][1]}; | 66 | assign switch_sr = switch[1]; |
| 67 | assign switch_start = switch[3][1]; | ||
| 68 | assign switch_load_add = switch[3][2]; | ||
| 69 | assign switch_dep = switch[3][3]; | ||
| 70 | assign switch_exam = switch[3][4]; | ||
| 71 | assign switch_cont = switch[3][5]; | ||
| 72 | assign switch_stop = switch[3][6]; | ||
| 73 | assign switch_sing_step = switch[3][7]; | ||
| 74 | assign switch_sing_inst = switch[3][8]; | ||
| 64 | 75 | ||
| 65 | jtag_uart debug | 76 | bit [11:0] led_pc; |
| 66 | ( .clk(slowclk) | 77 | bit [11:0] led_memaddr; |
| 67 | , .reset(slowreset) | 78 | bit [11:0] led_memdata; |
| 79 | bit [11:0] led_acc; | ||
| 80 | bit [11:0] led_mq; | ||
| 81 | bit led_and; | ||
| 82 | bit led_tad; | ||
| 83 | bit led_isz; | ||
| 84 | bit led_dca; | ||
| 85 | bit led_jms; | ||
| 86 | bit led_jmp; | ||
| 87 | bit led_iot; | ||
| 88 | bit led_opr; | ||
| 89 | bit led_fetch; | ||
| 90 | bit led_execute; | ||
| 91 | bit led_defer; | ||
| 92 | bit led_word_count; | ||
| 93 | bit led_current_address; | ||
| 94 | bit led_break; | ||
| 95 | bit led_ion; | ||
| 96 | bit led_pause; | ||
| 97 | bit led_run; | ||
| 98 | bit [4:0] led_step_counter; | ||
| 99 | bit [2:0] led_df; | ||
| 100 | bit [2:0] led_if; | ||
| 101 | bit led_link; | ||
| 68 | 102 | ||
| 69 | , .rx_ready(0) | 103 | assign 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) | 104 | assign 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) | 105 | assign 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 | ); | 106 | assign 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 | */ | 107 | assign 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]}; |
| 108 | assign 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}; | ||
| 109 | assign led[7] = {led_step_counter, led_run, led_pause, led_ion, led_break, led_current_address}; | ||
| 110 | assign led[8] = {led_link, led_if, led_df}; | ||
| 74 | 111 | ||
| 75 | /* | ||
| 76 | core cpu | 112 | core 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 | ||
| 82 | endmodule | 146 | endmodule |
