Added key_switch to choose keyboard type

This commit is contained in:
Alan Garfield committed 2025-09-22 15:28:13 +10:00
1 parent 67b0c26e31
commit a0a2629169
13 files changed
+985 -947

No files matched your search

+3
View File
@@ -8,3 +8,6 @@ synlog.tcl
*_tb
*.vcd
build
gwsynthesis
pnr
temp
+263 -246
View File
@@ -23,282 +23,299 @@
//
module apple1 #(
parameter BASIC_FILENAME = "../../../roms/basic.hex",
parameter FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex",
parameter RAM_FILENAME = "../../../roms/ram.hex",
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
parameter string BASIC_FILENAME = "../../../roms/basic.hex",
parameter string FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex",
parameter string RAM_FILENAME = "../../../roms/ram.hex",
parameter string VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter string WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk25, // 25 MHz master clock
input rst_n, // active low synchronous reset (needed for simulation)
input clk25, // 25 MHz master clock
input rst_n, // active low synchronous reset (needed for simulation)
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
// I/O interface to PS/2 keyboard
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
input ps2_select, // Input to select the PS/2 keyboard instead of the UART
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
// I/O interface to USB keyboard
input usb_clk, // 12MHz USB clock
inout usb_dm, // USB data minus signal
inout usb_dp, // USB data plus signal
output usb_led_err, // USB connection error LED
output usb_led_act, // USB activity LED
input usb_clk, // 12MHz USB clock
inout usb_dm, // USB data minus signal
inout usb_dp, // USB data plus signal
output usb_led_err, // USB connection error LED
output usb_led_act, // USB activity LED
input [1:0] key_select, // Select the Apple 1 keyboard input
// 2'b00 - UART RX
// 2'b01 - USB Keyboard
// 2'b10 - P/S Keyboard
// 2'b11 - None / Other
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output vga_red, // red VGA signal
output vga_grn, // green VGA signal
output vga_blu, // blue VGA signal
input vga_cls, // clear screen button
output vga_de, // display enable
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output vga_red, // red VGA signal
output vga_grn, // green VGA signal
output vga_blu, // blue VGA signal
input vga_cls, // clear screen button
output vga_de, // display enable
// Debugging ports
output [15:0] pc_monitor // spy for program counter / debugging
output [15:0] pc_monitor // spy for program counter / debugging
);
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
wire [15:0] ab;
wire [7:0] dbi;
wire [7:0] dbo;
wire we;
wire [15:0] ab;
wire [7:0] dbi;
wire [7:0] dbo;
wire we;
//////////////////////////////////////////////////////////////////////////
// Clocks
//////////////////////////////////////////////////////////////////////////
// Clocks
wire cpu_clken;
clock my_clock(
.clk25(clk25),
.rst_n(rst_n),
.cpu_clken(cpu_clken)
);
wire cpu_clken;
clock my_clock (
.clk25(clk25),
.rst_n(rst_n),
.cpu_clken(cpu_clken)
);
//////////////////////////////////////////////////////////////////////////
// Reset
//////////////////////////////////////////////////////////////////////////
// Reset
wire rst;
pwr_reset my_reset(
.clk25(clk25),
.rst_n(rst_n),
.enable(cpu_clken),
.rst(rst)
);
wire rst;
pwr_reset my_reset (
.clk25(clk25),
.rst_n(rst_n),
.enable(cpu_clken),
.rst(rst)
);
//////////////////////////////////////////////////////////////////////////
// 6502
//////////////////////////////////////////////////////////////////////////
// 6502
arlet_6502 my_cpu(
.clk (clk25),
.enable (cpu_clken),
.rst (rst),
.ab (ab),
.dbi (dbi),
.dbo (dbo),
.we (we),
.irq_n (1'b1),
.nmi_n (1'b1),
.ready (cpu_clken),
.pc_monitor (pc_monitor)
);
arlet_6502 my_cpu (
.clk (clk25),
.enable (cpu_clken),
.rst (rst),
.ab (ab),
.dbi (dbi),
.dbo (dbo),
.we (we),
.irq_n (1'b1),
.nmi_n (1'b1),
.ready (cpu_clken),
.pc_monitor(pc_monitor)
);
//////////////////////////////////////////////////////////////////////////
// Address Decoding
//////////////////////////////////////////////////////////////////////////
// Address Decoding
wire ram_cs = (ab[15:13] == 3'b000); // 0x0000 -> 0x1FFF
reg ram_cs, vga_cs, vga_mode_cs, rx_cs, tx_cs, uart_cs, usb_cs, ps2kb_cs, basic_cs, rom_cs;
// font mode, background and foreground colour
wire vga_mode_cs = (ab[15:2] == 14'b11000000000000); // 0xC000 -> 0xC003
always @(posedge clk25 or posedge rst) begin
if (rst) begin
ram_cs <= 1'd0;
vga_mode_cs <= 1'd0;
rx_cs <= 1'd0;
tx_cs <= 1'd0;
uart_cs <= 1'd0;
usb_cs <= 1'd0;
ps2kb_cs <= 1'd0;
basic_cs <= 1'd0;
rom_cs <= 1'd0;
end else begin
// RAM selection
ram_cs <= (ab[15:13] == 3'b000); // 0x0000 -> 0x1FFF
// RX: Either keyboard or UART input
// TX: Always VGA and UART output
wire rx_cs = (ab[15:1] == 15'b110100000001000); // 0xD010 -> 0xD011
wire tx_cs = (ab[15:1] == 15'b110100000001001); // 0xD012 -> 0xD013
// font mode, background and foreground colour
vga_mode_cs <= (ab[15:2] == 14'b11000000000000); // 0xC000 -> 0xC003
// select UART on transmit but only receive when PS/2 is not selected.
wire uart_cs = tx_cs | ((~ps2_select) & rx_cs);
// RX: Either keyboard or UART input
// TX: Always VGA and UART output
rx_cs <= (ab[15:1] == 15'b110100000001000); // 0xD010 -> 0xD011
tx_cs <= (ab[15:1] == 15'b110100000001001); // 0xD012 -> 0xD013
// select PS/2 keyboard input when selected.
wire ps2kb_cs = ps2_select & rx_cs;
// select UART on transmit and only receive if key_select is UART
uart_cs <= tx_cs | (rx_cs & (key_select == 2'b00));
// select PS/2 keyboard input when selected.
wire usb_cs = rx_cs;
// select USB keyboard input when selected.
usb_cs <= rx_cs & (key_select == 2'b01);
// VGA always get characters when they are sent.
wire vga_cs = tx_cs;
// select PS/2 keyboard input when selected.
ps2kb_cs <= rx_cs & (key_select == 2'b10);
wire basic_cs = (ab[15:12] == 4'b1110); // 0xE000 -> 0xEFFF
wire rom_cs = (ab[15:8] == 8'b11111111); // 0xFF00 -> 0xFFFF
// VGA always get characters when they are sent.
vga_cs <= tx_cs;
//////////////////////////////////////////////////////////////////////////
// RAM and ROM
// RAM
wire [7:0] ram_dout;
ram #(
.RAM_FILENAME (RAM_FILENAME)
) my_ram(
.clk(clk25),
.address(ab[12:0]),
.w_en(we & ram_cs),
.din(dbo),
.dout(ram_dout)
);
// WozMon ROM
wire [7:0] rom_dout;
rom_wozmon #(
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_rom_wozmon(
.clk(clk25),
.address(ab[7:0]),
.dout(rom_dout)
);
// Basic ROM
wire [7:0] basic_dout;
rom_basic #(
.BASIC_FILENAME (BASIC_FILENAME)
) my_rom_basic(
.clk(clk25),
.address(ab[11:0]),
.dout(basic_dout)
);
//////////////////////////////////////////////////////////////////////////
// Peripherals
// UART
wire [7:0] uart_dout;
uart #(
`ifdef SIM
100, 10, 2 // for simulation don't need real baud rates
`else
25000000, 115200, 8 // 25MHz, 115200 baud, 8 times RX oversampling
`endif
) my_uart(
.clk(clk25),
.enable(uart_cs & cpu_clken),
.rst(rst),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.address(ab[1:0]), // for uart
.w_en(we & uart_cs),
.din(dbo),
.dout(uart_dout)
);
// USB Keyboard
wire [7:0] usb_dout;
usb_keyboard my_usb_keyboard(
.usb_clk(usb_clk),
.rst(rst),
.usb_dm(usb_dm),
.usb_dp(usb_dp),
.cs(usb_cs),
.address(ab[0]),
.dout(usb_dout),
.led_connerr(usb_led_err),
.led_activity(usb_led_act)
);
// PS/2 keyboard interface
wire [7:0] ps2_dout;
ps2keyboard my_ps2_keyboard(
.clk25(clk25),
.rst(rst),
.key_clk(ps2_clk),
.key_din(ps2_din),
.cs(ps2kb_cs),
.address(ab[0]),
.dout(ps2_dout)
);
// VGA Display interface
reg [2:0] fg_colour;
reg [2:0] bg_colour;
reg [1:0] font_mode;
reg [7:0] vga_mode_dout;
vga #(
.VRAM_FILENAME (VRAM_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME)
) my_vga(
.clk25(clk25),
.enable(vga_cs & cpu_clken),
.rst(rst),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.vga_de(vga_de),
.address(ab[0]),
.w_en(we & vga_cs),
.din(dbo),
.mode(font_mode),
.fg_colour(fg_colour),
.bg_colour(bg_colour),
.clr_screen(vga_cls)
);
// Handle font mode and foreground and background
// colours. This so isn't Apple One authentic, but
// it can't hurt to have some fun. :D
always @(posedge clk25 or posedge rst)
begin
if (rst)
begin
font_mode <= 2'b0;
fg_colour <= 3'd7;
bg_colour <= 3'd0;
end
else
begin
case (ab[1:0])
2'b00:
begin
vga_mode_dout = {6'b0, font_mode};
if (vga_mode_cs & we & cpu_clken)
font_mode <= dbo[1:0];
end
2'b01:
begin
vga_mode_dout = {5'b0, fg_colour};
if (vga_mode_cs & we & cpu_clken)
fg_colour <= dbo[2:0];
end
2'b10:
begin
vga_mode_dout = {5'b0, bg_colour};
if (vga_mode_cs & we & cpu_clken)
bg_colour <= dbo[2:0];
end
default:
vga_mode_dout = 8'b0;
endcase
end
// ROM selection
basic_cs <= (ab[15:12] == 4'b1110); // 0xE000 -> 0xEFFF
rom_cs <= (ab[15:8] == 8'b11111111); // 0xFF00 -> 0xFFFF
end
end
//////////////////////////////////////////////////////////////////////////
// CPU Data In MUX
//////////////////////////////////////////////////////////////////////////
// RAM and ROM
// link up chip selected device to cpu input
assign dbi = ram_cs ? ram_dout :
rom_cs ? rom_dout :
basic_cs ? basic_dout :
uart_cs ? uart_dout :
ps2kb_cs ? ps2_dout :
vga_mode_cs ? vga_mode_dout :
8'hFF;
// RAM
wire [7:0] ram_dout;
ram #(
.RAM_FILENAME(RAM_FILENAME)
) my_ram (
.clk(clk25),
.address(ab[12:0]),
.w_en(we & ram_cs),
.din(dbo),
.dout(ram_dout)
);
// WozMon ROM
wire [7:0] rom_dout;
rom_wozmon #(
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_rom_wozmon (
.clk(clk25),
.address(ab[7:0]),
.dout(rom_dout)
);
// Basic ROM
wire [7:0] basic_dout;
rom_basic #(
.BASIC_FILENAME(BASIC_FILENAME)
) my_rom_basic (
.clk(clk25),
.address(ab[11:0]),
.dout(basic_dout)
);
//////////////////////////////////////////////////////////////////////////
// Peripherals
// UART
wire [7:0] uart_dout;
uart #(
`ifdef SIM
.ClkFrequency(100),
.Baud(10),
.Oversampling(2) // for simulation don't need real baud rates
`else
.ClkFrequency(25000000),
.Baud(115200),
.Oversampling(8) // 25MHz, 115200 baud, 8 times RX oversampling
`endif
) my_uart (
.clk(clk25),
.enable(uart_cs & cpu_clken),
.rst(rst),
.uart_rx (uart_rx),
.uart_tx (uart_tx),
.uart_cts(uart_cts),
.address(ab[1:0]), // for uart
.w_en (we & uart_cs),
.din (dbo),
.dout (uart_dout)
);
// USB Keyboard
wire [7:0] usb_dout;
usb_keyboard my_usb_keyboard (
.usb_clk(usb_clk),
.rst(rst),
.usb_dm(usb_dm),
.usb_dp(usb_dp),
.cs(usb_cs),
.address(ab[0]),
.dout(usb_dout),
.led_connerr(usb_led_err),
.led_activity(usb_led_act)
);
// PS/2 keyboard interface
wire [7:0] ps2_dout;
ps2keyboard my_ps2_keyboard (
.clk25(clk25),
.rst(rst),
.key_clk(ps2_clk),
.key_din(ps2_din),
.cs(ps2kb_cs),
.address(ab[0]),
.dout(ps2_dout)
);
// VGA Display interface
reg [2:0] fg_colour;
reg [2:0] bg_colour;
reg [1:0] font_mode;
reg [7:0] vga_mode_dout;
vga #(
.VRAM_FILENAME(VRAM_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME)
) my_vga (
.clk25(clk25),
.enable(vga_cs & cpu_clken),
.rst(rst),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.vga_de(vga_de),
.address(ab[0]),
.w_en(we & vga_cs),
.din(dbo),
.mode(font_mode),
.fg_colour(fg_colour),
.bg_colour(bg_colour),
.clr_screen(vga_cls)
);
// Handle font mode and foreground and background
// colours. This so isn't Apple One authentic, but
// it can't hurt to have some fun. :D
always @(posedge clk25 or posedge rst) begin
if (rst) begin
font_mode <= 2'b0;
fg_colour <= 3'd7;
bg_colour <= 3'd0;
end else begin
case (ab[1:0])
2'b00: begin
vga_mode_dout = {6'b0, font_mode};
if (vga_mode_cs & we & cpu_clken) font_mode <= dbo[1:0];
end
2'b01: begin
vga_mode_dout = {5'b0, fg_colour};
if (vga_mode_cs & we & cpu_clken) fg_colour <= dbo[2:0];
end
2'b10: begin
vga_mode_dout = {5'b0, bg_colour};
if (vga_mode_cs & we & cpu_clken) bg_colour <= dbo[2:0];
end
default: vga_mode_dout = 8'b0;
endcase
end
end
//////////////////////////////////////////////////////////////////////////
// CPU Data In MUX
// link up chip selected device to cpu input
assign dbi = ram_cs ? ram_dout :
rom_cs ? rom_dout :
basic_cs ? basic_dout :
uart_cs ? uart_dout :
ps2kb_cs ? ps2_dout :
usb_cs ? usb_dout :
vga_mode_cs ? vga_mode_dout :
8'hFF;
endmodule
+71 -71
View File
@@ -28,99 +28,99 @@ module apple1_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk, // 100 MHz board clock
input clk, // 100 MHz board clock
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer - not used
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer - not used
// I/O interface to keyboard
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output [3:0] vga_r, // red VGA signal
output [3:0] vga_g, // green VGA signal
output [3:0] vga_b, // blue VGA signal
output [3:0] vga_r, // red VGA signal
output [3:0] vga_g, // green VGA signal
output [3:0] vga_b, // blue VGA signal
// Debugging ports
output [3:0] led,
input [1:0] button // 2 buttons on board
input [1:0] button // 2 buttons on board
);
assign led[0] = 1;
assign led[1] = reset_n;
assign led[2] = clr_screen_n;
assign led[3] = 0;
assign led[0] = 1;
assign led[1] = reset_n;
assign led[2] = clr_screen_n;
assign led[3] = 0;
wire clk25;
wire clk25;
// ===============================================================
// System Clock generation (25MHz)
// ===============================================================
// ===============================================================
// System Clock generation (25MHz)
// ===============================================================
reg [1:0] clkpre = 2'b00; // prescaler, from 100MHz to 25MHz
reg [1:0] clkpre = 2'b00; // prescaler, from 100MHz to 25MHz
always @(posedge clk)
begin
clkpre <= clkpre + 1;
end
wire clk25 = clkpre[1];
always @(posedge clk) begin
clkpre <= clkpre + 1;
end
wire clk25 = clkpre[1];
wire vga_bit;
wire vga_bit;
// set the monochrome base colour here..
assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000;
assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000;
assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000;
// set the monochrome base colour here..
assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000;
assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000;
assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000;
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce clear screen button
wire clr_screen_n;
debounce clr_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[1]),
.sig_out(clr_screen_n)
);
// debounce clear screen button
wire clr_screen_n;
debounce clr_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[1]),
.sig_out(clr_screen_n)
);
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(reset_n),
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(reset_n),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.uart_rx (uart_rx),
.uart_tx (uart_tx),
.uart_cts(uart_cts),
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.ps2_select(1'b1), // PS/2 enabled, UART TX disabled
//.ps2_select(1'b0), // PS/2 disabled, UART TX enabled
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_bit),
//.vga_grn(vga_bit),
//.vga_blu(vga_bit),
.vga_cls(~clr_screen_n),
);
// .key_select(2'b00), // UART enabled
.key_select(2'b10), // PS/2 keyboard enabled
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_bit),
//.vga_grn(vga_bit),
//.vga_blu(vga_bit),
.vga_cls(~clr_screen_n),
);
endmodule
+103 -104
View File
@@ -23,135 +23,134 @@
//
module apple1_top #(
parameter BASIC_FILENAME = "../../../roms/basic.hex",
parameter FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex",
parameter RAM_FILENAME = "../../../roms/ram.hex",
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
parameter string BASIC_FILENAME = "../../../roms/basic.hex",
parameter string FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex",
parameter string RAM_FILENAME = "../../../roms/ram.hex",
parameter string VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter string WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk, // 12 MHz board clock
input clk, // 12 MHz board clock
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
// I/O interface to keyboard
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output reg vga_red, // red VGA signal
output reg vga_grn, // green VGA signal
output reg vga_blu, // blue VGA signal
// Debugging ports
output [7:0] led, // 8 LEDs on the iCE40HX8K board
output [7:0] ledx, // 8 LEDs on optionally attached YL-4 board
input [3:0] button // 4 buttons on optionally attached YL-4 board
output [7:0] led, // 8 LEDs on the iCE40HX8K board
output [7:0] ledx, // 8 LEDs on optionally attached YL-4 board
input [3:0] button // 4 buttons on optionally attached YL-4 board
);
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
wire clk25;
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
wire clk25;
wire [15:0] pc_monitor;
assign led[7:0] = pc_monitor[7:0];
assign ledx[7:0] = ~pc_monitor[15:8];
wire [15:0] pc_monitor;
assign led[7:0] = pc_monitor[7:0];
assign ledx[7:0] = ~pc_monitor[15:8];
//////////////////////////////////////////////////////////////////////////
// Clocks
// 12MHz up to 25MHz
pll my_pll(
.clock_in(clk),
.clock_out(clk25)
);
//////////////////////////////////////////////////////////////////////////
// Clocks
// 12MHz up to 25MHz
pll my_pll (
.clock_in (clk),
.clock_out(clk25)
);
//////////////////////////////////////////////////////////////////////////
// PS/2 Keyboard
//////////////////////////////////////////////////////////////////////////
// PS/2 Keyboard
// PS2 Pullups
wire ps2__clk, ps2__din;
SB_IO #(
.PIN_TYPE(6'b000001),
.PULLUP(1'b1)
) my_ps2_clk (
.PACKAGE_PIN(ps2_clk),
.D_IN_0(ps2__clk),
);
// PS2 Pullups
wire ps2__clk, ps2__din;
SB_IO #(
.PIN_TYPE(6'b000001),
.PULLUP (1'b1)
) my_ps2_clk (
.PACKAGE_PIN(ps2_clk),
.D_IN_0(ps2__clk),
);
SB_IO #(
.PIN_TYPE(6'b000001),
.PULLUP(1'b1)
) my_ps2_din (
.PACKAGE_PIN(ps2_din),
.D_IN_0(ps2__din),
);
SB_IO #(
.PIN_TYPE(6'b000001),
.PULLUP (1'b1)
) my_ps2_din (
.PACKAGE_PIN(ps2_din),
.D_IN_0(ps2__din),
);
//////////////////////////////////////////////////////////////////////////
// Reset, Clear Screen and PS/2 mode selection toggle
//////////////////////////////////////////////////////////////////////////
// Reset, Clear Screen and PS/2 mode selection toggle
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce clear screen button
wire clr_screen_n;
debounce clr_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[1]),
.sig_out(clr_screen_n)
);
// debounce clear screen button
wire clr_screen_n;
debounce clr_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[1]),
.sig_out(clr_screen_n)
);
// debounce toggle button on PS2 select
wire ps2_toggle;
reg ps2_select;
debounce ps2_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[2]),
.sig_out(ps2_toggle)
);
// debounce toggle button on PS2 select
wire ps2_toggle;
reg ps2_select;
debounce ps2_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[2]),
.sig_out(ps2_toggle)
);
// defaults to PS2 mode, but can toggle between
// UART and PS2 per button press
always @(posedge ps2_toggle)
ps2_select <= ~ps2_select;
// defaults to PS2 mode, but can toggle between
// UART and PS2 per button press
always @(posedge ps2_toggle) ps2_select <= ~ps2_select;
//////////////////////////////////////////////////////////////////////////
// Core of system
//////////////////////////////////////////////////////////////////////////
// Core of system
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(reset_n),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.ps2_clk(ps2__clk),
.ps2_din(ps2__din),
.ps2_select(ps2_select),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.vga_cls(~clr_screen_n),
.pc_monitor(pc_monitor)
);
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(reset_n),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.ps2_clk(ps2__clk),
.ps2_din(ps2__din),
.key_select(ps2_select ? 2'b10 : 2'b00), // switch between PS/2 or UART
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.vga_cls(~clr_screen_n),
.pc_monitor(pc_monitor)
);
endmodule
@@ -28,93 +28,93 @@ module apple1_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk, // 50 MHz board clock
input clk, // 50 MHz board clock
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer - not used
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer - not used
// I/O interface to keyboard
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
// Outputs to the ADV7123 RGB DAC IC
output vga_clk,
output vga_blank_n,
output [3:0] vga_r, // red VGA signal
output [3:0] vga_g, // green VGA signal
output [3:0] vga_b, // blue VGA signal
output [3:0] vga_r, // red VGA signal
output [3:0] vga_g, // green VGA signal
output [3:0] vga_b, // blue VGA signal
// Debugging ports
output [2:0] led,
input button, // 1 button on board
input button // 1 button on board
);
assign vga_clk = clk25;
assign vga_blank_n = 1;
assign vga_clk = clk25;
assign vga_blank_n = 1;
// Active low
assign led[0] = reset_n;
assign led[1] = 1;
assign led[2] = 1;
// Active low
assign led[0] = reset_n;
assign led[1] = 1;
assign led[2] = 1;
// ===============================================================
// System Clock generation (25MHz)
// ===============================================================
// ===============================================================
// System Clock generation (25MHz)
// ===============================================================
reg clk25 = 1;
reg clk25 = 1;
// generate 25MHz clock from 50MHz master clock
always @(posedge clk)
begin
clk25 <= ~clk25;
end
// generate 25MHz clock from 50MHz master clock
always @(posedge clk) begin
clk25 <= ~clk25;
end
wire vga_bit;
wire vga_bit;
// set the monochrome base colour here..
assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000;
assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000;
assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000;
// set the monochrome base colour here..
assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000;
assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000;
assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000;
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button),
.sig_out(reset_n)
);
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button),
.sig_out(reset_n)
);
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(reset_n),
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(reset_n),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.uart_rx (uart_rx),
.uart_tx (uart_tx),
.uart_cts(uart_cts),
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.ps2_select(1'b1), // PS/2 enabled, UART TX disabled
// .ps2_select(1'b0), // PS/2 disabled, UART TX enabled
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_bit),
.vga_cls(~reset_n),
);
.key_select(2'b10), // PS/2 enabled, UART TX disabled
// .key_select(2'b00), // PS/2 disabled, UART TX enabled
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_bit),
.vga_cls(~reset_n),
);
endmodule
+81 -65
View File
@@ -29,18 +29,18 @@ module apple1_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk, // 50 MHz board clock
input clk, // 50 MHz board clock
// I/O interface to computer
input usb_rx, // asynchronous serial data input from computer
output usb_tx, // asynchronous serial data output to computer
input usb_rx, // asynchronous serial data input from computer
output usb_tx, // asynchronous serial data output to computer
// I/O interface to keyboard
input [1:0] usb_dp, // PS/2 keyboard serial clock input
input [1:0] usb_dn, // PS/2 keyboard serial data input
input [1:0] usb_dp, // PS/2 keyboard serial clock input
input [1:0] usb_dn, // PS/2 keyboard serial data input
output [1:0] usb_pull_dp, // USB pullup/pulldown
output [1:0] usb_pull_dn, // USB pullup/pulldown
output [1:0] usb_pull_dp, // USB pullup/pulldown
output [1:0] usb_pull_dn, // USB pullup/pulldown
// DVI port
output [3:0] gpdi_dp,
@@ -49,75 +49,91 @@ module apple1_top #(
output [4:0] led,
input [1:0] button
);
wire uart_cts; // No CTS pin
wire uart_cts; // No CTS pin
wire clkp, clkt; // clkp: 25MHz, clkt: 250MHz
dvi_pll pll(clk, clkp, clkt, led[0]);
wire clkp, clkt; // clkp: 25MHz, clkt: 250MHz
dvi_pll pll (
clk,
clkp,
clkt,
led[0]
);
wire vsync, hsync, de;
wire [7:0] vga_r, vga_g, vga_b;
wire vsync, hsync, de;
wire [7:0] vga_r, vga_g, vga_b;
// Active low
assign led[1] = reset_n;
assign led[2] = hsync;
assign led[3] = 1'b1;
assign led[4] = 1'b0;
// Active low
assign led[1] = reset_n;
assign led[2] = hsync;
assign led[3] = 1'b1;
assign led[4] = 1'b0;
wire vga_bit;
wire vga_bit;
// set the monochrome base colour here..
assign vga_r = vga_bit ? 8'b10000000 : 4'b00000000;
assign vga_g = vga_bit ? 8'b11111111 : 4'b00000000;
assign vga_b = vga_bit ? 8'b10000000 : 4'b00000000;
// set the monochrome base colour here..
assign vga_r = vga_bit ? 8'b10000000 : 4'b00000000;
assign vga_g = vga_bit ? 8'b11111111 : 4'b00000000;
assign vga_b = vga_bit ? 8'b10000000 : 4'b00000000;
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clkp),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clkp),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce clear button
wire cls;
debounce cls_button (
.clk25(clkp),
.rst(1'b0),
.sig_in(~button[1]),
.sig_out(cls)
);
// debounce clear button
wire cls;
debounce cls_button (
.clk25(clkp),
.rst(1'b0),
.sig_in(~button[1]),
.sig_out(cls)
);
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clkp),
.rst_n(reset_n),
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clkp),
.rst_n(reset_n),
.uart_rx(usb_rx),
.uart_tx(usb_tx),
.uart_cts(uart_cts),
.uart_rx (usb_rx),
.uart_tx (usb_tx),
.uart_cts(uart_cts),
.ps2_clk(usb_dp[0]),
.ps2_din(usb_dn[0]),
.ps2_select(1'b1), // PS/2 enabled, UART TX disabled
// .ps2_select(1'b0), // PS/2 disabled, UART TX enabled
.ps2_clk(usb_dp[0]),
.ps2_din(usb_dn[0]),
.vga_h_sync(hsync),
.vga_v_sync(vsync),
.vga_red(vga_bit),
.vga_cls(cls),
.vga_de(de)
);
.key_select(2'b10), // PS/2 enabled, UART TX disabled
// .key_select(2'b00), // PS/2 disabled, UART TX enabled
assign usb_pull_dn[0] = 1'b1; // PS/2 emulation mode
assign usb_pull_dp[0] = 1'b1;
.vga_h_sync(hsync),
.vga_v_sync(vsync),
.vga_red(vga_bit),
.vga_cls(cls),
.vga_de(de)
);
// Convert the signal to DVI and send over HDMI
vga2tmds tmds_generator(clkp, clkt, vsync, hsync, de, vga_r, vga_g, vga_b, gpdi_dp);
assign usb_pull_dn[0] = 1'b1; // PS/2 emulation mode
assign usb_pull_dp[0] = 1'b1;
// Convert the signal to DVI and send over HDMI
vga2tmds tmds_generator (
clkp,
clkt,
vsync,
hsync,
de,
vga_r,
vga_g,
vga_b,
gpdi_dp
);
endmodule
+54 -53
View File
@@ -28,78 +28,79 @@ module apple1_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk, // 100 MHz board clock
input clk, // 100 MHz board clock
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer - not used
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer - not used
// I/O interface to keyboard
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output [3:0] vga_r, // red VGA signal
output [3:0] vga_g, // green VGA signal
output [3:0] vga_b, // blue VGA signal
output [3:0] vga_r, // red VGA signal
output [3:0] vga_g, // green VGA signal
output [3:0] vga_b, // blue VGA signal
// Debugging ports
output [1:0] led,
input [1:0] button // 2 buttons on board
input [1:0] button // 2 buttons on board
);
assign led[0] = reset_n;
assign led[1] = clr_screen_n;
assign led[0] = reset_n;
assign led[1] = clr_screen_n;
wire clk25;
// 100MHz down to 25MHz
pll my_pll(
.clock_in(clk),
.clock_out(clk25)
);
wire clk25;
// 100MHz down to 25MHz
pll my_pll (
.clock_in (clk),
.clock_out(clk25)
);
wire vga_bit;
wire vga_bit;
// set the monochrome base colour here..
assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000;
assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000;
assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000;
// set the monochrome base colour here..
assign vga_r[3:0] = vga_bit ? 4'b1000 : 4'b0000;
assign vga_g[3:0] = vga_bit ? 4'b1111 : 4'b0000;
assign vga_b[3:0] = vga_bit ? 4'b1000 : 4'b0000;
wire reset_n;
assign reset_n = ~button[0];
wire reset_n;
assign reset_n = ~button[0];
wire clr_screen_n;
assign clr_screen_n = ~button[1];
wire clr_screen_n;
assign clr_screen_n = ~button[1];
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(reset_n),
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(reset_n),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.uart_rx (uart_rx),
.uart_tx (uart_tx),
.uart_cts(uart_cts),
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
//.ps2_select(1'b1), // PS/2 not working, at the moment
.ps2_select(1'b0), // PS/2 disabled, UART TX enabled
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_bit),
//.vga_grn(vga_bit),
//.vga_blu(vga_bit),
.vga_cls(~clr_screen_n),
);
// .key_select(2'b10), // PS/2 enabled, UART TX disabled
.key_select(2'b00), // PS/2 disabled, UART TX enabled
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_bit),
//.vga_grn(vga_bit),
//.vga_blu(vga_bit),
.vga_cls(~clr_screen_n),
);
endmodule
+63 -62
View File
@@ -29,83 +29,84 @@ module apple1_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk, // 100 MHz board clock
input clk, // 100 MHz board clock
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
// I/O interface to keyboard
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
input ps2_clk, // PS/2 keyboard serial clock input
input ps2_din, // PS/2 keyboard serial data input
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output [2:0] vga_r, // red VGA signal
output [2:0] vga_g, // green VGA signal
output [2:0] vga_b, // blue VGA signal
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output [2:0] vga_r, // red VGA signal
output [2:0] vga_g, // green VGA signal
output [2:0] vga_b, // blue VGA signal
input [1:0] button // 2 buttons on board
input [1:0] button // 2 buttons on board
);
wire clk25;
wire clk25;
// 100MHz to 25MHz
pll pll(
.clock_in(clk),
.clock_out(clk25),
);
// 100MHz to 25MHz
pll pll (
.clock_in (clk),
.clock_out(clk25),
);
wire vga_red, vga_green, vga_blue;
assign vga_r[2:0] = {vga_red, vga_red, vga_red};
assign vga_g[2:0] = {vga_green, vga_green, vga_green};
assign vga_b[2:0] = {vga_blue, vga_blue, vga_blue};
wire vga_red, vga_green, vga_blue;
assign vga_r[2:0] = {vga_red, vga_red, vga_red};
assign vga_g[2:0] = {vga_green, vga_green, vga_green};
assign vga_b[2:0] = {vga_blue, vga_blue, vga_blue};
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce reset button
wire reset_n;
debounce reset_button (
.clk25(clk25),
.rst(1'b0),
.sig_in(button[0]),
.sig_out(reset_n)
);
// debounce clear screen button
wire clr_screen_n;
debounce clr_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[1]),
.sig_out(clr_screen_n)
);
// debounce clear screen button
wire clr_screen_n;
debounce clr_button (
.clk25(clk25),
.rst(~reset_n),
.sig_in(button[1]),
.sig_out(clr_screen_n)
);
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(reset_n),
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(reset_n),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.uart_rx (uart_rx),
.uart_tx (uart_tx),
.uart_cts(uart_cts),
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.ps2_select(1'b1), // PS/2 enabled, UART TX disabled
//.ps2_select(1'b0), // PS/2 disabled, UART TX enabled
.ps2_clk(ps2_clk),
.ps2_din(ps2_din),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_green),
.vga_blu(vga_blue),
.vga_cls(~clr_screen_n),
);
.key_select(2'b10), // PS/2 enabled, UART TX disabled
// .key_select(2'b00), // PS/2 disabled, UART TX enabled
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_green),
.vga_blu(vga_blue),
.vga_cls(~clr_screen_n),
);
endmodule
@@ -20,7 +20,7 @@
//
// Author.....: Niels A. Moseley
// Date.......: 11-2-2018
//
//
module apple1_s3e_starterkit_top #(
@@ -29,64 +29,63 @@ module apple1_s3e_starterkit_top #(
parameter RAM_FILENAME = "../../../roms/ram.hex",
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input CLK_50MHZ, // the 50 MHz master clock
) (
input CLK_50MHZ, // the 50 MHz master clock
// UART I/O signals
output UART_TXD, // UART transmit pin on board
input UART_RXD, // UART receive pin on board
input PS2_KBCLK,
input PS2_KBDAT,
output UART_TXD, // UART transmit pin on board
input UART_RXD, // UART receive pin on board
input BUTTON, // Button for RESET
input SWITCH, // Switch between PS/2 input and UART
input PS2_KBCLK,
input PS2_KBDAT,
output VGA_R,
output VGA_G,
output VGA_B,
output VGA_HS,
output VGA_VS
input BUTTON, // Button for RESET
input SWITCH, // Switch between PS/2 input and UART
output VGA_R,
output VGA_G,
output VGA_B,
output VGA_HS,
output VGA_VS
);
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
reg clk25;
wire [15:0] pc_monitor;
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
reg clk25;
wire [15:0] pc_monitor;
wire rst_n;
assign rst_n = ~BUTTON;
wire rst_n;
assign rst_n = ~BUTTON;
// generate 25MHz clock from 50MHz master clock
always @(posedge CLK_50MHZ) begin
clk25 <= ~clk25;
end
//////////////////////////////////////////////////////////////////////////
// Core of system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) apple1_top (
.clk25 (clk25),
.rst_n (rst_n), // we don't have any reset pulse..
.uart_rx (UART_RXD),
.uart_tx (UART_TXD),
//.uart_cts(UART_CTS), // there is no CTS on the board :(
.ps2_clk (PS2_KBCLK),
.ps2_din (PS2_KBDAT),
.key_select(SWITCH ? 2'b10 : 2'b00), // PS/2 or UART with switch
.vga_h_sync(VGA_HS),
.vga_v_sync(VGA_VS),
.vga_red (VGA_R),
.vga_grn (VGA_G),
.vga_blu (VGA_B),
.vga_cls (~rst_n),
.pc_monitor(pc_monitor)
);
// generate 25MHz clock from 50MHz master clock
always @(posedge CLK_50MHZ)
begin
clk25 <= ~clk25;
end
//////////////////////////////////////////////////////////////////////////
// Core of system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) apple1_top(
.clk25(clk25),
.rst_n(rst_n), // we don't have any reset pulse..
.uart_rx(UART_RXD),
.uart_tx(UART_TXD),
//.uart_cts(UART_CTS), // there is no CTS on the board :(
.ps2_clk(PS2_KBCLK),
.ps2_din(PS2_KBDAT),
.ps2_select(SWITCH),
.vga_h_sync(VGA_HS),
.vga_v_sync(VGA_VS),
.vga_red(VGA_R),
.vga_grn(VGA_G),
.vga_blu(VGA_B),
.vga_cls(~rst_n),
.pc_monitor(pc_monitor)
);
endmodule
+51 -50
View File
@@ -22,20 +22,20 @@
//
module apple1_primer #(
parameter BASIC_FILENAME = "../../../roms/basic.hex",
parameter FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex",
parameter RAM_FILENAME = "../../../roms/ram.hex",
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
parameter string BASIC_FILENAME = "../../../roms/basic.hex",
parameter string FONT_ROM_FILENAME = "../../../roms/vga_font_bitreversed.hex",
parameter string RAM_FILENAME = "../../../roms/ram.hex",
parameter string VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter string WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input clk,
input rst,
input clk,
input rst,
input uart_rx,
output uart_tx,
inout usb_dm,
inout usb_dp,
inout usb_dm,
inout usb_dp,
output usb_led_err,
output usb_led_act,
@@ -44,56 +44,57 @@ module apple1_primer #(
output vga_red,
output vga_grn,
output vga_blu,
input vga_cls,
input vga_cls,
output vga_de
);
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
wire uart_cts; // No CTS pin
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
wire uart_cts; // No CTS pin
wire clk25;
wire usb_clk;
wire clk25;
wire usb_clk;
Gowin_PLL your_instance_name(
.clkin(clk),
.clkout0(clk25),
.clkout1(usb_clk),
.mdclk(1'd0)
);
Gowin_PLL your_instance_name (
.clkin (clk),
.clkout0(clk25),
.clkout1(usb_clk),
.mdclk (1'd0)
);
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(!rst),
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(!rst),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.uart_rx (uart_rx),
.uart_tx (uart_tx),
.uart_cts(uart_cts),
.ps2_clk(1'b0),
.ps2_din(1'b0),
.ps2_select(1'b0), // PS/2 disabled, UART TX enabled
.key_select(2'b00), // USB keyboard selected
.usb_clk(usb_clk),
.usb_dm(usb_dm),
.usb_dp(usb_dp),
.usb_led_err(usb_led_err),
.usb_led_act(usb_led_act),
.ps2_clk(1'b0),
.ps2_din(1'b0),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.vga_cls(vga_cls),
.vga_de(vga_de),
.usb_clk(usb_clk),
.usb_dm(usb_dm),
.usb_dp(usb_dp),
.usb_led_err(usb_led_err),
.usb_led_act(usb_led_act),
.pc_monitor()
);
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.vga_cls(vga_cls),
.vga_de(vga_de),
.pc_monitor()
);
endmodule
+82 -82
View File
@@ -29,104 +29,104 @@ module apple1_de0_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input CLOCK_50, // the 50 MHz DE0 master clock
input CLOCK_50, // the 50 MHz DE0 master clock
// UART I/O signals
output UART_TXD, // UART transmit pin on DE0 board
input UART_RXD, // UART receive pin on DE0 board
output UART_CTS, // UART clear-to-send pin on DE0 board
output UART_TXD, // UART transmit pin on DE0 board
input UART_RXD, // UART receive pin on DE0 board
output UART_CTS, // UART clear-to-send pin on DE0 board
output [7:0] LEDG, // monitoring for lower 8 address bits
input [2:0] BUTTON, // BUTTON[0] for reset
output [6:0] HEX0_D,
output [6:0] HEX1_D,
output [6:0] HEX2_D,
output [6:0] HEX3_D,
output [7:0] LEDG, // monitoring for lower 8 address bits
input [2:0] BUTTON, // BUTTON[0] for reset
output [6:0] HEX0_D,
output [6:0] HEX1_D,
output [6:0] HEX2_D,
output [6:0] HEX3_D,
input PS2_KBCLK,
input PS2_KBDAT,
input PS2_KBCLK,
input PS2_KBDAT,
output [3:0] VGA_R,
output [3:0] VGA_G,
output [3:0] VGA_B,
output VGA_HS,
output VGA_VS
output [3:0] VGA_R,
output [3:0] VGA_G,
output [3:0] VGA_B,
output VGA_HS,
output VGA_VS
);
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
reg clk25;
wire [15:0] pc_monitor;
//////////////////////////////////////////////////////////////////////////
// Registers and Wires
reg clk25;
wire [15:0] pc_monitor;
// generate 25MHz clock from 50MHz master clock
always @(posedge CLOCK_50)
begin
clk25 <= ~clk25;
end
// generate 25MHz clock from 50MHz master clock
always @(posedge CLOCK_50) begin
clk25 <= ~clk25;
end
wire r_bit, g_bit, b_bit;
wire r_bit, g_bit, b_bit;
//////////////////////////////////////////////////////////////////////////
// Core of system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) apple1_top(
.clk25(clk25),
.rst_n(BUTTON[0]), // we don't have any reset pulse..
.uart_rx(UART_RXD),
.uart_tx(UART_TXD),
.uart_cts(UART_CTS),
.ps2_clk(PS2_KBCLK),
.ps2_din(PS2_KBDAT),
.ps2_select(1'b1),
.vga_h_sync(VGA_HS),
.vga_v_sync(VGA_VS),
.vga_red(r_bit),
.vga_grn(g_bit),
.vga_blu(b_bit),
.pc_monitor(pc_monitor)
);
//////////////////////////////////////////////////////////////////////////
// Core of system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) apple1_top (
.clk25 (clk25),
.rst_n (BUTTON[0]), // we don't have any reset pulse..
.uart_rx (UART_RXD),
.uart_tx (UART_TXD),
.uart_cts (UART_CTS),
.ps2_clk (PS2_KBCLK),
.ps2_din (PS2_KBDAT),
.key_select(2'b10), // PS/2 enabled, UART TX disabled
// .key_select(2'b00), // PS/2 disabled, UART TX enabled
.vga_h_sync(VGA_HS),
.vga_v_sync(VGA_VS),
.vga_red (r_bit),
.vga_grn (g_bit),
.vga_blu (b_bit),
.pc_monitor(pc_monitor)
);
// set the monochrome base colour here..
assign VGA_R[3:0] = {4{r_bit}};
assign VGA_G[3:0] = {4{g_bit}};
assign VGA_B[3:0] = {4{b_bit}};
// set the monochrome base colour here..
assign VGA_R[3:0] = {4{r_bit}};
assign VGA_G[3:0] = {4{g_bit}};
assign VGA_B[3:0] = {4{b_bit}};
//////////////////////////////////////////////////////////////////////////
// Display 6502 address on 7-segment displays
//////////////////////////////////////////////////////////////////////////
// Display 6502 address on 7-segment displays
segmentdisplay seg1(
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[3:0]),
.display_out(HEX0_D)
);
segmentdisplay seg1 (
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[3:0]),
.display_out(HEX0_D)
);
segmentdisplay seg2(
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[7:4]),
.display_out(HEX1_D)
);
segmentdisplay seg2 (
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[7:4]),
.display_out(HEX1_D)
);
segmentdisplay seg3(
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[11:8]),
.display_out(HEX2_D)
);
segmentdisplay seg3 (
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[11:8]),
.display_out(HEX2_D)
);
segmentdisplay seg4(
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[15:12]),
.display_out(HEX3_D)
);
segmentdisplay seg4 (
.clk(clk25),
.latch(1'b1),
.hexdigit_in(pc_monitor[15:12]),
.display_out(HEX3_D)
);
assign LEDG = 0;
assign LEDG = 0;
endmodule
+56 -55
View File
@@ -29,75 +29,76 @@ module apple1_top #(
parameter VRAM_FILENAME = "../../../roms/vga_vram.bin",
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
input pin3_clk_16mhz,// 16 MHz board clock
input pin3_clk_16mhz, // 16 MHz board clock
// Outputs to VGA display
output pin4, // hozizontal VGA sync pulse
output pin5, // vertical VGA sync pulse
output pin4, // hozizontal VGA sync pulse
output pin5, // vertical VGA sync pulse
input pin6, // PS/2 data input
input pin7, // PS/2 clock
input pin6, // PS/2 data input
input pin7, // PS/2 clock
// I/O interface to computer
input pin11, // asynchronous serial data input from computer
output pin12, // asynchronous serial data output to computer
output pin13, // clear to send flag to computer
input pin11, // asynchronous serial data input from computer
output pin12, // asynchronous serial data output to computer
output pin13, // clear to send flag to computer
output reg pin24, // red VGA signal
output reg pin23, // red VGA signal
output reg pin22, // green VGA signal
output reg pin21, // green VGA signal
output reg pin20, // blue VGA signal
output reg pin19 // blue VGA signal
output reg pin24, // red VGA signal
output reg pin23, // red VGA signal
output reg pin22, // green VGA signal
output reg pin21, // green VGA signal
output reg pin20, // blue VGA signal
output reg pin19 // blue VGA signal
);
wire clk25;
wire clk25;
// 16MHz up to 25MHz
clock_pll clock_pll_inst(
.REFERENCECLK(pin3_clk_16mhz),
.PLLOUTGLOBAL(clk25),
.RESET(1'b1)
);
// 16MHz up to 25MHz
clock_pll clock_pll_inst (
.REFERENCECLK(pin3_clk_16mhz),
.PLLOUTGLOBAL(clk25),
.RESET(1'b1)
);
wire [15:0] pc_monitor;
wire [15:0] pc_monitor;
reg [1:0] button = 2'b01;
reg [1:0] button = 2'b01;
wire vga_red;
wire vga_grn;
wire vga_blu;
wire vga_red;
wire vga_grn;
wire vga_blu;
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(button[0]),
.ps2_clk(pin7), // PS/2 not working with my keyboard
.ps2_din(pin6),
.ps2_select(1'b0), // change to 1 in order to test with keyboard
.uart_rx(pin11),
.uart_tx(pin12),
.uart_cts(pin13),
.vga_h_sync(pin4),
.vga_v_sync(pin5),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.pc_monitor(pc_monitor)
);
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(button[0]),
.ps2_clk(pin7), // PS/2 not working with my keyboard
.ps2_din(pin6),
// .key_select(2'b10), // PS/2 enabled, UART TX disabled
.key_select(2'b00), // PS/2 disabled, UART TX enabled
.uart_rx(pin11),
.uart_tx(pin12),
.uart_cts(pin13),
.vga_h_sync(pin4),
.vga_v_sync(pin5),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.pc_monitor(pc_monitor)
);
assign pin19 = vga_blu;
assign pin20 = vga_blu;
assign pin21 = vga_grn;
assign pin22 = vga_grn;
assign pin23 = vga_red;
assign pin24 = vga_red;
assign pin19 = vga_blu;
assign pin20 = vga_blu;
assign pin21 = vga_grn;
assign pin22 = vga_grn;
assign pin23 = vga_red;
assign pin24 = vga_red;
endmodule
+44 -44
View File
@@ -30,16 +30,16 @@ module apple1_top #(
parameter WOZMON_ROM_FILENAME = "../../../roms/wozmon.hex"
) (
// I/O interface to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
input uart_rx, // asynchronous serial data input from computer
output uart_tx, // asynchronous serial data output to computer
output uart_cts, // clear to send flag to computer
// Outputs to VGA display
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output reg vga_red, // red VGA signal
output reg vga_grn, // green VGA signal
output reg vga_blu, // blue VGA signal
output vga_h_sync, // hozizontal VGA sync pulse
output vga_v_sync, // vertical VGA sync pulse
output reg vga_red, // red VGA signal
output reg vga_grn, // green VGA signal
output reg vga_blu, // blue VGA signal
// Tricolor LED on the UPDuino
output red_led,
@@ -47,45 +47,45 @@ module apple1_top #(
output blue_led
);
wire [15:0] leds;
assign red_led = ~leds[9];
assign green_led = ~leds[8];
assign blue_led = ~leds[7];
wire [15:0] leds;
assign red_led = ~leds[9];
assign green_led = ~leds[8];
assign blue_led = ~leds[7];
wire clk25;
wire clk;
wire clk25;
wire clk;
SB_HFOSC inthosc (
.CLKHFPU(1'b1),
.CLKHFEN(1'b1),
.CLKHF(clk)
);
SB_HFOSC inthosc (
.CLKHFPU(1'b1),
.CLKHFEN(1'b1),
.CLKHF (clk)
);
pll pll(
.clock_in(clk),
.clock_out(clk25),
);
pll pll (
.clock_in (clk),
.clock_out(clk25),
);
// apple one main system
apple1 #(
.BASIC_FILENAME (BASIC_FILENAME),
.FONT_ROM_FILENAME (FONT_ROM_FILENAME),
.RAM_FILENAME (RAM_FILENAME),
.VRAM_FILENAME (VRAM_FILENAME),
.WOZMON_ROM_FILENAME (WOZMON_ROM_FILENAME)
) my_apple1(
.clk25(clk25),
.rst_n(1'b1),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.pc_monitor(leds),
.ps2_select(1'b0), // no ps2 keyboard right now
);
// apple one main system
apple1 #(
.BASIC_FILENAME(BASIC_FILENAME),
.FONT_ROM_FILENAME(FONT_ROM_FILENAME),
.RAM_FILENAME(RAM_FILENAME),
.VRAM_FILENAME(VRAM_FILENAME),
.WOZMON_ROM_FILENAME(WOZMON_ROM_FILENAME)
) my_apple1 (
.clk25(clk25),
.rst_n(1'b1),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.uart_cts(uart_cts),
.vga_h_sync(vga_h_sync),
.vga_v_sync(vga_v_sync),
.vga_red(vga_red),
.vga_grn(vga_grn),
.vga_blu(vga_blu),
.pc_monitor(leds),
.key_select(1'b00) // UART only for now
);
endmodule