rendered paste body`default_nettype none
//
// de1floppy
//
module de1floppy (
CLOCK_50,
// from floppy drive
nINDEX, nCHANGE, nRDY, nRDATA, nTRK0, nWPROT,
// to floppy drive
nSEL0, nSEL1, nMTRON, DIR, nSTEP, nWDATA, nWGATE, nSIDE,
// indication
LEDG, LEDR, HEX0, HEX1, HEX2, HEX3,
// controls
KEY, SW,
// VGA
VGA_HS, VGA_VS, VGA_R, VGA_G, VGA_B,
// RS-232
UART_TXD, UART_RXD
); // 25:10
input CLOCK_50;
input nINDEX, nCHANGE, nRDY, nRDATA, nTRK0, nWPROT;
output nSEL0, nSEL1, nMTRON, DIR, nSTEP, nWDATA, nWGATE, nSIDE;
output [7:0] LEDG;
output [9:0] LEDR;
output [6:0] HEX0;
output [6:0] HEX1;
output [6:0] HEX2;
output [6:0] HEX3;
input [3:0] KEY;
input [9:0] SW;
output VGA_HS, VGA_VS;
output [3:0] VGA_R;
output [3:0] VGA_G;
output [3:0] VGA_B;
output UART_TXD;
inout UART_RXD;
// ---------------------------------------------------------------------------------
wire [15:0] addr_out;
wire vma;
wire io;
wire rd;
wire wr;
wire fetch;
wire [7:0] data_in;
wire [7:0] data_out;
wire [7:0] output_port;
wire clk = SW [0] ? counter [23] : clk_25mhz;
wire clk2 = SW [0] ? counter [22] : clk_50mhz;
//
// light 8080
//
light8080 light8080_i (
.addr_out (addr_out [15:0]),
.intr (1'b0),
.vma (vma),
.io (io),
.rd (rd),
.wr (wr),
.fetch (fetch),
.data_in (data_in [7:0]),
.data_out (data_out [7:0]),
.clk (clk),
.reset (reset)
);
reg io_r;
reg [15:0] addr_r;
always @(posedge (clk & vma)) begin
io_r <= io;
addr_r [15:0] <= addr_out [15:0];
end
/*
Address map
=================================
0000 - 0FFF code & stack memory
1000 - 1FFF buffer
*/
/*
assign data_in [7:0] = io_r ? io_q [7:0] :
memsel_r ? mem_q [7:0] :
buf_q [7:0];
*/
assign data_in [7:0] = idata [7:0];
reg [7:0] idata;
always @(*) begin
if (io_r)
idata [7:0] <= io_q;
else
case (addr_r [13:12])
2'b00: idata [7:0] <= mem_q [7:0];
2'b01: idata [7:0] <= buf_q [7:0];
// 2'b10: idata [7:0] <= 8'h76;
// 2'b11: idata [7:0] <= 8'h76;
default: idata [7:0] <= 8'hff;
endcase
end
//
// Memory
//
//wire memclk = clk & memsel & vma & ~io;
wire [7:0] mem_q;
memory memory_i (
.clk (clk),
.reset (reset),
.addr (addr_out [15:0]),
.vma (vma),
.rd (rd),
.wr (wr),
.io (io),
.data_in (data_out [7:0]),
.mem_q (mem_q [7:0]),
);
//
// I/O
//
wire [7:0] io_q;
io io_i (
.clk (clk),
.reset (reset),
.addr (addr_out [7:0]), // only 256 ports
.vma (vma),
.rd (rd),
.wr (wr),
.io (io),
.data_in (data_out [7:0]),
.io_q (io_q [7:0]),
.led_port (output_port [7:0]),
.switches_port (SW [7:0]),
.floppy_input_port ({nINDEX, nCHANGE, nRDY, nRDATA, nTRK0, nWPROT, 2'b0}),
.floppy_output_port ({nSEL0, nSEL1, nMTRON, DIR, nSTEP, nWDATA, nWGATE, nSIDE}),
.uart_txd (UART_TXD),
.dma (dma), .fill (fill), .buflen (buflen [7:0])
);
//
// Buffer
//
wire fill;
wire dma;
wire [7:0] buf_q;
//wire bufclk = clk & bufsel & vma & ~io;
wire [7:0] buflen;
buffer buffer_i (
.clk (clk),
.reset (reset),
.cpu_addr (addr_out [15:0]),
.cpu_data_in (data_out [7:0]),
.buf_q (buf_q [7:0]),
.vma (vma), .rd (rd), .wr (wr), .io (io),
.floppy_rdata (nRDATA),
.dma (dma), .fill (fill), .buflen (buflen [7:0])
);
SEG7_LUT_4 hexdisplay (
.iDIG ({addr_out [7:0], data_in [7:0]}),
.oSEG0 (HEX0), .oSEG1 (HEX1), .oSEG2 (HEX2), .oSEG3 (HEX3)
);
vga mydisplay (.clk (clk_25mhz), .vga_h_sync (VGA_HS), .vga_v_sync (VGA_VS), .R (VGA_R [3:0]), .G (VGA_G [3:0]), .B (VGA_B [3:0]));
// ---------------------------------------------------------------------------------
wire clk_50mhz, clk_25mhz;
wire reset = ~KEY [0];
pll my_pll (.inclk0 (CLOCK_50), .c0 (clk_25mhz), .c1 (clk_50mhz));
parameter ONESEC = 25'd20000000;
parameter HALFSEC = 25'd100000;
reg [24:0] cntr;
reg [25:0] counter;
always @(posedge clk_25mhz) begin
counter <= counter + 1'b1;
end
reg [15:0] cntr_1khz;
wire bingo = cntr_1khz == 16'd20000;
always @(posedge clk) begin
if (reset)
cntr_1khz <= 0;
else begin
if (bingo)
cntr_1khz <= 0;
else
cntr_1khz <= cntr_1khz + 1'b1;
end
end
assign LEDG [0] = counter [24];
assign LEDG [3] = ~nINDEX;
assign LEDG [4] = ~nRDATA;
assign LEDG [5] = ~nTRK0;
assign LEDG [6] = ~nCHANGE;
assign LEDG [7] = ~nRDY;
//assign LEDR [5:0] = {nINDEX, nCHANGE, nRDY, nRDATA, nTRK0, nWPROT};
//assign LEDR [5:0] = {nINDEX_r, nCHANGE_r, nRDY_r, nRDATA_r, nTRK0_r, nWPROT_r};
assign LEDR [7:0] = ~output_port [7:0];
assign LEDR [8] = rd;
assign LEDR [9] = wr;
endmodule