From dce06d560ebf5894c0f4f0d698096c0a73028090 Mon Sep 17 00:00:00 2001 From: Paolo Pisati Date: Mon, 4 Nov 2019 15:52:00 +0100 Subject: [PATCH] boards: icoboard support Signed-off-by: Paolo Pisati --- README.md | 1 + boards/icoboard/README.md | 28 ++++++++ boards/icoboard/yosys/Makefile | 79 ++++++++++++++++++++++ boards/icoboard/yosys/icoboard.pcf | 42 ++++++++++++ rtl/boards/icoboard/apple1_hx8k.v | 105 +++++++++++++++++++++++++++++ 5 files changed, 255 insertions(+) create mode 100644 boards/icoboard/README.md create mode 100644 boards/icoboard/yosys/Makefile create mode 100644 boards/icoboard/yosys/icoboard.pcf create mode 100644 rtl/boards/icoboard/apple1_hx8k.v diff --git a/README.md b/README.md index d7420c6..99d860a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ This is a basic implementation of the original Apple 1 in Verilog. It can run th Contributor supported boards (YMMV): - [Blackice II](https://www.tindie.com/products/Folknology/blackice-ii/) +- [icoBoard](http://icoboard.org/) - [Olimex iCE40HX8K with ICE40-IO](https://www.olimex.com/Products/FPGA/iCE40/iCE40HX8K-EVB/open-source-hardware) - [TinyFPGA B2](http://tinyfpga.com/) - [Upduino](http://gnarlygrey.atspace.cc/development-platform.html) diff --git a/boards/icoboard/README.md b/boards/icoboard/README.md new file mode 100644 index 0000000..265c9c2 --- /dev/null +++ b/boards/icoboard/README.md @@ -0,0 +1,28 @@ +# icoBoard with Digilent Pmods support + +This adds support for building the apple one design for +[icoBoard](http://icoboard.org/about-icoboard.html) with attached Digilent Pmods +for VGA, PS/2 or UART. + +## Peripheral support + +VGA port is working through a Digilent VGA Pmod on Pmod 1/2. + +PS/2 works through a Digilent PS/2 Pmod on Pmod 3 upper row. + +UART works through a Digilent USBUART Pmod on Pmod 4 upper row. + +By default, UART is enabled (and PS/2 is off), check +rtl/boards/icoboard/apple1_hx8k.v. + +## Building +Install a recent IceStorm toolchain, and: + +``` +$ cd yosys +$ make apple1 +``` + +## Use + +To load BASIC type "E000R" with CAPS LOCK on. diff --git a/boards/icoboard/yosys/Makefile b/boards/icoboard/yosys/Makefile new file mode 100644 index 0000000..e6a4465 --- /dev/null +++ b/boards/icoboard/yosys/Makefile @@ -0,0 +1,79 @@ +DEVICE = hx8k +PIN_DEF = icoboard.pcf +FREQ_OSC = 100 +FREQ_PLL = 25 + +SOURCEDIR = ../../../rtl +BUILDDIR = build + +PLL = $(BUILDDIR)/pll.sv + +all: apple1 prog + +info: + @echo " To build: make apple1" + @echo " To program: make prog" + @echo "To build report: make report" + @echo " To clean up: make clean" + +dir: + mkdir -p $(BUILDDIR) + +# ------ TEMPLATES ------ +$(BUILDDIR)/%.blif: $(SOURCEDIR)/%.v + yosys -q -p "chparam -list; hierarchy -top apple1_top; synth_ice40 -blif $@" $^ + +$(BUILDDIR)/%.asc: $(PIN_DEF) $(BUILDDIR)/%.blif + arachne-pnr -d 8k -o $@ -p $^ + +$(BUILDDIR)/%.bin: $(BUILDDIR)/%.asc + icepack $^ $@ + +%.rpt: $(BUILDDIR)/%.asc + icetime -d $(DEVICE) -c $(FREQ_PLL) -mtr $@ $< + +%_tb.vvp: %_tb.v %.v + iverilog -o $@ $^ + +%_tb.vcd: %_tb.vvp + vvp -N $< +vcd=$@ + +$(PLL): + icepll $(QUIET) -i $(FREQ_OSC) -o $(FREQ_PLL) -m -f $@ + +# ------ APPLE 1 ------ +apple1: dir $(PLL) $(BUILDDIR)/apple1.bin +report: dir apple1.rpt + +$(BUILDDIR)/apple1.bin: $(BUILDDIR)/apple1.asc +$(BUILDDIR)/apple1.asc: $(BUILDDIR)/apple1.blif +$(BUILDDIR)/apple1.blif: $(SOURCEDIR)/apple1.v \ + $(SOURCEDIR)/clock.v \ + $(SOURCEDIR)/pwr_reset.v \ + $(SOURCEDIR)/ram.v \ + $(SOURCEDIR)/rom_wozmon.v \ + $(SOURCEDIR)/rom_basic.v \ + $(SOURCEDIR)/cpu/arlet_6502.v \ + $(SOURCEDIR)/cpu/arlet/ALU.v \ + $(SOURCEDIR)/cpu/arlet/cpu.v \ + $(SOURCEDIR)/uart/uart.v \ + $(SOURCEDIR)/uart/async_tx_rx.v \ + $(SOURCEDIR)/vga/vga.v \ + $(SOURCEDIR)/vga/vram.v \ + $(SOURCEDIR)/vga/font_rom.v \ + $(SOURCEDIR)/ps2keyboard/debounce.v \ + $(SOURCEDIR)/ps2keyboard/ps2keyboard.v \ + $(SOURCEDIR)/boards/icoboard/apple1_hx8k.v \ + $(BUILDDIR)/pll.sv + +apple1.rpt: $(BUILDDIR)/apple1.asc + +prog: dir $(BUILDDIR)/apple1.bin + icoprog -p < $(BUILDDIR)/apple1.bin + +# ------ HELPERS ------ +clean: + rm -rf build apple1.rpt + +.SECONDARY: +.PHONY: all info clean prog iceprog diff --git a/boards/icoboard/yosys/icoboard.pcf b/boards/icoboard/yosys/icoboard.pcf new file mode 100644 index 0000000..2dc5cab --- /dev/null +++ b/boards/icoboard/yosys/icoboard.pcf @@ -0,0 +1,42 @@ +# For the icoBoard + +### 100Mhz clk +set_io clk R9 + +### VGA display +set_io vga_h_sync B8 +set_io vga_v_sync A9 +set_io vga_r[0] A5 +set_io vga_r[1] A2 +set_io vga_r[2] C3 +set_io vga_r[3] B4 +set_io vga_g[0] D8 +set_io vga_g[1] B9 +set_io vga_g[2] B10 +set_io vga_g[3] B11 +set_io vga_b[0] B7 +set_io vga_b[1] B6 +set_io vga_b[2] B3 +set_io vga_b[3] B5 + +### LEDs +# onboard LEDs +set_io led[0] C8 +set_io led[1] F7 + +### PS/2 +set_io ps2_din L9 +set_io ps2_clk L7 + +### Buttons +# onboard buttons +set_io button[0] K11 +set_io button[1] P13 + +### UART +#set_io uart_rts T15 +#set_io uart_rx T14 +#set_io uart_tx T11 +set_io uart_rx T11 +set_io uart_tx T14 +set_io uart_cts R10 diff --git a/rtl/boards/icoboard/apple1_hx8k.v b/rtl/boards/icoboard/apple1_hx8k.v new file mode 100644 index 0000000..3f20416 --- /dev/null +++ b/rtl/boards/icoboard/apple1_hx8k.v @@ -0,0 +1,105 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Description: Apple 1 implementation for the icoBoard +// +// Author.....: Paolo Pisati (inspired from blackice2/apple1_hx8k.v) +// Date.......: 05-11-2019 +// + +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" +) ( + 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 + + // I/O interface to keyboard + 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 [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 +); + + 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 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; + + wire reset_n; + assign reset_n = ~button[0]; + + 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), + + .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 + + .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