Skip to content

Commit 288558f

Browse files
committed
Databus mapping in the weird z80 way (to reduce wires crossing)
1 parent 3956114 commit 288558f

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

src/ci2406_z80.v

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ module ci2406_z80(
7676
// 16 output address bus pins
7777
assign io_oeb[23:8] = {16{1'b0}}; // 0 = Output
7878
// 8 bidirectional data bus pins
79+
7980
assign io_oeb[31:24] = {8{~data_oe}}; // 0 = Output | 1 = Input
8081
// 4 input control pins
8182
assign io_oeb[35:32] = {4{1'b1}}; // 1 = Input
@@ -90,8 +91,18 @@ module ci2406_z80(
9091
.int_n (io_in [32]),
9192
.nmi_n (io_in [33]),
9293
.busrq_n (io_in [35]),
93-
.di (io_in [31:24]),
94-
.dout (io_out[31:24]),
94+
// Z80 has peculiar data bus pin order, keep it to minimize wire crossing on the DIP40 PCB
95+
// Also see: http://www.righto.com/2014/09/why-z-80s-data-pins-are-scrambled.html
96+
// D7 - io[29]
97+
// D6 - io[27]
98+
// D5 - io[26]
99+
// D4 - io[24]
100+
// D3 - io[25]
101+
// D2 - io[28]
102+
// D1 - io[31]
103+
// D0 - io[30]
104+
.di ({io_in [29], io_in [27], io_in [26], io_in [24], io_in [25], io_in [28], io_in [31], io_in [30]}),
105+
.dout ({io_out[29], io_out[27], io_out[26], io_out[24], io_out[25], io_out[28], io_out[31], io_out[30]}),
95106
.doe (data_oe),
96107
.A (io_out[23:8]),
97108
.halt_n (io_out[0]),

test_chipignite/tb.v

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,51 @@ module tb ();
2222
wire [3:0] controls_in;
2323
wire [7:0] controls_out = io_out[7:0];
2424
wire [15:0] addr = io_out[23:8];
25-
wire [7:0] data_in;
26-
wire [7:0] data_out = io_out[31:24];
27-
wire [7:0] data_oe =~io_oeb[31:24];
25+
2826
assign io_in [35:32] = controls_in;
29-
assign io_in [31:24] = data_in;
30-
27+
28+
// Z80 has a peculiar order of the pins for the data bus
29+
// <-> D4 | io[24]
30+
// <-> D3 | io[25]
31+
// <-> D5 | io[26]
32+
// <-> D6 | io[27]
33+
// VCC_5V0 |
34+
// <-> D2 | io[28]
35+
// <-> D7 | io[29]
36+
// <-> D0 | io[30]
37+
// <-> D1 | io[31]
38+
39+
wire [7:0] data_in;
40+
wire [7:0] data_out;
41+
wire [7:0] data_oe;
42+
43+
assign io_in [24] = data_in[4];
44+
assign io_in [25] = data_in[3];
45+
assign io_in [26] = data_in[5];
46+
assign io_in [27] = data_in[6];
47+
assign io_in [28] = data_in[2];
48+
assign io_in [29] = data_in[7];
49+
assign io_in [30] = data_in[0];
50+
assign io_in [31] = data_in[1];
51+
52+
assign data_out[4] = io_out[24];
53+
assign data_out[3] = io_out[25];
54+
assign data_out[5] = io_out[26];
55+
assign data_out[6] = io_out[27];
56+
assign data_out[2] = io_out[28];
57+
assign data_out[7] = io_out[29];
58+
assign data_out[0] = io_out[30];
59+
assign data_out[1] = io_out[31];
60+
61+
assign data_oe [4] = ~io_oeb[24];
62+
assign data_oe [3] = ~io_oeb[25];
63+
assign data_oe [5] = ~io_oeb[26];
64+
assign data_oe [6] = ~io_oeb[27];
65+
assign data_oe [2] = ~io_oeb[28];
66+
assign data_oe [7] = ~io_oeb[29];
67+
assign data_oe [0] = ~io_oeb[30];
68+
assign data_oe [1] = ~io_oeb[31];
69+
3170
// Replace tt_um_example with your module name:
3271
ci2406_z80 user_project (
3372
// Include power ports for the Gate Level test:

0 commit comments

Comments
 (0)