fixed rf emulation bugs
This commit is contained in:
parent
0c02cdd19d
commit
ff5900bdef
@ -101,6 +101,9 @@ module ide_disk(clk, reset,
|
||||
reg set_err, clear_err;
|
||||
reg inc_offset;
|
||||
|
||||
reg [11:0] buffer_in_hold;
|
||||
reg grab_buffer_in;
|
||||
|
||||
//
|
||||
ide ide1(.clk(clk), .reset(reset),
|
||||
.ata_rd(ata_rd), .ata_wr(ata_wr), .ata_addr(ata_addr),
|
||||
@ -126,6 +129,7 @@ module ide_disk(clk, reset,
|
||||
done <= 1'b0;
|
||||
offset <= 8'b0;
|
||||
wc <= 8'b0;
|
||||
buffer_in_hold <= 12'b0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -146,6 +150,9 @@ module ide_disk(clk, reset,
|
||||
offset <= offset + 8'h01;
|
||||
wc <= wc + 8'h01;
|
||||
end
|
||||
|
||||
if (grab_buffer_in)
|
||||
buffer_in_hold <= buffer_in;
|
||||
end
|
||||
|
||||
//
|
||||
@ -157,8 +164,10 @@ module ide_disk(clk, reset,
|
||||
else
|
||||
begin
|
||||
ide_state <= ide_state_next;
|
||||
//if (ide_state_next != ready)
|
||||
//$display("ide_state %d", ide_state_next);
|
||||
`ifdef debug_write
|
||||
if (ide_write_req)
|
||||
$display("ide_disk: state %d", ide_state_next);
|
||||
`endif
|
||||
end
|
||||
|
||||
always @(ide_state or ide_write_req or ide_read_req or
|
||||
@ -175,6 +184,7 @@ module ide_disk(clk, reset,
|
||||
clear_done = 0;
|
||||
|
||||
inc_offset = 0;
|
||||
grab_buffer_in = 0;
|
||||
|
||||
ata_rd = 0;
|
||||
ata_wr = 0;
|
||||
@ -321,14 +331,12 @@ module ide_disk(clk, reset,
|
||||
ata_addr = ATA_STATUS;
|
||||
|
||||
//if (ata_done) $display("ide_disk: XXX init11 ata_out %x", ata_out);
|
||||
if (ata_done &&
|
||||
~ata_out[IDE_STATUS_BSY] &&
|
||||
ata_out[IDE_STATUS_DRQ])
|
||||
if (ata_done && ~ata_out[IDE_STATUS_BSY])
|
||||
begin
|
||||
if (ide_write_req)
|
||||
ide_state_next = write0;
|
||||
else
|
||||
if (ide_read_req)
|
||||
if (ide_read_req && ata_out[IDE_STATUS_DRQ])
|
||||
ide_state_next = read0;
|
||||
end
|
||||
|
||||
@ -371,7 +379,8 @@ module ide_disk(clk, reset,
|
||||
//buffer read
|
||||
buffer_addr = offset;
|
||||
buffer_rd = 1;
|
||||
|
||||
grab_buffer_in = 1;
|
||||
|
||||
ata_in = {4'b0, buffer_in};
|
||||
inc_offset = 1;
|
||||
ide_state_next = write1;
|
||||
@ -379,13 +388,18 @@ module ide_disk(clk, reset,
|
||||
|
||||
write1:
|
||||
begin
|
||||
if (wc == 8'hff)
|
||||
ide_state_next = last0;
|
||||
else
|
||||
// if (wc == 16'hff00)
|
||||
// ide_state_next = init10;
|
||||
// else
|
||||
ide_state_next = write0;
|
||||
ata_wr = 1;
|
||||
ata_addr = ATA_DATA;
|
||||
ata_in = {4'b0, buffer_in_hold};
|
||||
//$display("ide_disk: write1, %o", buffer_in_hold);
|
||||
|
||||
if (ata_done)
|
||||
begin
|
||||
if (wc == 8'h00)
|
||||
ide_state_next = last0;
|
||||
else
|
||||
ide_state_next = write0;
|
||||
end
|
||||
end
|
||||
|
||||
last0:
|
||||
|
||||
@ -89,6 +89,7 @@ module pdp8_io(clk, brgclk, reset, iot, state, mb,
|
||||
.uart_in(rs232_in),
|
||||
.uart_out(rs232_out));
|
||||
|
||||
`ifndef use_rf_pli
|
||||
pdp8_rf tf(.clk(clk),
|
||||
.reset(reset),
|
||||
.iot(iot),
|
||||
@ -116,7 +117,8 @@ module pdp8_io(clk, brgclk, reset, iot, state, mb,
|
||||
.ide_cs(ide_cs),
|
||||
.ide_da(ide_da),
|
||||
.ide_data_bus(ide_data_bus));
|
||||
|
||||
`endif
|
||||
|
||||
assign tt_io_clear_ac = 1'b0;
|
||||
|
||||
assign io_data_out =
|
||||
@ -150,5 +152,14 @@ module pdp8_io(clk, brgclk, reset, iot, state, mb,
|
||||
tt_io_selected ? tt_io_clear_ac :
|
||||
rf_io_selected ? rf_io_clear_ac :
|
||||
1'b0;
|
||||
|
||||
`ifdef use_rf_pli
|
||||
always @(posedge clk or iot or state or mb or io_select)
|
||||
begin
|
||||
$pli_rf(clk, reset, iot, state, mb, io_data_in,
|
||||
io_select, rf_io_selected, rf_io_data_out, rf_io_data_avail,
|
||||
rf_io_interrupt, rf_io_skip, rf_io_clear_ac);
|
||||
end
|
||||
`endif
|
||||
|
||||
endmodule
|
||||
|
||||
160
rtl/pdp8_rf.v
160
rtl/pdp8_rf.v
@ -136,7 +136,6 @@ will process the information.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
HIGH LEVEL DISK STATE MACHINE:
|
||||
|
||||
idle
|
||||
@ -550,7 +549,7 @@ module pdp8_rf(clk, reset, iot, state, mb,
|
||||
|
||||
assign buff_addr = ide_active ? ide_buffer_addr : buffer_addr;
|
||||
assign buff_in = ide_active ? ide_buffer_out : buffer_hold;
|
||||
assign buff_rd = ide_active ? ide_buffer_rd : 1'b1/*buffer_rd?*/;
|
||||
assign buff_rd = ide_active ? ide_buffer_rd : /*1'b1*/buffer_rd;
|
||||
assign buff_wr = ide_active ? ide_buffer_wr : buffer_wr;
|
||||
|
||||
// ide disk
|
||||
@ -572,7 +571,9 @@ module pdp8_rf(clk, reset, iot, state, mb,
|
||||
.ide_cs(ide_cs),
|
||||
.ide_da(ide_da));
|
||||
|
||||
assign ide_block_number = { 12'b0, disk_addr[19:8] };
|
||||
assign ide_block_number = ide_read_req ?
|
||||
{ 12'b0, disk_addr[19:8] } :
|
||||
{ 12'b0, buffer_disk_addr[19:8] };
|
||||
|
||||
//
|
||||
// RF controller
|
||||
@ -603,15 +604,18 @@ module pdp8_rf(clk, reset, iot, state, mb,
|
||||
io_data_out = 0;
|
||||
dma_start = 1'b1;
|
||||
io_clear_ac = 1;
|
||||
//`ifdef debug
|
||||
// $display("rf: go! disk_addr %o", disk_addr);
|
||||
//`endif
|
||||
`ifdef debug
|
||||
$display("rf: DMAR disk_addr %o", {EMA, DMA});
|
||||
`endif
|
||||
end
|
||||
3'o5: // DMAW
|
||||
begin
|
||||
io_data_out = 0;
|
||||
dma_start = 1'b1;
|
||||
io_clear_ac = 1;
|
||||
`ifdef debug
|
||||
$display("rf: DMAW disk_addr %o", {EMA, DMA});
|
||||
`endif
|
||||
end
|
||||
endcase
|
||||
end // case: 6'o60
|
||||
@ -627,8 +631,8 @@ module pdp8_rf(clk, reset, iot, state, mb,
|
||||
io_data_out = 0;
|
||||
end
|
||||
3'o6: // DIMA
|
||||
io_data_out = { PCA, DRE,WLS,
|
||||
EIE, PIE,CIE,
|
||||
io_data_out = { PCA,DRE,WLS,
|
||||
EIE,PIE,CIE,
|
||||
MEX,
|
||||
DRL,NXD,PER };
|
||||
3'o5: // DIML
|
||||
@ -762,10 +766,11 @@ module pdp8_rf(clk, reset, iot, state, mb,
|
||||
begin
|
||||
// clear ac
|
||||
DMA <= io_data_in;
|
||||
// is_write <= 1'b1;
|
||||
//debug
|
||||
is_read <= 1'b1;
|
||||
is_write <= 1'b1;
|
||||
DCF <= 1'b0;
|
||||
`ifdef debug
|
||||
$display("rf: DMAW ac %o", io_data_in);
|
||||
`endif
|
||||
end
|
||||
endcase // case(mb[2:0])
|
||||
|
||||
@ -853,16 +858,20 @@ is_read <= 1'b1;
|
||||
end
|
||||
|
||||
DB_start_xfer3:
|
||||
db_next_state = is_read ? DB_check_xfer_read : DB_begin_xfer_write;
|
||||
begin
|
||||
db_next_state = is_read ? DB_check_xfer_read : DB_begin_xfer_write;
|
||||
end
|
||||
|
||||
DB_check_xfer_read:
|
||||
begin
|
||||
if (buffer_matches_DMA)
|
||||
db_next_state = DB_next_xfer_read;
|
||||
else
|
||||
db_next_state = buffer_dirty ?
|
||||
DB_write_old_page :
|
||||
DB_read_new_page;
|
||||
begin
|
||||
db_next_state = buffer_dirty ?
|
||||
DB_write_old_page :
|
||||
DB_read_new_page;
|
||||
end
|
||||
end
|
||||
|
||||
DB_next_xfer_read:
|
||||
@ -876,11 +885,14 @@ is_read <= 1'b1;
|
||||
db_next_state = is_read ? DB_check_xfer_read:DB_begin_xfer_write;
|
||||
|
||||
DB_begin_xfer_write:
|
||||
if (ram_done)
|
||||
begin
|
||||
load_buffer_hold = 1;
|
||||
db_next_state = DB_check_xfer_write;
|
||||
end
|
||||
begin
|
||||
if (ram_done)
|
||||
begin
|
||||
//$display("begin-xfer-write; done, wc %o", dma_wc);
|
||||
load_buffer_hold = 1;
|
||||
db_next_state = DB_check_xfer_write;
|
||||
end
|
||||
end
|
||||
|
||||
DB_check_xfer_write:
|
||||
if (buffer_matches_DMA)
|
||||
@ -890,13 +902,16 @@ is_read <= 1'b1;
|
||||
db_next_state = dma_done ? DB_done_xfer : DB_next_xfer_incr;
|
||||
end
|
||||
else
|
||||
db_next_state = buffer_dirty ?
|
||||
DB_write_old_page :
|
||||
DB_read_new_page;
|
||||
begin
|
||||
db_next_state = buffer_dirty ? DB_write_old_page : DB_read_new_page;
|
||||
end
|
||||
|
||||
DB_done_xfer:
|
||||
if (ram_done)
|
||||
db_next_state = DB_done_xfer1;
|
||||
begin
|
||||
//$display("done-xfer");
|
||||
if (ram_done)
|
||||
db_next_state = DB_done_xfer1;
|
||||
end
|
||||
|
||||
DB_done_xfer1:
|
||||
if (ram_done)
|
||||
@ -910,20 +925,26 @@ is_read <= 1'b1;
|
||||
db_next_state = DB_idle;
|
||||
|
||||
DB_read_new_page:
|
||||
if (ide_done)
|
||||
begin
|
||||
set_buffer_addr = 1;
|
||||
db_next_state = is_read ?
|
||||
DB_check_xfer_read :
|
||||
DB_check_xfer_write;
|
||||
end
|
||||
begin
|
||||
if (ide_done)
|
||||
begin
|
||||
//$display("read-new-page done; wc %o; is-read %b", dma_wc, is_read);
|
||||
set_buffer_addr = 1;
|
||||
db_next_state = is_read ?
|
||||
DB_check_xfer_read :
|
||||
DB_check_xfer_write;
|
||||
end
|
||||
end
|
||||
|
||||
DB_write_old_page:
|
||||
if (ide_done)
|
||||
begin
|
||||
set_buffer_addr = 1;
|
||||
db_next_state = DB_read_new_page;
|
||||
end
|
||||
begin
|
||||
if (ide_done)
|
||||
begin
|
||||
//$display("write-new-page done; wc %o; is-read %b", dma_wc, is_read);
|
||||
set_buffer_addr = 1;
|
||||
db_next_state = DB_read_new_page;
|
||||
end
|
||||
end
|
||||
|
||||
endcase
|
||||
end
|
||||
@ -933,7 +954,36 @@ is_read <= 1'b1;
|
||||
if (reset)
|
||||
db_state <= DB_idle;
|
||||
else
|
||||
db_state <= db_next_state;
|
||||
begin
|
||||
db_state <= db_next_state;
|
||||
`ifdef debug_state
|
||||
if (is_write)
|
||||
$display("rf: state %d", db_next_state);
|
||||
`endif
|
||||
`ifdef debug
|
||||
case (db_next_state)
|
||||
DB_start_xfer3:
|
||||
begin
|
||||
$display("start-xfer; is-read %b, buffer_matches_DMA %b, buffer-disk-addr %o, disk-addr %o",
|
||||
is_read, buffer_matches_DMA, buffer_disk_addr[19:8], disk_addr[19:8]);
|
||||
end
|
||||
|
||||
DB_write_old_page:
|
||||
if (db_state != DB_write_old_page)
|
||||
begin
|
||||
$display("flush; buffer-dirty %b, buffer-disk-addr %o, disk-addr %o",
|
||||
buffer_dirty, buffer_disk_addr[19:8], disk_addr[19:8]);
|
||||
end
|
||||
|
||||
DB_read_new_page:
|
||||
if (db_state != DB_read_new_page)
|
||||
begin
|
||||
$display("read-new; buffer-dirty %b, buffer-disk-addr %o, disk-addr %o",
|
||||
buffer_dirty, buffer_disk_addr[19:8], disk_addr[19:8]);
|
||||
end
|
||||
endcase
|
||||
`endif
|
||||
end
|
||||
|
||||
assign dma_done = dma_wc == 12'o0000;
|
||||
|
||||
@ -960,8 +1010,9 @@ is_read <= 1'b1;
|
||||
begin
|
||||
dma_addr <= { MEX, ram_in + 12'o0001 };
|
||||
`ifdef debug
|
||||
|
||||
if (ram_done) $display("rf: read ca %o", ram_in);
|
||||
if (ram_done)
|
||||
$display("rf: read ca %o (dma_addr %o)",
|
||||
ram_in, { MEX, ram_in + 12'o0001 });
|
||||
`endif
|
||||
end
|
||||
|
||||
@ -969,8 +1020,12 @@ is_read <= 1'b1;
|
||||
begin
|
||||
// this state might be not be needed
|
||||
`ifdef debug
|
||||
$display("rf: start! disk_addr %o (%o %o)",
|
||||
disk_addr, EMA, DMA);
|
||||
if (is_read)
|
||||
$display("rf: start! read disk_addr %o (%o %o) (ma %o wc %o)",
|
||||
disk_addr, EMA, DMA, dma_addr, dma_wc);
|
||||
else
|
||||
$display("rf: start! write disk_addr %o (%o %o) (ma %o wc %o)",
|
||||
disk_addr, EMA, DMA, dma_addr, dma_wc);
|
||||
`endif
|
||||
end
|
||||
|
||||
@ -986,7 +1041,7 @@ is_read <= 1'b1;
|
||||
DB_next_xfer_read:
|
||||
begin
|
||||
/* snoop for our wc & ca */
|
||||
if (dma_addr == 12'o7750 && ram_done)
|
||||
if (dma_addr == 14'o07750 && ram_done)
|
||||
begin
|
||||
dma_wc <= buff_out;
|
||||
`ifdef debug
|
||||
@ -994,7 +1049,7 @@ is_read <= 1'b1;
|
||||
`endif
|
||||
end
|
||||
|
||||
if (dma_addr == 12'o7751 && ram_done)
|
||||
if (dma_addr == 14'o07751 && ram_done)
|
||||
begin
|
||||
dma_addr[11:0] <= buff_out;
|
||||
`ifdef debug
|
||||
@ -1010,13 +1065,18 @@ is_read <= 1'b1;
|
||||
|
||||
`ifdef debug
|
||||
DB_done_xfer:
|
||||
if (ram_done) $display("rf: write wc %o", dma_wc);
|
||||
if (ram_done) $display("rf: done; write wc %o", dma_wc);
|
||||
|
||||
DB_done_xfer1:
|
||||
if (ram_done) $display("rf: write ca %o", dma_addr);
|
||||
if (ram_done) $display("rf: done; write ca %o", dma_addr);
|
||||
|
||||
DB_done_xfer2:
|
||||
$display("rf: done");
|
||||
begin
|
||||
if (buffer_dirty)
|
||||
$display("rf: done; buffer-dirty");
|
||||
else
|
||||
$display("rf: done; buffer-clean");
|
||||
end
|
||||
`endif
|
||||
|
||||
endcase
|
||||
@ -1050,10 +1110,14 @@ is_read <= 1'b1;
|
||||
end
|
||||
else
|
||||
if (set_buffer_dirty)
|
||||
buffer_dirty <= 1'b1;
|
||||
begin
|
||||
//$display("set-buffer-dirty; %t", $time);
|
||||
buffer_dirty <= 1'b1;
|
||||
end
|
||||
else
|
||||
if (set_buffer_addr)
|
||||
begin
|
||||
$display("set-buffer-addr; clean, disk-addr %o, %t", disk_addr[19:8], $time);
|
||||
buffer_dirty <= 1'b0;
|
||||
buffer_disk_addr[19:8] <= disk_addr[19:8];
|
||||
end
|
||||
|
||||
@ -81,7 +81,8 @@ module pdp8_tt(clk, brgclk, reset,
|
||||
//
|
||||
fake_uart tt_uart(.clk(clk),
|
||||
.reset(reset),
|
||||
|
||||
.state(state),
|
||||
|
||||
.tx_clk(uart_tx_clk),
|
||||
.tx_req(tto_req),
|
||||
.tx_ack(tx_ack),
|
||||
|
||||
@ -13,6 +13,9 @@ module ram_256x12(clk, reset, a, din, dout, ce, we);
|
||||
|
||||
// synthesis translate_off
|
||||
integer i;
|
||||
`ifdef debug
|
||||
integer ram_debug;
|
||||
`endif
|
||||
|
||||
initial
|
||||
begin
|
||||
@ -25,14 +28,15 @@ module ram_256x12(clk, reset, a, din, dout, ce, we);
|
||||
begin
|
||||
if (we && ce)
|
||||
begin
|
||||
`ifdef debug_ram
|
||||
$display("rf: buffer ram write [%o] <- %o", a, din);
|
||||
`ifdef debug
|
||||
if (ram_debug)
|
||||
$display("rf: buffer ram write [%o] <- %o", a, din);
|
||||
`endif
|
||||
ram[a] = din;
|
||||
end
|
||||
|
||||
`ifdef debug_ram
|
||||
if (we == 0 && ce == 1)
|
||||
`ifdef debug
|
||||
if (ram_debug && we == 0 && ce == 1)
|
||||
$display("rf: buffer ram read [%o] -> %o", a, ram[a]);
|
||||
`endif
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user