mirror of
https://github.com/sxpert/hp-saturn
synced 2024-12-26 09:58:09 +01:00
implement more things, test with ice40
This commit is contained in:
parent
4594dec086
commit
23a8e32e31
15 changed files with 127 additions and 10732 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -6,3 +6,6 @@ obj_dir/Vsaturn_core.mk
|
||||||
obj_dir/Vsaturn_core__Syms.cpp
|
obj_dir/Vsaturn_core__Syms.cpp
|
||||||
obj_dir/Vsaturn_core__Syms.h
|
obj_dir/Vsaturn_core__Syms.h
|
||||||
obj_dir/Vsaturn_core_classes.mk
|
obj_dir/Vsaturn_core_classes.mk
|
||||||
|
saturn_core.ICE40.json
|
||||||
|
blinky.pcf
|
||||||
|
demo.blif
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
`define DEC_GOSUB_LOOP 12'h701 // 7[x] -> exec
|
`define DEC_GOSUB_LOOP 12'h701 // 7[x] -> exec
|
||||||
`define DEC_8X 12'h800 // 8X
|
`define DEC_8X 12'h800 // 8X
|
||||||
`define DEC_80X 12'h801 // 80X
|
`define DEC_80X 12'h801 // 80X
|
||||||
`define DEC_CONFIG 12'h805 // 805
|
`define DEC_808X 12'h808 // 808X
|
||||||
`define DEC_RESET 12'h80A // 80A
|
`define DEC_AC_BIT_SET_TEST 12'h809 // 808[4-B]x
|
||||||
`define DEC_C_EQ_P_N 12'h80C // 80Cn C=P n
|
`define DEC_C_EQ_P_N 12'h80C // 80Cn C=P n
|
||||||
`define DEC_P_EQ_C_N 12'h80D // 80Dn P=C n
|
`define DEC_P_EQ_C_N 12'h80D // 80Dn P=C n
|
||||||
`define DEC_82X_CLRHST 12'h820 // 82X
|
`define DEC_82X_CLRHST 12'h820 // 82X
|
||||||
|
|
7
fields.v
7
fields.v
|
@ -1,6 +1,9 @@
|
||||||
`ifndef _FIELDS
|
`ifndef _FIELDS
|
||||||
`define _FIELDS
|
`define _FIELDS
|
||||||
|
|
||||||
|
`define T_SET 0
|
||||||
|
`define T_TEST 1
|
||||||
|
|
||||||
`define T_DIR_OUT 0
|
`define T_DIR_OUT 0
|
||||||
`define T_DIR_IN 1
|
`define T_DIR_IN 1
|
||||||
|
|
||||||
|
@ -10,6 +13,9 @@
|
||||||
`define T_REG_A 0
|
`define T_REG_A 0
|
||||||
`define T_REG_C 1
|
`define T_REG_C 1
|
||||||
|
|
||||||
|
`define T_FTYPE_FIELD 0
|
||||||
|
`define T_TTYPE_LEN 1
|
||||||
|
|
||||||
`define T_FIELD_P 0
|
`define T_FIELD_P 0
|
||||||
`define T_FIELD_WP 1
|
`define T_FIELD_WP 1
|
||||||
`define T_FIELD_XS 2
|
`define T_FIELD_XS 2
|
||||||
|
@ -18,7 +24,6 @@
|
||||||
`define T_FIELD_M 5
|
`define T_FIELD_M 5
|
||||||
`define T_FIELD_B 6
|
`define T_FIELD_B 6
|
||||||
`define T_FIELD_W 7
|
`define T_FIELD_W 7
|
||||||
`define T_FIELD_LEN 13
|
|
||||||
`define T_FIELD_A 15
|
`define T_FIELD_A 15
|
||||||
|
|
||||||
`endif
|
`endif
|
|
@ -28,7 +28,8 @@ module hp48_sys_ram (
|
||||||
`ifdef SIM
|
`ifdef SIM
|
||||||
localparam SYS_RAM_LEN = 262144;
|
localparam SYS_RAM_LEN = 262144;
|
||||||
`else
|
`else
|
||||||
localparam SYS_RAM_LEN = 65536;
|
//localparam SYS_RAM_LEN = 65536;
|
||||||
|
localparam SYS_RAM_LEN = 2**12;
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
reg [0:0] addr_conf;
|
reg [0:0] addr_conf;
|
||||||
|
|
|
@ -27,7 +27,8 @@ localparam ROM_FILENAME = "rom-gx-r.hex";
|
||||||
`ifdef SIM
|
`ifdef SIM
|
||||||
reg [3:0] rom [0:(2**20)-1];
|
reg [3:0] rom [0:(2**20)-1];
|
||||||
`else
|
`else
|
||||||
reg[3:0] rom [0:(2**16)-1];
|
//reg[3:0] rom [0:(2**16)-1];
|
||||||
|
reg[3:0] rom [0:(2**12)-1];
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
reg [3:0] i_cmd;
|
reg [3:0] i_cmd;
|
||||||
|
|
1
ico
1
ico
|
@ -5,3 +5,4 @@
|
||||||
|
|
||||||
yosys saturn_core.ICE40.ys
|
yosys saturn_core.ICE40.ys
|
||||||
#nextpnr-ecp5 --gui --85k --speed 6 --freq 5 --lpf ulx3s_v20.lpf --textcfg empty_lfe5u-85f.config --json saturn_core.json --save saturn_core.ecp5
|
#nextpnr-ecp5 --gui --85k --speed 6 --freq 5 --lpf ulx3s_v20.lpf --textcfg empty_lfe5u-85f.config --json saturn_core.json --save saturn_core.ecp5
|
||||||
|
nextpnr-ice40 --gui --hx8k --json saturn_core.ICE40.json --pcf-allow-unconstrained --pcf icoboard.pcf --asc saturn_core.ice40.asc
|
||||||
|
|
42
icoboard.pcf
42
icoboard.pcf
|
@ -27,22 +27,32 @@
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
#
|
||||||
|
|
||||||
set_io clk_100mhz R9
|
# set_io clk_100mhz R9
|
||||||
|
set_io clk_25mhz R9
|
||||||
|
|
||||||
set_io pmod1_1 D8
|
#set_io pmod1_1 D8
|
||||||
set_io pmod1_2 B9
|
#set_io pmod1_2 B9
|
||||||
set_io pmod1_3 B10
|
#set_io pmod1_3 B10
|
||||||
set_io pmod1_4 B11
|
#set_io pmod1_4 B11
|
||||||
set_io pmod1_7 B8
|
#set_io pmod1_7 B8
|
||||||
set_io pmod1_8 A9
|
#set_io pmod1_8 A9
|
||||||
set_io pmod1_9 A10
|
#set_io pmod1_9 A10
|
||||||
set_io pmod1_10 A11
|
#set_io pmod1_10 A11
|
||||||
|
set_io led[0] D8
|
||||||
|
set_io led[1] B9
|
||||||
|
set_io led[2] B10
|
||||||
|
set_io led[3] B11
|
||||||
|
set_io led[4] B8
|
||||||
|
set_io led[5] A9
|
||||||
|
set_io led[6] A10
|
||||||
|
set_io led[7] A11
|
||||||
|
|
||||||
set_io pmod2_7 B7
|
#set_io pmod2_7 B7
|
||||||
set_io pmod2_8 B6
|
set_io btn[0] B7
|
||||||
set_io pmod2_9 B3
|
#set_io pmod2_8 B6
|
||||||
set_io pmod2_10 B5
|
#set_io pmod2_9 B3
|
||||||
|
#set_io pmod2_10 B5
|
||||||
|
|
||||||
set_io rpi_sck H11
|
#set_io rpi_sck H11
|
||||||
set_io rpi_cs D4
|
#set_io rpi_cs D4
|
||||||
set_io rpi_mosi A6
|
#set_io rpi_mosi A6
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
|
|
||||||
`DEC_13X: begin
|
`DEC_13X: begin
|
||||||
case (nb_in)
|
case (nb_in)
|
||||||
4'h5: D1[19:0] = C[19:0];
|
4'h4: D0[19:0] <= C[19:0];
|
||||||
|
4'h5: D1[19:0] <= C[19:0];
|
||||||
default: begin
|
default: begin
|
||||||
$display("ERROR : DEC_13X");
|
$display("ERROR : DEC_13X");
|
||||||
decode_error <= 1;
|
decode_error <= 1;
|
||||||
|
|
|
@ -39,25 +39,32 @@
|
||||||
t_cnt <= 1;
|
t_cnt <= 1;
|
||||||
t_ctr <= 0;
|
t_ctr <= 0;
|
||||||
end
|
end
|
||||||
|
t_ftype <= `T_FTYPE_FIELD;
|
||||||
next_cycle <= `BUSCMD_LOAD_DP;
|
next_cycle <= `BUSCMD_LOAD_DP;
|
||||||
decstate <= `DEC_MEMAXX;
|
decstate <= `DEC_MEMAXX;
|
||||||
end else begin
|
end else begin
|
||||||
|
t_ftype <= nb_in[3];
|
||||||
decstate <= `DEC_15X_FIELD;
|
decstate <= `DEC_15X_FIELD;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
`DEC_15X_FIELD: begin
|
`DEC_15X_FIELD: begin
|
||||||
case (nb_in)
|
if (!t_ftype) // fields
|
||||||
4'h0: begin
|
case (nb_in)
|
||||||
t_field <= `T_FIELD_P;
|
4'h0: begin
|
||||||
t_cnt <= P;
|
t_field <= `T_FIELD_P;
|
||||||
t_ctr <= P;
|
t_cnt <= P;
|
||||||
|
t_ctr <= P;
|
||||||
|
end
|
||||||
|
default: begin
|
||||||
|
$display("ERROR : DEC_15X_FIELD");
|
||||||
|
decode_error <= 1;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
else begin
|
||||||
|
t_cnt = nb_in;
|
||||||
|
t_ctr = nb_in;
|
||||||
end
|
end
|
||||||
default: begin
|
|
||||||
$display("ERROR : DEC_15X_FIELD");
|
|
||||||
decode_error <= 1;
|
|
||||||
end
|
|
||||||
endcase
|
|
||||||
next_cycle <= `BUSCMD_LOAD_DP;
|
next_cycle <= `BUSCMD_LOAD_DP;
|
||||||
decstate <= `DEC_MEMAXX;
|
decstate <= `DEC_MEMAXX;
|
||||||
end
|
end
|
||||||
|
@ -122,17 +129,18 @@ end
|
||||||
end else begin
|
end else begin
|
||||||
$write("DAT%b=%s\t", t_ptr, t_reg?"C":"A");
|
$write("DAT%b=%s\t", t_ptr, t_reg?"C":"A");
|
||||||
end
|
end
|
||||||
case (t_field)
|
if (!t_ftype)
|
||||||
`T_FIELD_P: $display("P");
|
case (t_field)
|
||||||
`T_FIELD_WP: $display("WP");
|
`T_FIELD_P: $display("P");
|
||||||
`T_FIELD_XS: $display("XS");
|
`T_FIELD_WP: $display("WP");
|
||||||
`T_FIELD_X: $display("X");
|
`T_FIELD_XS: $display("XS");
|
||||||
`T_FIELD_S: $display("S");
|
`T_FIELD_X: $display("X");
|
||||||
`T_FIELD_M: $display("M");
|
`T_FIELD_S: $display("S");
|
||||||
`T_FIELD_B: $display("B");
|
`T_FIELD_M: $display("M");
|
||||||
`T_FIELD_W: $display("W");
|
`T_FIELD_B: $display("B");
|
||||||
`T_FIELD_LEN: $display("UNKNOWN");
|
`T_FIELD_W: $display("W");
|
||||||
`T_FIELD_A: $display("A");
|
`T_FIELD_A: $display("A");
|
||||||
endcase
|
endcase
|
||||||
|
else $display("%h", t_cnt);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
18
opcodes/808[4-B]_[AC]BIT_set_test.v
Normal file
18
opcodes/808[4-B]_[AC]BIT_set_test.v
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
`DEC_AC_BIT_SET_TEST: begin
|
||||||
|
$display("ERROR: %h | t_reg %b | t_set_test %b | t_set_test_val %b",
|
||||||
|
nb_in, t_reg, t_set_test, t_set_test_val);
|
||||||
|
if (!t_set_test) begin
|
||||||
|
if (!t_reg) A[nb_in] <= t_set_test_val;
|
||||||
|
else C[nb_in] <= t_set_test_val;
|
||||||
|
decstate <= `DEC_START;
|
||||||
|
end else begin
|
||||||
|
if (!t_reg) Carry <= (A[nb_in] == t_set_test_val);
|
||||||
|
else Carry <= (C[nb_in] == t_set_test_val);
|
||||||
|
decstate <= `DEC_TEST_GO;
|
||||||
|
end
|
||||||
|
`ifdef SIM
|
||||||
|
$display("%5h %s%sBIT=%b\t%h",
|
||||||
|
inst_start_PC, t_set_test?"?":"",
|
||||||
|
t_reg?"C":"A", t_set_test_val, nb_in);
|
||||||
|
`endif
|
||||||
|
end
|
22
opcodes/808x.v
Normal file
22
opcodes/808x.v
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* 808x
|
||||||
|
* a lot of things start with 808x...
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
`include "decstates.v"
|
||||||
|
|
||||||
|
`DEC_808X: begin
|
||||||
|
case (nb_in)
|
||||||
|
4'h4, 4'h5, 4'h6, 4'h7, 4'h8, 4'h9, 4'hA, 4'hB: begin
|
||||||
|
t_reg = nb_in[3];
|
||||||
|
t_set_test = nb_in[1];
|
||||||
|
t_set_test_val = nb_in[0];
|
||||||
|
decstate <= `DEC_AC_BIT_SET_TEST;
|
||||||
|
end
|
||||||
|
default: begin
|
||||||
|
$display("ERROR : DEC_808X");
|
||||||
|
decode_error <= 1;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
end
|
|
@ -18,6 +18,7 @@
|
||||||
$display("%05h CONFIG", inst_start_PC);
|
$display("%05h CONFIG", inst_start_PC);
|
||||||
`endif
|
`endif
|
||||||
end
|
end
|
||||||
|
4'h8: decstate <= `DEC_808X;
|
||||||
4'hA: begin
|
4'hA: begin
|
||||||
next_cycle <= `BUSCMD_RESET;
|
next_cycle <= `BUSCMD_RESET;
|
||||||
decstate <= `DEC_START;
|
decstate <= `DEC_START;
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
read_verilog -I. saturn_core.v
|
read_verilog -I. saturn_core.v
|
||||||
synth_ice40 -blif demo.blif
|
synth_ice40 -top saturn_core -json saturn_core.ICE40.json
|
||||||
|
|
|
@ -26,15 +26,15 @@ module saturn_core (
|
||||||
`else
|
`else
|
||||||
module saturn_core (
|
module saturn_core (
|
||||||
input clk_25mhz,
|
input clk_25mhz,
|
||||||
input [6:0] btn,
|
input [ 6:0] btn,
|
||||||
output wifi_gpio0,
|
// output wifi_gpio0,
|
||||||
output [7:0] led
|
output [7:0] led
|
||||||
);
|
);
|
||||||
wire clk;
|
wire clk;
|
||||||
wire reset;
|
wire reset;
|
||||||
reg clk2;
|
reg clk2;
|
||||||
|
|
||||||
assign wifi_gpio0 = 1'b1;
|
// assign wifi_gpio0 = 1'b1;
|
||||||
assign clk = clk_25mhz;
|
assign clk = clk_25mhz;
|
||||||
assign reset = btn[1];
|
assign reset = btn[1];
|
||||||
|
|
||||||
|
@ -108,12 +108,17 @@ reg [3:0] t_ctr;
|
||||||
reg t_dir;
|
reg t_dir;
|
||||||
reg t_ptr;
|
reg t_ptr;
|
||||||
reg t_reg;
|
reg t_reg;
|
||||||
|
reg t_ftype;
|
||||||
reg [3:0] t_field;
|
reg [3:0] t_field;
|
||||||
|
|
||||||
reg [3:0] nb_in;
|
reg [3:0] nb_in;
|
||||||
reg [3:0] nb_out;
|
reg [3:0] nb_out;
|
||||||
reg [19:0] add_out;
|
reg [19:0] add_out;
|
||||||
|
|
||||||
|
// temporary stuff
|
||||||
|
reg t_set_test;
|
||||||
|
reg t_set_test_val;
|
||||||
|
|
||||||
// processor registers
|
// processor registers
|
||||||
reg [19:0] PC;
|
reg [19:0] PC;
|
||||||
reg [3:0] P;
|
reg [3:0] P;
|
||||||
|
@ -326,7 +331,7 @@ always @(posedge ph2)
|
||||||
end
|
end
|
||||||
|
|
||||||
always @(posedge ph3) begin
|
always @(posedge ph3) begin
|
||||||
if (cycle_ctr == 333)
|
if (cycle_ctr == 390)
|
||||||
debug_stop <= 1;
|
debug_stop <= 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -397,6 +402,8 @@ always @(posedge dec_strobe) begin
|
||||||
`include "opcodes/7xxx_GOSUB.v"
|
`include "opcodes/7xxx_GOSUB.v"
|
||||||
`include "opcodes/8x.v"
|
`include "opcodes/8x.v"
|
||||||
`include "opcodes/80x.v"
|
`include "opcodes/80x.v"
|
||||||
|
`include "opcodes/808x.v"
|
||||||
|
`include "opcodes/808[4-B]_[AC]BIT_set_test.v"
|
||||||
`include "opcodes/80[CD]n_C_and_P_n.v"
|
`include "opcodes/80[CD]n_C_and_P_n.v"
|
||||||
`include "opcodes/82x_CLRHST.v"
|
`include "opcodes/82x_CLRHST.v"
|
||||||
`include "opcodes/8[4567]n_work_test_ST.v"
|
`include "opcodes/8[4567]n_work_test_ST.v"
|
||||||
|
|
Loading…
Reference in a new issue