Folder name | Description |
---|---|
assembler | Native QNICE assembler: Main file is qasm.c . You usually call it via the script asm , which utilizes the C preprocessor (mainly for #include , #define , #ifdef , etc). |
c | C programming environment based on the vbcc compiler system. You need to activate setenv.source (e.g. via source ) to use it and then use qvc <sources> <options> to compile and link. The subfolder c/test_programs contains experiments and demos written in C. |
demos | QNICE demos written in assembler. Most noteworthy is q-tris.asm . |
dist_kit | Distribution Kit: Contains standard include files for assembler and C as well as ready-made bitstreams and MEGA Core files in the folder dist_kit/bin . You might want to set this folder as your default folder for includes. Learn more via dist_kit/README.md |
doc | Documentation: See explanation of file and folder structure below. |
emulator | QNICE Emulator: Learn more via emulator/README.md |
hw | Project files for IDEs to synthesize QNICE-FPGA: Learn more via hw/README.md |
monitor | Monitor is the "operating system" of QNICE. Use compile_and_distribute.sh to compile it and to update dist_kit . |
pore | Power On & Reset Execution ROM. This code is executed on power on and on each reset of the system, even before any standard operating system like the Monitor is being executed from ROM address 0. PORE is mainly responsible for printing the boot message. Use compile_pore.sh to compile it. |
qbin | Compiled binaries (.out format) that can be put on an SD Card. You can load them directly when the Monitor is running using the File/Run command via F and R . |
test_programs | Experiments, development testbeds, and simple tests written in QNICE assembler. |
tools | Various tools. Use make_toolchain.sh to compile the QNICE toolchain and qtransfer.c to transfer data from your Mac or PC to QNICE-FPGA while qtransfer.asm is running on QNICE-FGA. |
vhdl | Portable QNICE-FPGA implementation. Subfolder hw contains hardware specific VHDL code. vhdl/hw/MEGA65/README.md contains information about MEGA65 specific sources. |
Folder name | Description |
---|---|
demos | Screenshots for the web site and for the main README.md showing the demos. Additionally, this folder contains the all-time high-scores for Q-TRIS in demos/q-tris-highscore.txt. |
github | Images used for the presentation of the project on GitHub. |
history | Right now, this folder only contains an old paper (nice_can.pdf ) about the predecessor of QNICE: The NICE architecture. QNICE - albeit a 16-bit architecture - was created later than the 32-bit NICE architecture. |
intro | LaTeX source and PDF version of the QNICE introduction presentation. |
monitor | The script create_documentation.pl uses LaTeX to generate the basic Monitor library function documentation in the PDF file doc.pdf. |
programming_card | LaTeX source and PDF version of a convenient QNICE Assembler programming card (quick guide). |
File name | Description |
---|---|
best-practices.md | Best practices and programming conventions for assembly and C. |
constraints.txt | Known constraints of the QNICE-FPGA design: SD Cards and keyboards that are working, VGA monitor requirements, character encoding, languages, fonts, and standard C library. |
emumount.txt | Hints about creating and mounting FAT32 devices in the emulator. |
how-to-release.md | Checklist for making a new release. |
int-device.md | Description of how any interrupt capable device needs to be implemented. |
MIPS.md | Performance measurements and QNICE-FPGA performance characteristics. |
requirements.txt | Minimum requirements to work with QNICE-FPGA. |
vbcc.txt | Hints for improving performance while using the vbcc compiler system. |
-
Background info on the QNICE architecture and ISA can be found here. There is also an introductory presentation available.
-
It makes sense to walk through the whole main README.md of the repository including the "Getting Started" section, before reading on here.
-
If you want to get started on a specific hardware that QNICE-FPGA supports or learn more about porting, then have a look at hw/README.md.
-
The "Monitor" is QNICE-FPGA's operating system. It provides the user interface as well as library functions that can be used by Assembler and C programs. Have a look at the various examples in the folder
test_programs
to learn more about how to use library functions in your own programs using theSYSCALL
macro. hello.asm might be a good starting point. dist_kit/monitor.def contains the call table to all available library functions and here is a PDF file that contains a brief documentation of the Monitor's library functions. -
QNICE-FPGA uses Memory Mapped I/O (MMIO) to communicate with all hardware components. dist_kit/sysdef.asm contains the MMIO addresses of the hardware registers as well as constant definitions for convenient access.
-
QNICE-FPGA supports the concept of routable STDIN and STDOUT. All Monitor I/O functions as well as the C runtime are written to support this. Currently, serial in and keyboards are supported for STDIN and serial out and VGA are supported for STDOUT. Currently, STDIN and STDOUT can be only routed using hardware mechanisms such as switches and key combinations; you cannot route them using software.
The initial Nexys 4 DDR version of QNICE-FPGA supports 16 switches that are
directly linked with the "Switch Register" 0xFF00
(see also IO$SWITCH_REG
in the file dist_kit/sysdef.asm
). The rightmost
switch is Bit #0.
Switch Register | Value | Meaning |
---|---|---|
Bit #0 | 0 | STDIN = UART |
Bit #0 | 1 | STDIN = Keyboard |
Bit #1 | 0 | STDOUT = UART |
Bit #1 | 1 | STDOUT = VGA/HDMI out |
The below-mentioned RESTORE
key combinations of the MEGA65 are toggling
the bits #0 and #1 of the Switch Register.
On the Nexys 4 DDR board, the third switch (counted from the right) aka SW2
triggers bit #2 of the "Switch Register". There is no equivalent of this
key on the MEGA65. If bit #2 is 1
, then the CPU Debug Mode is activated.
When in CPU Debug Mode the 7-segment display of the Nexys 4 DDR board will show the
CPU address (program counter) when a HALT
command was executed. This
is very valuable when running a CPU test such as test_programs/cpu_test.asm
.
When cross-compiling software for the QNICE-FPGA, there are three ways to transfer it:
-
Put the
.out
file on a SD Card and load it using the Monitor's "File/Run" command: PressF
andR
and enter the file name or the full path including the file name of the.out
file. -
Use the Monitor's "Memory/Load" command: Route STDIN to serial in and connect to QNICE-FPGA via your terminal program (see hardware specific serial settings below). Use the keystrokes
M
and thenL
to enter Monitor's "Memory/Load" mode. Copy/Paste the content of the.out
file that you want to transfer into the terminal window of your host computer. PressCTRL+E
when done to return to the Monitor. Hint: The scriptassembler/asm
automatically copies the.out
file to the clipboard: On macOS usingpbcopy
and on Linux usingxclip
(if available). -
Use
qtransfer
: Loadqtransfer.out
on the QNICE-FPGA, e.g. by using the mechanism from above-mentioned step (2) or by loading it from the SD Card. If you copied the folderqbin
onto your SD Card then you can start it usingF
and thenR
and then enteringqbin/qtransfer.out
. The tool loads to addressFB00
so that it leaves plenty of space for the to-be-transferred software. IfFB00
is not overwritten by your running software (e.g. by the stack) then you can run it again when you want to transfer the next software usingC
thenR
and thenFB00
. As Monitor is not deleting RAM on reset, you can also use it after a reset of the machine.qtransfer
checks the data integrity using CRC16, so you should prefer it over theM
L
method described in step (2). It is also more convenient (once loaded) for VGA/keyboard users, because you do not need to switch STDIN back to serial for transferring data. On the host computer, runtools/qtransfer
to send the data.
For making sure that the whole QNICE-FPGA screen is actually visible on your VGA monitor, make sure to calibrate your monitor following these steps:
-
Run
qbin/vga_calibration.out
either directly from your SD Card or by using the software transfer mechanisms described above. -
The program is drawing a frame that consists of "X" characters, as this is the widest and highest char. The frame ranges from the lowest (x|y) coordinates to the highest ones. If you cannot see the full frame, either run your monitor's auto-calibration or calibrate manually.
The source code of the tool is in c/test_programs/vga_calibration.c.
-
The CPU Reset button works as expected.
-
STDIN: You can use serial in or an USB keyboard. Use the rightmost switch
SW0
to toggle:off
equals serial in andon
means keyboard. Have a look at constraints.txt to learn which keyboards are working. When switching between one STDIN to another STDIN you need to press a key one more time on the "old" STDIN after you switch, before the new STDIN starts working. -
STDOUT: You can use serial out or a VGA monitor. Use the second switch counted from right
SW1
to toggle:off
equals serial out andon
means VGA. -
Serial communication:
115,200 baud, 8-N-1, RTS/CTS ON
-
Debug mode: If switch
SW2
is on, then the value of the CPU's address lines is shown in real-time on the 7-segment-display. This means, that onHALT
you will see the program counter (PC) of theHALT
command. -
The SD Card slot is supported. Use FAT32 formatted cards and have a look at constraints.txt to learn which SD Cards are working. Use the Monitor's
F
command group to access the SD Card, e.g. useF
and thenD
to show the contents of the current directory. -
Not used/supported: Pushbuttons other than the CPU Reset button; ethernet connector; Pmod connectors; audio out
The MEGA65 features two SD card slots: One at the rear side of the case and one at the bottom of the case under a cover.
Currently, QNICE-FPGA only supports the one at the bottom under the cover.
-
Copy the QNICE @ MEGA65 core onto a FAT32 formatted SD Card.
-
Power-on the MEGA65 while you hold the
No Scroll
key. -
Choose an empty slot using
CTRL
plus the number of the empty slot. -
Choose a
.cor
file from your SD Card using the arrow keys andReturn
. -
The MEGA65 is storing the core in non-volatile memory so that from now on, you can directly boot the core.
-
Power-on the MEGA65 while you hold the
No Scroll
key. -
Choose the QNICE core with the arrow keys or by pressing it's number
ISE or Vivado bitstreams (.bit
files) need to be converted into
MEGA65 Cores (.cor
files) by using the tools/bit2core
tool. The bitstream
needs to be in a specific format as described here
to work as a Core on the MEGA65.
For the QNICE @ MEGA65 release at hand, we used the very first MEGA65 prototype computer, which has the board revision 2 (MEGA65R2). There where only a couple of those prototypes produced, so you will probably have a newer board revision: The first publicly available MEGA65 computer will be the MEGA65 DevKit with board revision 3 (MEGA65R3). And the final product for the market might have an even higher board revision.
Hardware | Release | Board | Description |
---|---|---|---|
Prototype | 2019 | R2 | First MEGA65 prototype that actually looks like a MEGA65. It uses the combination of an ADV7511 chip and a TPD12S016 companion chip to produce HDMI output. |
DevKit | 2020 (*) | R3 | Development computer; for the first time for a broader audience. Acrylic case. At the time of writing this, we learned from the MEGA team they might drop the ADV7511. |
MEGA65 V1 | 2021/22 (*) | ? | First release to the public |
(*) means: "estimated"
Currently, we only fully support the MEGA65R2 board. That means that HDMI
output only works there. On other boards, this release (even the binary .cor
file) should work out-of-the-box, too. But it will only generate VGA output
and no HDMI output.
MEGA65 supports HDMI output. The hardware in theory is capable of displaying different things on the VGA and HDMI output (e.g. dual-screen). For making things simple, we are just mirroring the 640x480 @ 60 Hz VGA output on HDMI. Just plug in your HDMI monitor and it should work. The HDMI output is naturally much clearer and sharper than the VGA output.
For fine-tuning the HDMI output on your monitor, you can use the registers
VGA$HDMI_H_MIN
, VGA$HDMI_H_MAX
and VGA$HDMI_V_MAX
. There is a test
program available where you can interactively play with these registers:
c/test_programs/hdmi_de.c.
MEGA65 comes with 8MB of HyperRAM which extends the 32 kWords of free RAM that QNICE-FPGA has built-in by default. Optionally, another 8MB can be added. We only tested and worked with the built-in 8MB of the MEGA65, but theoretically, the system should also be able to work with 16MB.
HyperRAM is slower than the built-in RAM and QNICE-FPGA currently does not
have a memory controller, paging, DMA or similar mechanism implemented, yet.
Therefore HyperRAM can only be accessed via registers:
IO$M65HRAM_LO
, IO$M65HRAM_HI
, IO$M65HRAM_DATA8
and IO$M65HRAM_DATA16
.
Have a look at test_programs/MEGA65/hyperram.asm and at c/test_programs/hyperramtest.c to learn more. There is also a work-in-progress demo that is meant to load a large ASCII animation ("video clip") into HyperRAM and then display it on the screen: c/test_programs/the-matrix.c
Key Combination | Meaning |
---|---|
RESTORE + 1 | Toggle STDIN: MEGA65 keyboard and UART |
RESTORE + 2 | Toggle STDOUT: MEGA65 VGA and UART |
MEGA + UP | Page Up |
MEGA + DOWN | Page Down |
MEGA + LEFT | POS1 |
MEGA + RIGHT | END |
MEGA + * | ^ (power symbol) |
MEGA + 0 | ° (degree symbol) |
MEGA + e | € (Euro symbol) |
MEGA + a | German Umlaut ä (+SHIFT: Ä) |
MEGA + o | German Umlaut ö (+SHIFT: Ö) |
MEGA + u | German Umlaut ü (+SHIFT: Ü) |
MEGA + s | German Umlaut ß |
The MEGA65 does not come with a serial interface by default. The DevKit version is supposed to have the JTAG programmer (see description below) built-in. For other versions you need to purchase and install the programmer.
-
You need to use the
TE-0790
JTAG programmer as described in the chapter "Flashing the FPGAs and CPLDs in the MEGA65" of the MEGA65 User's Guide. -
On some operating systems you might need to install FTDI drivers. On a Mac it works without additional drivers.
-
The MEGA65 will show up as "Digilent USB Device" in your OS and/or terminal program.
-
Choose "Port 2" of this device and set your terminal program to
115,200 baud, 8-N-1 (no CTS/RTS)
. Connect to the MEGA65.
Press the RESTORE
key together with the 1
to toggle STDIN between the
MEGA65 keyboard and the UART. Press RESTORE
plus 2
to toggle STDOUT
between VGA and the UART.
Caveat: After switching STDIN to another input, you still need to press one more key on the old input, before the switch to the new input is finally active.
The MEGA65 is able to load .cor
files directly from SD card, so that MEGA65
users do not need a Xilinx toolchain to change the bitstrem ("Core") that they
are running.
Core files can be generated from compatible bitstreams using tools/bit2core
.
"Compatible" means, that the following settings are used in the Vivado xdc
file and/or that these properties are configured in the ISE project within
the IDE.
## Configuration and Bitstream properties
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 66 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR YES [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]