====== flink, Universal Serial Interface to FPGA's ====== * [[https://github.com/flink-project/ | flink on Github]] flink is .. * an universal serial interface to FPGA's * a collection of useful blocks in a FPGA * open-source * highly flexible * real-time capable flink can be read as //fast link// or as the German "flink" meaning fast. It enables any processors to communicate with an external FPGA over a parallel interface (e.g. PCI, EIM, LPB, AXI) or serial interface (e.g. SPI). The FPGA may contain several blocks such as counters or pulse-width modulation. Such blocks are extensively used in robotics for control applications. \\ flink was developed at and is maintained by the Institute of Computer Science at [[http://www.ost.ch|OST]]. ===== Overview ===== * [[.:flink_vhdl|flink VHDL subdevices and interfaces]] * [[.:flink_linux|flink Linux Kernel Modules]] * [[.:flink_lib|flink Userspace Library]] * [[.:flink_liblite|flink Userspace Library Lite]] * [[.:flink_utils|flink Utilities]] * [[.:flink_python|flink Python Wrapper]] * [[.:flink_deep|flink Java Library]] flink can be used on a multitude of targets and with various setups. \\ flink includes the following modules * flinkVHDL: Configuration for an external FPGA toghether with a suitable hardware link * flinkLinux: Kernel Modules * flinkLib: Userspace library for C/C++ * flinkLite: Userspace library for OS-less systems for C/C++ * flinkUtils: Utilities and test programs for the flink library * flinkPython: Python wrapper * flinkDeep: Library for Java ==== Typical use with C/C++ under an operating system ==== * [[flink_first_steps|flink First Steps]] * [[flink_example_1|flink on a Phytec PCM032 Board]] * [[flink_example_2|flink on a Digilent ZYBO]] Implement all necessary hardware modules with [[flink_vhdl|flink VHDL modules and interfaces]] and choose a suitable interconnection with the available [[flink_linux|flink Linux Kernel Modules]]. Develop your application using the [[flink_lib|flink Userspace Library]]. The following picture shows the system setup. [{{ flinkoverviewlinux.png?500 | //flink with OS and C/C++ programming//}}] ===== System Architecture ===== An external FPGA contains hardware modules, which provide certain functions such as a pwm generator or an analog input channel. Such an external FPGA is represented by a ''flink device''. Every ''flink device'' contains one or more ''subdevices''. A ''subdevice'' represents a function. At last every ''subdevice'' has one or more ''channels''. * **device**: An external FPGA, group of subdevices. * **subdevice**: Modul with a specific function, such as ''digital IO'' or ''analog input''. * **channel**: Single channel of a subdevice, corresponds to a single pin of a ''digital IO'' subdevice. [{{ systemarchitectureexample.png?600 | //System architecture for an example system with a motor drive. The drive controlled by an analog output signal. The motor position is determined with a counter module. //}}] ===== Memory Mapping ===== Every subdevice which is specified in a device offers a standardised memory interface towards the driver library. The first 16 bytes comprise the header information which is read-only. ^Offset^Size [byte] ^Name^r/w^Const^Description^ |0x00|4|function|r|yes|function, which this subdevice implements| |0x04|4|memory size|r|yes|total memory size of this device, including header, subheader and subdevice specific information| |0x08|4|nof channels|r|yes|number of channels of this subdevice| |0x0c|4|unique id|r|yes|id identifying this subdevice| The field ''function'' has the following meaning: |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16| | function id |||||||||||||||| |15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0| | subtype id |||||||| interface version |||||||| All the available functions can be found in [[subdevices|Available Subdevices]]. Next comes a subheader. It contains a configuration and status register. The meaning of the single bits of these registers can vary according to the function of the subdevice. ^Offset^Size [byte] ^Name^r/w^Const^Description^ |0x10|4|status|r|no|status of subdevice| |0x14|4|configuration |r/w|no|configuration word for subdevice| |0x18|4| | | |reserved| |0x1c|4| | | |reserved| Header and subheader is followed by a subdevice specific part. The content varies according to the function and is listed in [[subdevices|Available Subdevices]]