RealtimeIO for LinuxCNC based on an FPGA
- no Soft-Core
- logic only
- no jitter
- fast and small
- communication via SPI (with Raspberry PI 4) or Ethernet
- generated verilog-code / setup via json files (free pin-selection)
- using free FPGA-Toolchain
- runs on many FPGA's (like ICE40, ECP5, MAX10, Artix7, Gwin, CycloneIV, ...)
- supports Open and Closed-Loop
- multiple and mixed joint types (like Stepper, DC-Servo, RC-Servo)
BTW: there is a rewrite of RIO that is slowly getting ready for testing:
https://github.com/multigcs/riocore
https://github.com/multigcs/riogui
Name | Description |
---|---|
TangNano9K | Tang Nano 9K with 5axis-BOB |
Tango-Board | Tango-Board with Tang Nano 9K |
Olimex-ICE40HX8K-EVB | Olimex ICE40HX8K-EVB with 5axis-BOB |
TinyFPGA-BX | TinyFPGA-BX with 5axis-BOB |
ICEBreakerV1.0e | ICEBreakerV1.0e tests |
Lattice-iCE40HX8K | Lattice iCE40HX8K with custom bob |
Colorlight5A-75E | Colorlight5A-75E tests |
Alhambra-II | Alhambra II FPGA board with 3 Axis SPI |
Altera10M08Eval | Altera10M08Eval with Arduino CNC-Shield v3 |
Arty-a7-35t | Arty-a7-35t with Arduino CNC-Shield v3 |
... | and many more |
Type | Name | Description |
---|---|---|
joint | pwmdir | PWM Joint Output with DIR-Pin |
joint | rcservo | RCSERVO Joint Output |
joint | stepper | Stepper Joint Output with STEP/DIR/ENABLE(optional) pins |
vin | frequency | Variable-Input for frequency measurement |
vin | pulsecounter | Variable-Input for pulse counting with up to 3 pins (all optional) |
vin | pwmcounter | Variable-Input for pulse width measurement |
vin | quadencoder | Variable-Input for Quad-Encoder (int32_t) |
vin | quadencoderz | Variable-Input for Quad-Encoder with Z-Pin (int32_t) |
vin | sonar | Variable-Input for distance measurement via ultrasonic sonar sensor (HC-SR04) |
vin | lm75 | Variable-Input for temperature measurement via LM75 sensor |
vin | ds18b20 | Variable-Input for temperature measurement via DS18B20 sensor |
vout | frequency | Variable-Output for frequencys |
vout | pwm | Variable-Output for PWM-Signals with optional DIR pin |
vout | sinepwm | Variable-Output for Sine-Waves via PWM-Signal |
vout | spipoti | Variable-Output using digital poti with SPI Interface (like MCP413X/415X/423X/425X) |
vout | udpoti | Variable-Output using digital poti with UpDown/Incr. Interface (like X9C104) |
din | bit | Digital Input Pin (1bit) |
dout | bit | Digital Output Pin (1bit) |
expansion | shiftreg | Expansion to add I/O's via shiftregister's |
expansion | shiftreg | Expansion to add I/O's via pcf8574 over I2C |
interface | spislave | communication interface ( RPI(Master) <-SPI-> FPGA(Slave) ) |
... | ... | and many more |
https://github.com/YosysHQ/oss-cad-suite-build
for the TangNano9K, you can also using the Gowin-IDE or Gowin-Shell (it's faster)
-
Interface: SPI
-
Chipselect: CE_1
-
do not reuse the chipselect pin of your SPI-Flash !!!
you can also use UDP2SPI bridge to communicate via Ethernet (UDP)
if you want to test the connection without LinuxCNC, you can use the python test-tool:
python3 Output/BOARD_NAME/Gateware/qt_spitest.py [IP]
at the moment, you need at least configure one item of each of the following sections: vin, vout, din, dout, joints
you can select a config via make argument:
make CONFIG=configs/TinyFPGA-BX/config.json build
-
buildtool.py plugins: python scripts to generates the verilog files from a configuration
-
configs: here are the config files for a specific setup (Target-FPGA / Pins)
-
Output: the generated files per config
Thanks to the https://github.com/scottalford75/Remora Project, i'm using a modified version of it's Linux-Component
And many thanks for Contributions to: