1
0
mirror of https://github.com/mist-devel/mist-board.git synced 2026-02-18 05:03:40 +00:00

DMA/ACSI handling cleanups

This commit is contained in:
harbaum
2013-08-08 09:04:42 +00:00
parent 291a85c2e4
commit 6eb3f3f1a4
3 changed files with 17 additions and 32 deletions

View File

@@ -16,8 +16,9 @@ module data_io (
output [4:0] dma_idx,
input [7:0] dma_data,
output reg dma_ack,
output reg dma_nak,
output reg br,
// ram interface
output reg [2:0] state, // state bits required to drive the sdram host
output [22:0] addr,
@@ -39,7 +40,7 @@ reg writeD2; // synchronized write delayed by one 8Mhz clock
reg read; // read request received via SPI
reg readD; // read synchonized to 8Mhz clock
reg readD2; // synchronized read delayed by one 8Mhz clock
// during write the address needs to be decremented by one as the
// address auto increment takes place at the beginning of each transfer
assign addr = addrR[22:0] - ((cmd == 2)?23'b1:23'b0);
@@ -93,10 +94,8 @@ always@(posedge sck, posedge ss) begin
write <= 1'b0;
read <= 1'b0;
dma_ack <= 1'b0;
dma_nak <= 1'b0;
end else begin
dma_ack <= 1'b0;
dma_nak <= 1'b0;
sbuf <= { sbuf[13:0], sdi};
// 0:7 is command, 8:15 and 16:23 is payload bytes
@@ -116,9 +115,13 @@ always@(posedge sck, posedge ss) begin
if({sbuf[6:0], sdi } == 8'd6)
dma_ack <= 1'b1;
// send nak
// request bus
if({sbuf[6:0], sdi } == 8'd7)
dma_nak <= 1'b1;
br <= 1'b1;
// release bus
if({sbuf[6:0], sdi } == 8'd8)
br <= 1'b0;
// if we can see a read coming initiate sdram read transfer asap
if({sbuf[6:0], sdi } == 8'd3)

View File

@@ -12,7 +12,6 @@ module dma (
// output to mfp
output irq,
output reg br,
// input from system config
input fdc_wr_prot,
@@ -22,7 +21,6 @@ module dma (
input [4:0] dio_idx,
output reg [7:0] dio_data,
input dio_ack,
input dio_nak,
// input from psg
input drv_side,
@@ -153,14 +151,12 @@ reg [7:0] acsi_cmd_parms [4:0];
reg acsi_busy;
reg acsi_irq;
// acsi status register is read (clears interrupt)
wire acsi_status_read = sel && rw && (mode[4:3] == 2'b01);
// acsi status register is access (clears interrupt)
wire acsi_status_read = sel && (addr == 3'h2) && (mode[4:3] == 2'b01);
reg dio_ackD, dio_ackD2;
reg dio_nakD, dio_nakD2;
always @(posedge clk) begin
dio_ackD <= dio_ack;
dio_nakD <= dio_nak;
end
always @(negedge clk) begin
@@ -179,17 +175,10 @@ always @(negedge clk) begin
acsi_cmd <= 5'd0;
acsi_irq <= 1'b0;
acsi_busy <= 1'b0;
br <= 1'b0;
end else begin
// acknowledge comes from io controller
// rising edge on ack -> clear busy flag
dio_nakD2 <= dio_nakD;
if(dio_nakD && !dio_nakD2)
br <= 1'b0; // release bus
dio_ackD2 <= dio_ackD;
if(dio_ackD && !dio_ackD2) begin
br <= 1'b0; // release bus
scnt <= 8'h00; // all sectors transmitted
// fdc_busy == 3 -> fdc waiting for io controller
@@ -211,7 +200,7 @@ always @(negedge clk) begin
if(fdc_status_read)
fdc_irq <= 1'b0;
// cpu is reading status register -> clear fdc irq
// cpu is reading status register -> clear acsi irq
if(acsi_status_read)
acsi_irq <= 1'b0;
@@ -265,13 +254,11 @@ always @(negedge clk) begin
// ------------- TYPE II commands -------------
if(din[7:5] == 3'b100) begin // read sector
br <= 1'b1; // request bus
fdc_busy <= 2'd3;
end
if(din[7:5] == 3'b101) // write sector
if(!fdc_wr_prot) begin
br <= 1'b1; // request bus
fdc_busy <= 2'd3;
end
@@ -320,7 +307,6 @@ always @(negedge clk) begin
if(acsi_byte_counter < 4)
acsi_irq <= 1'b1;
else begin
br <= 1'b1; // request bus
acsi_busy <= 1'b1; // request io cntroller
end
end

View File

@@ -114,11 +114,8 @@ end
// no tristate busses exist inside the FPGA. so bus request doesn't do
// much more than halting the cpu by suppressing dtack
wire br = dma_br && (tg68_cpustate[1:0] == 2'b00) ; // dma is only other bus master (yet)
wire dma_br;
// dma_br may come at any time. Make sure the real br comes not before the end
// of the instruction
wire br = data_io_br; // && (tg68_cpustate[1:0] == 2'b00) ; // dma is only other bus master (yet)
wire data_io_br;
// request interrupt ack from mfp for IPL == 6
wire mfp_iack = cpu_cycle && cpu2iack && address_strobe && (tg68_adr[3:1] == 3'b110);
@@ -330,7 +327,7 @@ YM2149 ym2149 (
.CLK ( sclk[1] ) // 2 MHz
);
wire dma_dio_ack, dma_dio_nak;
wire dma_dio_ack;
wire [4:0] dma_dio_idx;
wire [7:0] dma_dio_data;
@@ -350,7 +347,6 @@ dma dma (
.dout (dma_data_out),
.irq (dma_irq ),
.br (dma_br ),
// system control interface
.fdc_wr_prot (wr_prot),
@@ -360,7 +356,6 @@ dma dma (
.dio_idx (dma_dio_idx ),
.dio_data (dma_dio_data),
.dio_ack (dma_dio_ack ),
.dio_nak (dma_dio_nak ),
// floppy interface
.drv_sel (floppy_sel ),
@@ -714,11 +709,12 @@ data_io data_io (
.ss (SPI_SS2 ),
.sdo (data_io_sdo ),
.br (data_io_br ),
// dma status interface
.dma_idx (dma_dio_idx ),
.dma_data (dma_dio_data ),
.dma_ack (dma_dio_ack ),
.dma_nak (dma_dio_nak ),
// ram interface
.state (host_state ),