|
|
- # gatemate_experiments
-
- Ongoing experiments with the Cologne Chip's GateMate FPGA architecture. All experiments are done with teh GateMate FPGA Starter (Eval) Kit.
-
- *HINT:*
-
- This project uses external projects (a *neorv32* fork & *cryptocores*), which are redistributed as submodules. To get & nitialize the submodule, please use the `--recursive` option when cloning this repository. Use `git submodule update --recursive` to update the submodule if you already chaked out the main repository.
-
- ## Designs
-
- ### blink
-
- Simple design which should display a blinking LED waving from LED1-LED8 of the GateMate FPGA Starter Kit. It uses *CC_PLL* & *CC_CFG_END* primitives of the GateMate FPGA.
-
- ### neorv32_aes
-
- Try to implement a neorv32 processor with a AES-CTR custom function on the GateMate FPGA. However, it only works in simulation at the moment.
-
- ### uart_aes
-
- AES-CTR unit which can be accessed through UART. It uses *CC_PLL* & *CC_CFG_END* primitives of the GateMate FPGA. It contains 5 registers storing values of one byte each. The first received byte on the UART contains command & address:
-
- * `7 ` reserved
- * `6:4` register address
- * `3:0` command (`0x0` read, `0x1` write)
-
- In case of a write command, the payload has to follow with the next byte. In case of a read command, the value of the addressed register is returned on the axis out port.
-
- Register map:
-
- 0. `ctrl ` 1 byte (bit meaning: `0` reset, `1` CTR start, `2` AES start `3` AES finished)
- 1. `key ` 16 byte
- 2. `nonce` 12 byte
- 3. `din ` 16 byte
- 4. `dout ` 16 byte
-
- Content of registers bigger than one byte can be accessed by sending read/write commands for each of the bytes.
-
- Here is a simple example:
-
- First fill the key register with ascending bytes.
-
- ```
- 11 01 11 23 11 45 11 67 11 89 11 AB 11 CD 11 EF 11 01 11 23 11 45 11 67 11 89 11 AB 11 CD 11 EF
- ```
-
- Next fill the nonce register with ascending bytes.
-
- ```
- 21 01 21 23 21 45 21 67 21 89 21 AB 21 CD 21 EF 21 01 21 23 21 45 21 67
- ```
-
- Now fill the din register with ascending bytes.
-
- ```
- 31 01 31 23 31 45 31 67 31 89 31 AB 31 CD 31 EF 31 01 31 23 31 45 31 67 31 89 31 AB 31 CD 31 EF
- ```
-
- Finally, set bit 1 & 2 in control register to start a new AES-CTR operation.
-
- ```
- 01 06
- ```
-
- Check bit 3 of control register to know when AES-CTR calculation is finished. All other bits of control register are reset when AES-CTR calculation is finished.
-
- `00` returns `80`
-
- Now you can read the encrypted data from the dout register.
-
- ```
- 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
- ```
-
- returns (hopefully)
-
- ```
- A0 55 A0 62 BC DD C3 4C 33 FE 9F A6 0C FB 6F 2D
- ```
-
- You can start another AES-CTR round without restarting the counter (nonce register isn't used) ommiting bit 1 of the control register.
-
- ```
- 01 04
- ```
-
- Control registers bit 0 is used to reset registers 0 - 3.
-
- ```
- 01 01
- ```
-
- ### uart_loop
-
- Simple UART loop with UART RX & TX units and FIFO buffer between. It uses *CC_PLL* & *CC_CFG_END* primitives of the GateMate FPGA. With fifo depth >= 18 Yosys is infering *CC_BRAM_20K* instead of registers.
-
- Beware: The simulation model of *CC_BRAM_20K* seems to be incorrect, so better set fifo depth < 18 or use yosys option `-nobram` when synthesizing the model for post-synthesis & post-implementation simulation.
-
- ### uart_reg
-
- Register file which can be accessed through UART. It uses *CC_PLL* & *CC_CFG_END* primitives of the GateMate FPGA. It contains 8 registers storing values of one byte each. The first received byte on the axis in port contains command & address:
-
- * `7 ` reserved
- * `6:4` register address
- * `3:0` command (`0x0` read, `0x1` write)
-
- In case of a write command, the payload has to follow with the next byte. In case of a read command, the value of the addressed register is returned on the axis out port. Register at address 0 is special. It contains the version and is read-only. Writes to that register are ignored.
-
- ### uart_trng
-
- An implementation of a TRNG which allows to read random data from the FPGA via UART. Inclusive a software tool for easy access. Random generation is based on a fibonacci ring oscillator (FiRo) with toggle flip-flop and von Neumann post-processing.
-
- ## Further Ressources
-
- * [GateMate FPGA](https://www.colognechip.com/programmable-logic/gatemate)
- * [GateMate FPGA Eval Board](https://www.colognechip.com/programmable-logic/gatemate-evaluation-board)
- * [GHDL VHDL Simulation & Synthesis](https://github.com/ghdl/ghdl)
- * [Yosys Synthesis Suite](https://github.com/YosysHQ/yosys)
|