• Stars
    star
    1,268
  • Rank 37,109 (Top 0.8 %)
  • Language Verilog
  • Created about 8 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A small, light weight, RISC CPU soft core

The Zip CPU

The Zip CPU is a small, light-weight, RISC CPU. Specific design goals include:

  • 32-bit. All registers, addresses, and instructions are 32-bits in length.

  • A RISC CPU. Instructions nominally complete in one cycle each, with exceptions for multiplies, divides, memory accesses, and (eventually) floating point instructions.

    (Note that the ZipCPU is not a RISC-V CPU, nor does it copy from any other instruction set but its own.)

  • A load/store architecture. Only load and store instructions may access memory.

  • Includes Wishbone, AXI4-Lite, and AXI4 memory options.

  • A (minimally) Von-Neumann architecture

    The Wishbone wrappers share buses for instructions and data, the AXI4-Lite and AXI4 wrappers have separate bus interfaces for each. The address space itself, however, needs to be common.

  • A pipelined architecture, having stages for prefetch, decode, read-operand(s), a combined stage containing the ALU, memory, divide, and floating point units, and then the final write-back stage.

  • A two mode machine: supervisor and user, with each mode having a different access level.

  • Completely open source, licensed under the GPLv3.

Unique features and characteristics

  • Only 29 instructions are currently implemented. Six additional instructions have been reserved for a floating point unit, but such a unit has yet to be implemented.

  • (Almost) all instructions can be executed conditionally. Exceptions include load immediate (LDI), the debug break instruction (BREAK), the bus lock (LOCK) and simulation instructions (SIM), and the no-operation instruction (NOOP). The assembler will quietly turn a conditional load immediate into a two-instruction equivalent (BREV, LDILO).

  • The CPU makes heavy use of pipelining wherever and whenever it can. Hence, when using a pipelined memory core, loading two vaues in a row may cost only one clock more than just loading the one value.

  • The CPU has no interrupt vectors, but rather two register sets. On any interrupt, the CPU just switches from the user register set to the supervisor register set. This simplifies interrupt handling, since the CPU automatically saves, preserves, and restores the supervisor's context between enabling interrupts and receiving the next interrupt. An optional interrupt peripheral may be used to combine multiple external interrupts into a single interrupt line.

Getting Started

If you'd like to get started with the ZipCPU, you might wish to know that this repository contains the CPU, its documentation, and the toolchain. The CPU implementation found here, though, is just that: a CPU. This implementation requires a bus with peripherals hanging off of it, things such as RAM, flash (ROM), serial port, etc. This is just where I keep the CPU apart from any necessary peripherals.

So, if you want to try out the CPU, feel free to download and build this repository (use git-clone with a depth of 1--there's a lot of stuff in the git repo that you don't necessarily need). You'll need it for the binutils, GCC, and newlib support provided by it.

Once you've built these tools, then I'd suggest you look into the ZBasic repository. That repository places the CPU in an environment with block RAM, QSPI flash, and SD-card (SPI protocol) access. From that repository, you can either tweak the distro (main.v, regdefs.h, board.h, board.ld) to add the peripherals you want to use the CPU with, or you can use AutoFPGA to adjust your RAM size, add or remove peripherals and so forth while maintaining (creating, really) all of these files for you.

The sim/ subdirectory also contains a version of the ZipCPU in a usable environment for simulation purposes. This includes the CPU, possibly more CPU's for a multiprocessor environment, bus interconnect, memory, a simulated serial port, and a couple more peripherals.

If you aren't interested in simulating the CPU, there is an assembly level debugger that you can use to stop and step the CPU, as well as an integrated wishbone scope that you can use to get traces from within the design while it is running.

Need help?

If you'd like to use the ZipCPU, and don't know where to begin, feel free to find me on IRC as ZipCPU. I've created a #zipcpu channel on several IRC servers that I tend to inhabit. If you get stuck, feel free to drop by and ask for help. You can also drop by just to say hi. Either way, please introduce yourself and give me some time to respond.

Current Status

You can also read about the ZipCPU via several blog articles posted at zipcpu.com! Articles you might find valuable include:

Not yet integrated

  • The MMU that was written for the ZipCPU now needs to be rewritten in order to work in the new ZipCore context. My plan is to place the MMU between the ZipCore and the various bus aware wrappers, providing a similar interface to the one offered by the ZipCore. That way, caches will be based on physical addressing--solving one of the bigger problems I had when using the MMU.

  • FATFS support now exists for the SDCard, it's just not (yet) integrated into the newlib C-library.

  • The ZipOS would greatly speed up and improve the bare bones newlib library--primarily by providing "O/S" level interrupt support when using the library. This integration has not (yet) been accomplished.

    On the other hand, if the MMU is available, I might rather just create a Linux distribution.

Commercial Opportunities

The GPLv3 license should be sufficient for most (all) academic and hobby purposes, and certainly for all simulation based purposes. If you find, however, that the GPLv3 license is insufficient for your needs, other licenses can be purchased from Gisselquist Technology, LLC.

This applies to all but the toolchain, for which GPLv3 should work for all purposes. (Besides, I don't own the licenses for Binutils, GCC, or newlib.)

More Repositories

1

wb2axip

Bus bridges and other odds and ends
Verilog
469
star
2

wbuart32

A simple, basic, formally verified UART controller
Verilog
272
star
3

dblclockfft

A configurable C++ generator of pipelined Verilog FFT cores
C++
213
star
4

sdspi

SD-Card controller, using either SPI, SDIO, or eMMC interfaces
Verilog
185
star
5

autofpga

A utility for Composing FPGA designs from Peripherals
C++
167
star
6

vgasim

A Video display simulator
Verilog
154
star
7

eth10g

10Gb Ethernet Switch
C
147
star
8

dspfilters

A collection of demonstration digital filters
Verilog
138
star
9

openarty

An Open Source configuration of the Arty platform
Verilog
119
star
10

dpll

A collection of phase locked loop (PLL) related projects
Verilog
95
star
11

cordic

A series of CORDIC related projects
C++
85
star
12

qspiflash

A set of Wishbone Controlled SPI Flash Controllers
Verilog
72
star
13

wbscope

A wishbone controlled scope for FPGA's
Verilog
72
star
14

sdr

A basic Soft(Gate)ware Defined Radio architecture
Verilog
71
star
15

interpolation

Digital Interpolation Techniques Applied to Digital Signal Processing
Verilog
53
star
16

zbasic

A bare bones, basic, ZipCPU system designed for both testing and quick integration into new systems
Verilog
42
star
17

wbi2c

Wishbone controlled I2C controllers
Verilog
40
star
18

fftdemo

A demonstration showing how several components can be compsed to build a simulated spectrogram
Verilog
39
star
19

s6soc

CMod-S6 SoC
Verilog
35
star
20

dbgbus

A collection of debugging busses developed and presented at zipcpu.com
Verilog
33
star
21

rtcclock

A Real Time Clock core for FPGA's
Verilog
22
star
22

arrowzip

A ZipCPU based demonstration of the MAX1000 FPGA board
Verilog
21
star
23

wbfmtx

A wishbone controlled FM transmitter hack
Verilog
21
star
24

icozip

A ZipCPU demonstration port for the icoboard
Verilog
17
star
25

xulalx25soc

A System on a Chip Implementation for the XuLA2-LX25 board
Verilog
16
star
26

wbpwmaudio

A wishbone controlled PWM (audio) controller
Verilog
15
star
27

videozip

A ZipCPU SoC for the Nexys Video board supporting video functionality
Verilog
14
star
28

wbspi

A collection of SPI related cores
Verilog
14
star
29

website

The ZipCPU blog
HTML
14
star
30

wbpmic

Wishbone controller for a MEMs microphone
Verilog
14
star
31

qoiimg

Quite OK image compression Verilog implementation
Verilog
14
star
32

fwmpy

A multiply core generator
C++
13
star
33

zipversa

A Versa Board implementation using the AutoFPGA/ZipCPU infrastructure
Verilog
13
star
34

wbhyperram

A cross platform, formally verified, open source, hyperRAM controller with simulator
11
star
35

axidmacheck

AXI DMA Check: A utility to measure DMA speeds in simulation
Verilog
10
star
36

wbicapetwo

Wishbone to ICAPE interface conversion
Verilog
8
star
37

tinyzip

A ZipCPU based demonstration for the TinyFPGA BX board
Verilog
8
star
38

wbsata

Wishbone SATA Controller
Verilog
8
star
39

tttt

A 4x4x4 Tic-Tac-Toe game suitable for porting to embedded hardware platforms
C
8
star
40

autofpga-demo

A demonstration of how AutoFPGA can compose a design from simple components
Verilog
8
star
41

debouncer

Digital logic necessary to debounce buttons
Verilog
8
star
42

kimos

Enclustra Mercury demonstration project
C
8
star
43

openz7

OpenZ7, an open source Zynq demo based on the Arty Z7-20
Verilog
6
star
44

zipstormmx

ZipSTORM-MX, an iCE40 ZipCPU demonstration project
Verilog
5
star
45

cputest-harness

A simulation test harness, containing serial port, QSPI flash, and an output done I/O--just provide the CPU
C++
4
star
46

xtimesheet

A very simple timesheet tracking program using text files and a GTK/Glade interface
C++
1
star