The Arduino MKR Vidor 4000 is one of the most unusual Arduino boards ever released because it combines a conventional microcontroller with a real FPGA.
The board contains:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
SAMD21G18A → 48 MHz Cortex-M0+ → runs Arduino sketches Intel Cyclone 10CL016 → FPGA fabric → custom digital hardware → parallel processing → high-speed I/O → video and DSP functions NINA-W102 → Wi-Fi / Bluetooth 8 MB SDRAM → FPGA-oriented external memory |
The key idea is that the FPGA is not simply a faster processor.
It allows you to build custom digital hardware that runs in parallel with the SAMD21.
Current Product Status
Arduino now marks the:
|
1 2 3 4 |
MKR Vidor 4000 |
as:
|
1 2 3 4 |
End of Life |
That does not make the board useless.
It remains interesting for:
- existing installations;
- FPGA learning;
- video experiments;
- custom digital interfaces;
- high-speed signal processing.
But new production designs should consider long-term availability.
FPGA Hardware Resources
The Cyclone 10CL016 provides approximately:
|
1 2 3 4 5 6 |
16K logic elements 504 kB embedded RAM 56 × 18×18 hardware multipliers |
plus:
|
1 2 3 4 5 |
8 MB external SDRAM 2 MB QSPI Flash |
for FPGA applications.
Arduino states that around:
|
1 2 3 4 |
1 MB |
of the FPGA QSPI Flash is allocated for user FPGA applications.
FPGA Clocking
The board provides a base:
|
1 2 3 4 |
48 MHz |
clock to the FPGA system.
The FPGA can use internal PLLs to generate higher-frequency clocks, and Arduino documents FPGA operation up to approximately:
|
1 2 3 4 |
200 MHz |
depending on the design.
High-Speed I/O
Arduino states that FPGA pins can toggle at:
|
1 2 3 4 |
over 150 MHz |
under suitable timing and configuration.
That makes the FPGA useful for tasks that are awkward to implement with:
|
1 2 3 4 5 6 |
digitalWrite() interrupts software bit-banging |
Why an FPGA Is Different from a Microcontroller
A microcontroller normally executes instructions sequentially:
|
1 2 3 4 5 6 7 |
read input process value update output repeat |
An FPGA can implement multiple hardware blocks simultaneously:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PWM generator + UART + quadrature decoder + SPI engine + video pipeline + frequency counter |
all operating in parallel.
Two Levels of FPGA Development
There are two broad ways to use the FPGA on Vidor.
1. Arduino Libraries with Prebuilt FPGA Images
Arduino libraries can load a prebuilt FPGA configuration and expose functions to the SAMD21 sketch.
This is the easiest path.
The sketch behaves like:
|
1 2 3 4 5 6 7 |
SAMD21 Arduino code → library call → command to FPGA → FPGA hardware function |
2. Custom Quartus FPGA Development
The advanced path uses:
|
1 2 3 4 |
Intel Quartus Prime |
to design your own FPGA logic.
This means working with:
- Verilog or VHDL;
- block diagrams;
- pin constraints;
- clock constraints;
- synthesis;
- place and route;
- timing analysis;
- bitstream generation.
Arduino’s Historical Vidor FPGA Toolchain
Arduino’s Vidor FPGA repositories were built around:
|
1 2 3 4 |
Quartus Prime 18.x |
with project templates and helper scripts.
The archived Vidor repositories include examples for:
- graphics;
- peripherals;
- mailbox/RPC communication;
- bare custom FPGA projects.
The Official FPGA Repository Is Archived
The:
|
1 2 3 4 |
vidor-libraries/VidorFPGA |
repository is now archived and read-only.
This fits the board’s current EOL status.
For existing projects, that repository remains valuable documentation of the original FPGA workflow.
Typical Custom FPGA Workflow
A simplified workflow is:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
1. Create or open Quartus project 2. Add Verilog/VHDL logic 3. Apply Vidor pin constraints 4. Define clocks 5. Compile / synthesise 6. Check timing 7. Generate FPGA output file 8. Convert/package bitstream for Arduino loading 9. Include bitstream with Arduino library/sketch 10. Load FPGA from SAMD21 at runtime |
The FPGA Is Normally Configured by the SAMD21
Vidor’s normal Arduino-oriented architecture uses the SAMD21 to load the FPGA image.
The FPGA does not simply run an independent Arduino sketch.
A typical startup becomes:
|
1 2 3 4 5 6 7 8 9 |
power on → SAMD21 bootloader → Arduino sketch starts → FPGA bitstream loaded → FPGA logic starts → SAMD21 communicates with FPGA |
Bitstream Packaging
Quartus generates FPGA configuration data, but Arduino’s original Vidor workflow required additional processing before the image could be embedded into an Arduino project.
Historical tools converted the Quartus output into a format that could be included as something conceptually like:
|
1 2 3 4 |
FPGA_Bitstream.h |
and transferred to the FPGA by the SAMD21.
Why the Bitstream Is Not Just an Arduino Binary
The SAMD21 and Cyclone FPGA use completely different programming models.
The SAMD21 receives:
|
1 2 3 4 |
compiled ARM firmware |
while the FPGA receives:
|
1 2 3 4 |
configuration bitstream |
describing the digital hardware structure.
SAMD21-to-FPGA Communication
Once custom logic is running, you need a way for the SAMD21 sketch to exchange data with it.
Possible approaches include:
- memory-mapped register schemes;
- mailbox/RPC interfaces;
- JTAG-based interfaces;
- SPI-like custom links;
- shared GPIO/control registers.
This interface must be designed deliberately.
Prebuilt Libraries Hide the Communication Layer
When using an Arduino-provided Vidor library, it may appear that your sketch simply calls:
|
1 2 3 4 |
FPGA.someFunction(); |
and the hardware reacts.
Behind that call is a communication protocol between the SAMD21 and FPGA.
When creating your own bitstream, you need to recreate or replace that communication mechanism.
Mailbox / RPC Template
The archived Vidor bitstream projects include a:
|
1 2 3 4 |
template_mbox |
project designed around Arduino’s soft-core mailbox/RPC-style mechanism.
This is useful when the SAMD21 needs to:
- write control registers;
- read counters;
- configure FPGA blocks;
- exchange status information.
Bare FPGA Template
The:
|
1 2 3 4 |
template_bare |
project is intended for users who want to build their own communication architecture.
That gives maximum freedom, but also means the application must define how the SAMD21 and FPGA exchange commands and data.
Shared MKR Pins
Arduino’s current datasheet states that all normal board header pins are driven/routed so both the:
|
1 2 3 4 5 6 |
SAMD21 and FPGA |
can access the MKR-format signals.
This is powerful but also dangerous if both devices drive the same line.
Shared-Pin Ownership Rule
Use this rule:
|
1 2 3 4 5 |
one output owner per physical pin |
For example:
|
1 2 3 4 5 |
FPGA drives D6 → SAMD21 must not also drive D6 |
Configure the unused side as:
|
1 2 3 4 5 6 |
input or high impedance |
where appropriate.
Electrical Contention
If the SAMD21 outputs HIGH while the FPGA outputs LOW on the same net:
|
1 2 3 4 5 6 |
HIGH vs LOW |
the devices fight electrically.
This can cause:
- excess current;
- incorrect logic;
- overheating;
- possible hardware damage.
3.3 V Logic
The Vidor board is a:
|
1 2 3 4 |
3.3 V |
logic system.
Do not connect 5 V signals directly to FPGA or SAMD21 I/O unless the exact circuit is explicitly verified.
FPGA I/O Drive Strength
The official datasheet lists FPGA I/O current options around:
|
1 2 3 4 5 6 |
4 mA or 8 mA |
depending on I/O standard and configuration.
This is logic-level drive, not load power.
Use external buffers or drivers for:
- relays;
- motors;
- large LED arrays;
- long cables;
- high-current loads.
FPGA Soft Peripherals
One of the board’s most interesting capabilities is creating extra peripherals in FPGA logic.
Arduino documents configurations with up to:
|
1 2 3 4 5 6 |
7 UARTs 7 SPI controllers 7 I2C controllers |
depending on FPGA configuration.
This Is Not a Fixed Hardware Count
The Cyclone FPGA does not contain seven permanently wired UART blocks.
Instead:
|
1 2 3 4 5 |
logic elements → synthesised into UARTs |
according to the loaded design.
Using more peripherals consumes FPGA logic and routing resources.
Custom PWM
FPGA PWM can be far more flexible than SAMD21 PWM.
You can create:
- many independent channels;
- custom frequencies;
- very high resolution;
- phase-aligned channels;
- centre-aligned PWM;
- precise dead-time generation.
High-Speed Counter Example
A frequency counter implemented in SAMD21 software might need:
- interrupts;
- timer capture;
- careful latency management.
An FPGA implementation can simply count incoming edges in hardware:
|
1 2 3 4 5 6 7 |
input clock → counter logic → register → SAMD21 reads result |
with deterministic timing.
Quadrature Encoder Example
The FPGA can decode multiple encoder channels simultaneously:
|
1 2 3 4 5 6 7 8 9 |
encoder A/B → FPGA quadrature decoder → position counter → velocity estimator → register interface → SAMD21 |
This removes interrupt load from the Cortex-M0+.
Micro HDMI Output
The Vidor includes:
|
1 2 3 4 |
Micro HDMI |
connected to the FPGA subsystem.
This is one of the clearest demonstrations of why FPGA hardware matters.
Video timing requires precise parallel generation of:
- pixel clocks;
- horizontal timing;
- vertical timing;
- pixel data;
- high-speed serialised signals.
Graphics FPGA Project
The archived Vidor bitstream repository includes a:
|
1 2 3 4 |
MKRVIDOR4000_graphics |
project corresponding to the Vidor graphics functionality.
This demonstrates how the FPGA can generate video while the SAMD21 sends higher-level drawing commands.
8 MB SDRAM for Video
Vidor includes:
|
1 2 3 4 |
8 MB external SDRAM |
to support FPGA workloads such as:
- framebuffers;
- image buffers;
- video processing;
- audio buffers;
- large streaming pipelines.
This memory is not normal SAMD21 RAM.
Why 8 MB Matters
For example, an:
|
1 2 3 4 5 |
800 × 600 16-bit RGB framebuffer |
requires approximately:
|
1 2 3 4 5 |
800 × 600 × 2 = 960,000 bytes |
which is far larger than the SAMD21’s:
|
1 2 3 4 |
32 KB SRAM |
but practical inside the FPGA SDRAM subsystem.
MIPI Camera Connector
The board also includes a:
|
1 2 3 4 |
MIPI camera connector |
connected to the FPGA.
This enables architectures such as:
|
1 2 3 4 5 6 7 8 |
MIPI camera → FPGA capture → SDRAM → FPGA image processing → Micro HDMI |
Camera Workloads Are Naturally Parallel
Image pipelines often involve operations such as:
- pixel capture;
- colour conversion;
- thresholding;
- filtering;
- edge detection;
- scaling;
- framebuffer writing.
FPGA logic can pipeline these operations so different pixels are processed simultaneously at different stages.
QR-Code Demonstrations
Arduino historically demonstrated Vidor camera/FPGA use for:
|
1 2 3 4 |
QR-code processing |
which is a good example of:
|
1 2 3 4 5 6 7 8 |
camera input + FPGA processing + SAMD21 application logic |
Mini PCIe-Form-Factor Connector
Vidor also exposes:
|
1 2 3 4 |
25 programmable FPGA pins |
on a Mini PCI Express-style connector.
This adds a large amount of high-density I/O beyond the standard MKR header.
It Is Not Automatically PCI Express
The connector uses the mechanical Mini PCIe format.
That does not mean:
|
1 2 3 4 |
PCIe protocol |
is automatically implemented.
Any custom high-speed protocol still requires suitable FPGA logic and electrical compatibility.
Timing Constraints Matter
A custom FPGA design is not complete just because it synthesises successfully.
You must define and check:
- clock frequency;
- input timing;
- output timing;
- false paths;
- clock-domain crossings;
- setup/hold timing.
Timing Closure
Quartus timing analysis determines whether the design can reliably run at the requested clock frequency.
If the report says a 200 MHz path fails timing, the design is not guaranteed to operate correctly at 200 MHz simply because simulation looks correct.
Clock-Domain Crossings
A design may have:
|
1 2 3 4 5 6 7 |
48 MHz SAMD21-related clock 100 MHz FPGA processing clock pixel clock camera clock |
Signals crossing between those domains need:
- synchronisers;
- FIFOs;
- handshake logic;
- proper CDC design.
Metastability
An asynchronous external input should not normally be fed straight into arbitrary FPGA logic.
For single-bit signals, use synchroniser flip-flops.
For multi-bit data, use an appropriate:
- FIFO;
- strobe protocol;
- Gray-code counter;
- handshake scheme.
Simulation Before Hardware
FPGA bugs can be difficult to diagnose with:
|
1 2 3 4 |
Serial.println() |
alone.
A better workflow includes:
- testbench simulation;
- known input vectors;
- timing checks;
- internal logic analyser where available;
- small incremental hardware tests.
SignalTap
Intel Quartus provides:
|
1 2 3 4 |
SignalTap |
for internal logic analysis on supported FPGA workflows.
It can capture internal FPGA signals without routing every debug signal to external pins.
JTAG Development
The Vidor FPGA can also be accessed through JTAG-oriented workflows.
Arduino’s archived documentation warns that direct FPGA JTAG access can conflict with the SAMD21 if both attempt to control the FPGA interface.
Keep the SAMD21 in an appropriate state when using an external JTAG programmer.
Start with a Minimal Custom Design
A sensible first custom FPGA project is:
|
1 2 3 4 5 6 |
input pin → register → output pin |
or:
|
1 2 3 4 5 |
counter → LEDs / readable register |
before attempting:
- HDMI;
- camera capture;
- SDRAM controller changes;
- complex multi-clock DSP.
Example FPGA Counter Architecture
|
1 2 3 4 5 6 7 8 9 10 |
48 MHz FPGA clock → 32-bit counter → divide / compare → toggle output SAMD21 → optionally reads counter register |
This simple example demonstrates the main FPGA advantage:
|
1 2 3 4 5 |
hardware continues running independently of Arduino loop() |
Example Multi-UART Architecture
An industrial interface could implement:
|
1 2 3 4 5 6 7 8 9 10 |
UART 1 UART 2 UART 3 UART 4 → FPGA FIFOs → shared register interface → SAMD21 |
rather than trying to software-emulate multiple serial ports on a 48 MHz Cortex-M0+.
Example Encoder + PWM Controller
A motor-control support subsystem could contain:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
quadrature decoder + position counter + velocity timer + high-resolution PWM + fault inputs |
inside the FPGA.
The SAMD21 then handles:
- configuration;
- high-level state machine;
- USB;
- Wi-Fi;
- user interface.
Keep the FPGA for Deterministic Hardware Tasks
A useful division of labour is:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
FPGA → precise timing → parallel logic → high-speed I/O → video → custom buses SAMD21 → application logic → libraries → USB → Wi-Fi control → user interface |
Do Not Put Everything in the FPGA
Tasks such as:
- JSON parsing;
- HTTP;
- Wi-Fi configuration;
- menu logic;
- text processing;
are much easier on the SAMD21 or another processor.
Use FPGA resources where hardware parallelism gives a real advantage.
Resource Usage Matters
Every custom block consumes:
- logic elements;
- registers;
- embedded RAM;
- DSP blocks;
- routing;
- clock resources.
Quartus reports show how much of the Cyclone 10 is used.
FPGA DSP Blocks
The:
|
1 2 3 4 |
56 hardware 18×18 multipliers |
are valuable for:
- FIR filters;
- audio processing;
- image filters;
- matrix operations;
- control algorithms.
Using DSP blocks avoids implementing large multipliers from general-purpose logic elements.
FPGA Embedded RAM
The:
|
1 2 3 4 |
504 kB embedded RAM |
is useful for:
- FIFOs;
- lookup tables;
- line buffers;
- packet buffers;
- small frame regions.
Common Mistake 1: Thinking FPGA Code Is Arduino C++
Custom FPGA logic is normally written in:
|
1 2 3 4 5 6 |
Verilog or VHDL |
and synthesised into hardware.
It does not execute line-by-line like a sketch.
Common Mistake 2: Treating 8 MB SDRAM as SAMD21 RAM
The SAMD21 still has only:
|
1 2 3 4 |
32 KB SRAM |
The 8 MB memory is part of the FPGA-oriented subsystem.
Common Mistake 3: Driving Shared Pins from Both Devices
Always decide whether the:
|
1 2 3 4 5 6 |
SAMD21 or FPGA |
owns each output.
Common Mistake 4: Ignoring Timing Reports
FPGA designs must meet timing.
A successful compile is not the same as:
|
1 2 3 4 |
timing closure |
Common Mistake 5: Starting with HDMI
Video is one of the more complex FPGA workloads.
Start with:
- LED output;
- counter;
- simple register interface;
- PWM;
- UART;
before moving to video pipelines.
Common Mistake 6: Assuming Mini PCIe Means PCIe
The connector gives programmable FPGA pins in that mechanical format.
It does not automatically provide a standard PCIe endpoint.
Common Mistake 7: Ignoring EOL Status
For learning, Vidor remains interesting.
For a new commercial product, supply continuity and archived software repositories need to be part of the design decision.
Quick FPGA Reference
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
FPGA: Intel Cyclone 10CL016 Logic: 16K logic elements Embedded RAM: 504 kB DSP: 56 × 18×18 multipliers External SDRAM: 8 MB FPGA QSPI: 2 MB ~1 MB user allocation Base clock: 48 MHz Internal FPGA clocks: up to ~200 MHz documented Pin toggle: over 150 MHz documented MKR header I/O: 22 signals accessible to FPGA Extra FPGA I/O: 25 Mini PCIe-form-factor pins Video: Micro HDMI Camera: MIPI |
Recommended Learning Path
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
1. Use normal Arduino sketch on SAMD21 2. Run a prebuilt FPGA example 3. Understand shared pin ownership 4. Open official/template Quartus project 5. Compile an unchanged project 6. Modify one output 7. Add simple register communication 8. Build custom PWM / counter 9. Add FIFOs / multiple peripherals 10. Move to SDRAM, camera or HDMI |
Final Thoughts
The MKR Vidor 4000 is not best understood as an Arduino with a mysterious “extra processor”.
It is:
|
1 2 3 4 5 6 |
SAMD21 application processor + Cyclone 10 programmable hardware |
The SAMD21 is suited to:
- Arduino libraries;
- USB;
- Wi-Fi control;
- application logic;
- configuration.
The FPGA is suited to:
- precise timing;
- parallel I/O;
- custom serial interfaces;
- high-resolution PWM;
- DSP;
- camera capture;
- HDMI/video pipelines.
The most important rule is to design a clear boundary between the two devices:
|
1 2 3 4 5 6 7 8 |
who owns each pin what data crosses the boundary which clock domain owns each signal how the FPGA is loaded how the SAMD21 controls it |
Once that architecture is clear, the Vidor becomes much easier to understand.
For the complete physical pin mapping, see our Arduino MKR Vidor 4000 pinout guide. For the rest of the family, see Arduino MKR boards compared.