@@ -70,7 +70,7 @@ ODDR2 m68k_CLK_buffer(
7070
7171// M68K data bus control
7272wire [15 :0 ] m68k_D_out;
73- wire [15 :0 ] m68k_D_in;
73+ wire [15 :0 ] m68k_D_in = m68k_D ;
7474assign m68k_D[7 :0 ] = (m68k_RW & ~ m68k_LDS_n) ? m68k_D_out[7 :0 ] : 8'dZ ;
7575assign m68k_D[15 :8 ] = (m68k_RW & ~ m68k_UDS_n) ? m68k_D_out[15 :8 ] : 8'dZ ;
7676
@@ -136,20 +136,20 @@ end
136136assign m68k_RESET_in = ~ m68k_RESET_in_n_q;
137137
138138// synchronize the m68k bus signals with the FPGA
139- reg [23 :0 ] a_sample;
140- reg [15 :0 ] d_sample;
141- reg [2 :0 ] fc_sample;
142- reg as_sample;
143- reg lds_sample;
144- reg uds_sample;
145- reg rw_sample;
146- reg bg_sample;
139+ reg [23 :0 ] a_sample = 24'h0 ;
140+ reg [15 :0 ] d_sample = 16'h0 ;
141+ reg [2 :0 ] fc_sample = 3'h0 ;
142+ reg as_sample = 1'h0 ;
143+ reg lds_sample = 1'h0 ;
144+ reg uds_sample = 1'h0 ;
145+ reg rw_sample = 1'h0 ;
146+ reg bg_sample = 1'h0 ;
147147
148148always @(posedge clk_m68k_sample) begin
149149 if (~ m68k_RESET_out_n) begin
150- a_sample <= 24'hFFFFFF ;
151- d_sample <= 16'hFFFF ;
152- fc_sample <= 3'h7 ;
150+ a_sample <= 24'h0 ;
151+ d_sample <= 16'h0 ;
152+ fc_sample <= 3'h0 ;
153153 as_sample <= 1'd0 ;
154154 lds_sample <= 1'd0 ;
155155 uds_sample <= 1'd0 ;
@@ -169,29 +169,88 @@ end
169169
170170// system logic reading synchronized m68k bus signals
171171
172- // Address Strobe edges
173- reg as_edge;
172+ // Address and Data Strobe edges
173+ reg as_edge = 1'd0 ;
174+ reg lds_edge = 1'd0 ;
175+ reg uds_edge = 1'd0 ;
174176always @(posedge clk_sys) begin
175- if (rst ) begin
177+ if (~ m68k_RESET_out_n ) begin
176178 as_edge <= 1'd0 ;
179+ lds_edge <= 1'd0 ;
180+ uds_edge <= 1'd0 ;
177181 end else begin
178182 as_edge <= as_sample;
183+ lds_edge <= lds_sample;
184+ uds_edge <= uds_sample;
179185 end
180186end
181187
182- wire as_asserted;
183- wire as_deasserted;
184- assign as_asserted = ~ as_edge & as_sample;
185- assign as_deasserted = as_edge & ~ as_sample;
188+ wire as_asserted = ~ as_edge & as_sample;
189+ wire lds_asserted = ~ lds_edge & lds_sample;
190+ wire uds_asserted = ~ uds_edge & uds_sample;
191+ wire as_deasserted = as_edge & ~ as_sample;
192+
193+ // transmit data state machine
194+ localparam TX_STATE_IDLE = 7'd1 ;
195+ localparam TX_STATE_ADDRESS_3 = 7'd2 ;
196+ localparam TX_STATE_ADDRESS_2 = 7'd4 ;
197+ localparam TX_STATE_ADDRESS_1 = 7'd8 ;
198+ localparam TX_STATE_SIGNALS = 7'd16 ;
199+ localparam TX_STATE_DATA_H = 7'd32 ;
200+ localparam TX_STATE_DATA_L = 7'd64 ;
201+
202+ reg [6 :0 ] TX_state = TX_STATE_IDLE;
203+ always @(posedge clk_sys) begin
204+ if (~ m68k_RESET_out_n) begin
205+ TX_state <= TX_STATE_IDLE;
206+ end else if (TX_state[0 ] & (lds_asserted | uds_asserted)) begin
207+ // data phase started, begin transmission
208+ TX_state <= TX_STATE_ADDRESS_3;
209+ end else if (~ avr_data_out_busy) begin
210+ // byte was possibly transmitted, advance state
211+ if (TX_state[1 ]) begin
212+ TX_state <= TX_STATE_ADDRESS_2;
213+ end else if (TX_state[2 ]) begin
214+ TX_state <= TX_STATE_ADDRESS_1;
215+ end else if (TX_state[3 ]) begin
216+ TX_state <= TX_STATE_SIGNALS;
217+ end else if (TX_state[4 ]) begin
218+ TX_state <= TX_STATE_DATA_H;
219+ end else if (TX_state[5 ]) begin
220+ TX_state <= TX_STATE_DATA_L;
221+ end else if (TX_state[6 ]) begin
222+ TX_state <= TX_STATE_IDLE;
223+ end
224+ end
225+ end
226+
227+ // output data select
228+ reg [7 :0 ] TX_data;
229+ wire [7 :0 ] bus_signals = {2'd0 , fc_sample, rw_sample, uds_sample, lds_sample};
230+ always @(* ) begin
231+ case (TX_state)
232+ TX_STATE_IDLE: TX_data = 8'd0 ;
233+ TX_STATE_ADDRESS_3: TX_data = a_sample[23 :16 ];
234+ TX_STATE_ADDRESS_2: TX_data = a_sample[15 :8 ];
235+ TX_STATE_ADDRESS_1: TX_data = a_sample[7 :0 ];
236+ TX_STATE_SIGNALS: TX_data = bus_signals;
237+ TX_STATE_DATA_H: TX_data = d_sample[15 :8 ];
238+ TX_STATE_DATA_L: TX_data = d_sample[7 :0 ];
239+ default : TX_data = 8'd0 ;
240+ endcase
241+ end
242+
243+ assign avr_data_out = TX_data;
244+ assign avr_data_out_ready = | TX_state[6 :1 ] & ~ avr_data_out_busy;
186245
187246// DTACK and BERR driver
188- reg dtack;
189- reg berr;
247+ reg dtack = 1'd0 ;
248+ reg berr = 1'd0 ;
190249wire cycle_end_success;
191250wire cycle_end_failure;
192251
193252always @(posedge clk_sys) begin
194- if (rst ) begin
253+ if (~ m68k_RESET_out_n ) begin
195254 dtack <= 1'd0 ;
196255 berr <= 1'd0 ;
197256 end else if (as_deasserted) begin
@@ -210,21 +269,17 @@ end
210269assign m68k_DTACK_n = ~ dtack;
211270assign m68k_BERR_n = ~ berr;
212271
213- // send uart char on assert
214- assign avr_data_out = 8'h41 ;
215- assign avr_data_out_ready = as_asserted;
216-
217272// received data state machine
218273localparam RCVR_STATE_IDLE = 4'd1 ;
219274localparam RCVR_STATE_LOAD_BYTE_1 = 4'd2 ;
220275localparam RCVR_STATE_LOAD_BYTE_2 = 4'd4 ;
221276localparam RCVR_STATE_LOAD_BYTE_L = 4'd8 ;
222277
223- reg [15 :0 ] m68k_D_out_buffer;
224- reg [3 :0 ] RCVR_state;
278+ reg [15 :0 ] m68k_D_out_buffer = 16'd0 ;
279+ reg [3 :0 ] RCVR_state = RCVR_STATE_IDLE ;
225280
226281always @(posedge clk_sys) begin
227- if (rst ) begin
282+ if (~ m68k_RESET_out_n ) begin
228283 RCVR_state <= RCVR_STATE_IDLE;
229284 m68k_D_out_buffer <= 16'd0 ;
230285 end else if (avr_data_in_ready) begin
@@ -259,10 +314,10 @@ assign cycle_end_success = RCVR_state[0] & avr_data_in_ready & (avr_data_in == 8
259314assign cycle_end_failure = RCVR_state[0 ] & avr_data_in_ready & (avr_data_in == 8'h45 );
260315
261316// assign leds on the start of the bus cycle
262- reg [7 :0 ] leds_q;
317+ reg [7 :0 ] leds_q = 8'd0 ;
263318assign led = leds_q;
264319always @(posedge clk_sys) begin
265- if (rst ) begin
320+ if (~ m68k_RESET_out_n ) begin
266321 leds_q <= 8'd0 ;
267322 end else if (as_asserted) begin
268323 leds_q <= m68k_A[8 :1 ];
0 commit comments