From 3a65ecf1581148b0c09e85c58019d017e78f1857 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sun, 20 Mar 2022 17:27:41 -0700 Subject: Run ~*EIGHT GODDAMN PDP-8s IN PARALLEL*~ It looks like we could probably fit 16 on the current FPGA, just about. (doesn't meet timing at 50MHz, should in theory work at 40MHz) --- Makefile | 19 ++++--- hdl/defs.svh | 2 +- hdl/top.sv | 158 +++++++++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 129 insertions(+), 50 deletions(-) diff --git a/Makefile b/Makefile index 0250933..3ba08fd 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,19 @@ fpga: pdp8.sof quartus_pgm -c 1 -m JTAG -o "P;$<@1" .PHONY: fpga +download-%: mem/% + p8bin2uart 1 $< | ./download.tcl 0 1 + p8bin2uart 1 $< | ./download.tcl 1 1 + p8bin2uart 1 $< | ./download.tcl 2 1 + p8bin2uart 1 $< | ./download.tcl 3 1 + p8bin2uart 1 $< | ./download.tcl 4 1 + p8bin2uart 1 $< | ./download.tcl 5 1 + p8bin2uart 1 $< | ./download.tcl 6 1 + p8bin2uart 1 $< | ./download.tcl 7 1 + +download-pal-%: build/%.bin + p8bin2uart 1 $< | ./download.tcl 0 1 + term-mem: nios2-terminal --instance 0 .PHONY: term-mem @@ -15,12 +28,6 @@ term-pdp8: nios2-terminal --instance 1 .PHONY: term-pdp8 -build/%.hex: build/%.bin - p8bin2hex $< > $@ - -build/%.hex: %.bin - p8bin2hex $< > $@ - build/%.bin: %.pal @mkdir -p $(dir $@) palbart $< diff --git a/hdl/defs.svh b/hdl/defs.svh index f8b1032..7c47723 100644 --- a/hdl/defs.svh +++ b/hdl/defs.svh @@ -5,7 +5,7 @@ `define PDP_ADDRESS_BITS 15 -`define NUM_PDPS 1 +`define NUM_PDPS 8 `define UART_BYTE_BITS 8 diff --git a/hdl/top.sv b/hdl/top.sv index ba6311f..f4a64f9 100644 --- a/hdl/top.sv +++ b/hdl/top.sv @@ -297,48 +297,120 @@ module top assign led[7] = {2'b0, led_step_counter[4], led_step_counter[3], led_step_counter[2], led_step_counter[1], led_step_counter[0], led_run, led_pause, led_ion, led_break, led_current_address}; assign led[8] = {5'b0, led_link, led_if[0], led_if[1], led_if[2], led_df[0], led_df[1], led_df[2]}; - core cpu - ( .clk(internal_clock) - , .reset(internal_reset) - - , .switch_df(switch_df) - , .switch_if(switch_if) - , .switch_sr(switch_sr) - , .switch_start(switch_start) - , .switch_load_add(switch_load_add) - , .switch_dep(switch_dep) - , .switch_exam(switch_exam) - , .switch_cont(switch_cont) - , .switch_stop(switch_stop) - , .switch_sing_step(switch_sing_step) - , .switch_sing_inst(switch_sing_inst) - - , .led_pc(led_pc) - , .led_memaddr(led_memaddr) - , .led_memdata(led_memdata) - , .led_acc(led_acc) - , .led_mq(led_mq) - , .led_and(led_and) - , .led_tad(led_tad) - , .led_isz(led_isz) - , .led_dca(led_dca) - , .led_jms(led_jms) - , .led_jmp(led_jmp) - , .led_iot(led_iot) - , .led_opr(led_opr) - , .led_fetch(led_fetch) - , .led_execute(led_execute) - , .led_defer(led_defer) - , .led_word_count(led_word_count) - , .led_current_address(led_current_address) - , .led_break(led_break) - , .led_ion(led_ion) - , .led_pause(led_pause) - , .led_run(led_run) - , .led_step_counter(led_step_counter) - , .led_df(led_df) - , .led_if(led_if) - , .led_link(led_link) - ); + generate + genvar i; + for (i = 0; i < `NUM_PDPS; ++i) begin : core + + bit [11:0] local_led_pc; + bit [11:0] local_led_memaddr; + bit [11:0] local_led_memdata; + bit [11:0] local_led_acc; + bit [11:0] local_led_mq; + bit local_led_and; + bit local_led_tad; + bit local_led_isz; + bit local_led_dca; + bit local_led_jms; + bit local_led_jmp; + bit local_led_iot; + bit local_led_opr; + bit local_led_fetch; + bit local_led_execute; + bit local_led_defer; + bit local_led_word_count; + bit local_led_current_address; + bit local_led_break; + bit local_led_ion; + bit local_led_pause; + bit local_led_run; + bit [4:0] local_led_step_counter; + bit [2:0] local_led_df; + bit [2:0] local_led_if; + bit local_led_link; + + core + #( .JTAG_INSTANCE(1+i) + ) cpu + ( .clk(internal_clock) + , .reset(internal_reset) + + , .mem_command_ready(pdp_command_ready[i]) + , .mem_command_valid(pdp_command_valid[i]) + , .mem_command(pdp_command_data[i]) + + , .mem_read_ready(pdp_response_ready[i]) + , .mem_read_valid(pdp_response_valid[i]) + , .mem_read(pdp_response_data[i]) + + , .switch_df(switch_df) + , .switch_if(switch_if) + , .switch_sr(switch_sr) + , .switch_start(switch_start) + , .switch_load_add(switch_load_add) + , .switch_dep(switch_dep) + , .switch_exam(switch_exam) + , .switch_cont(switch_cont) + , .switch_stop(switch_stop) + , .switch_sing_step(switch_sing_step) + , .switch_sing_inst(switch_sing_inst) + + , .led_pc(local_led_pc) + , .led_memaddr(local_led_memaddr) + , .led_memdata(local_led_memdata) + , .led_acc(local_led_acc) + , .led_mq(local_led_mq) + , .led_and(local_led_and) + , .led_tad(local_led_tad) + , .led_isz(local_led_isz) + , .led_dca(local_led_dca) + , .led_jms(local_led_jms) + , .led_jmp(local_led_jmp) + , .led_iot(local_led_iot) + , .led_opr(local_led_opr) + , .led_fetch(local_led_fetch) + , .led_execute(local_led_execute) + , .led_defer(local_led_defer) + , .led_word_count(local_led_word_count) + , .led_current_address(local_led_current_address) + , .led_break(local_led_break) + , .led_ion(local_led_ion) + , .led_pause(local_led_pause) + , .led_run(local_led_run) + , .led_step_counter(local_led_step_counter) + , .led_df(local_led_df) + , .led_if(local_led_if) + , .led_link(local_led_link) + ); + + end + + endgenerate + + assign led_pc = core[0].local_led_pc; + assign led_memaddr = core[0].local_led_memaddr; + assign led_memdata = core[0].local_led_memdata; + assign led_acc = core[0].local_led_acc; + assign led_mq = core[0].local_led_mq; + assign led_and = core[0].local_led_and; + assign led_tad = core[0].local_led_tad; + assign led_isz = core[0].local_led_isz; + assign led_dca = core[0].local_led_dca; + assign led_jms = core[0].local_led_jms; + assign led_jmp = core[0].local_led_jmp; + assign led_iot = core[0].local_led_iot; + assign led_opr = core[0].local_led_opr; + assign led_fetch = core[0].local_led_fetch; + assign led_execute = core[0].local_led_execute; + assign led_defer = core[0].local_led_defer; + assign led_word_count = core[0].local_led_word_count; + assign led_current_address = core[0].local_led_current_address; + assign led_break = core[0].local_led_break; + assign led_ion = core[0].local_led_ion; + assign led_pause = core[0].local_led_pause; + assign led_run = core[0].local_led_run; + assign led_step_counter = core[0].local_led_step_counter; + assign led_df = core[0].local_led_df; + assign led_if = core[0].local_led_if; + assign led_link = core[0].local_led_link; endmodule -- cgit v1.2.3