Linux C++ Drivers
Overview
Operations on FPGA memory registers can be performed on:
- a single register
- several consecutive registers
- a single bit
Example
The C++ driver is written in line with the memory definition in the instrument configuration file.
Configuration file config.yml
:
memory:
- name: control
offset: '0x60000000'
range: 4K
- name: status
offset: '0x50000000'
range: 4K
control_registers:
- led
status_registers:
- forty_two
C++ driver led_blinker.hpp
:
#include <context.hpp>
class LedBlinker
{
public:
LedBlinker(Context& ctx)
: ctl(ctx.mm.get<mem::control>())
, sts(ctx.mm.get<mem::status>())
{}
void set_leds(uint32_t led_value) {
ctl.write<reg::led>(led_value);
}
uint32_t get_leds() {
return ctl.read<reg::led>();
}
void set_led(uint32_t index, bool status) {
ctl.write_bit_reg(reg::led, index, status);
}
uint32_t get_forty_two() {
return sts.read<reg::forty_two>();
}
private:
Memory<mem::control>& ctl;
Memory<mem::status>& sts;
};
Constructor
The C++ driver constructor accepts a Context
object providing access to the FPGA memory.
To retrieve the memory regions of interest, ctx.mm
is used.
public:
LedBlinker(Context& ctx)
: ctl(ctx.mm.get<mem::control>())
, sts(ctx.mm.get<mem::status>())
{}
The returned Memory
object is stored in the variable ctl
.
Register
A register is identified by its offset in memory.
According to the instrument configuration file, the offset of the led
register within the control
memory is reg::led
.:
memory:
- name: control
offset: '0x60000000'
range: 4K
control_registers:
- led