{"id":36194,"date":"2026-08-06T15:30:00","date_gmt":"2026-08-06T15:30:00","guid":{"rendered":"https:\/\/imperix.com\/doc\/?p=36194"},"modified":"2026-08-07T12:00:00","modified_gmt":"2026-08-07T12:00:00","slug":"architecture-of-imperix-controllers","status":"publish","type":"post","link":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers","title":{"rendered":"Architecture of imperix controllers"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 ez-toc-wrap-right-text counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#System-architecture\" >System architecture<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Main-data-paths\" >Main data paths<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Firmware-architecture\" >Firmware architecture<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Data-acquisition\" >Data acquisition<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Modulation\" >Modulation<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Timings-management\" >Timings management<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Frequency-domains-derived-from-CLK0\" >Frequency domains derived from CLK0<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Other-FPGA-based-peripherals\" >Other FPGA-based peripherals<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#FPGA-sandbox\" >FPGA sandbox<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#Communication-resources\" >Communication resources<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\/#To-go-further\" >To go further<\/a><\/li><\/ul><\/nav><\/div>\n\n<p class=\"wp-block-paragraph\">This page presents the firmware architecture of <a href=\"\/products\/power-electronic-controllers\/\">imperix controllers<\/a> and details their corresponding data paths. Indirectly, this provides useful insights into how these devices operate, complementing the information in <a href=\"https:\/\/imperix.com\/doc\/help\/operating-principles-of-imperix-controllers\">PN261<\/a> addressing their operating principles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"System-architecture\"><\/span>System architecture<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">All imperix controllers are based on AMD Systems on Chip (SoC), which combine a high-performance Processing System (PS) with generic Programmable Logic (PL) on the same die:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <strong>processing system (PS)<\/strong> leverages fast CPU cores to perform floating-point arithmetic operations quickly. Since imperix controllers are multi-core systems, one core is fully dedicated to running user-defined control algorithms, and the other cores are responsible for system monitoring and data logging. Specifically, the task distribution is as follows:\n<ul class=\"wp-block-list\">\n<li><strong>User application CPU:<\/strong> runs the control algorithms in a bare-metal, interrupt-based, hard real-time environment. It can be programmed by the user using Simulink, PLECS, or C\/C++.<\/li>\n\n\n\n<li><strong>Supervisor CPU(s):<\/strong> handle housekeeping tasks such as data logging, system monitoring, and starting\/stopping user code. It also supports communication protocols such as Ethernet, CAN, and Modbus. The supervisor is mostly piloted by <a href=\"\/software\/cockpit\/\">Cockpit<\/a>. It cannot be programmed by the user.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The <strong>programmable logic (PL)<\/strong> area is used to implement specialized functions at the hardware level, with absolute determinism and a very high temporal resolution. This notably concerns pulse-width modulators (PWM), I\/O peripheral drivers, etc. By off-loading as many tasks as possible to the PL, the available CPU time (and hence the achievable performance) is maximized. The PL is further partitioned into two areas:\n<ul class=\"wp-block-list\">\n<li><strong>Pre-implemented logic:<\/strong> contains the non-editable hardware peripherals required for the proper operation of the controller.<\/li>\n\n\n\n<li><strong>User-editable logic (sandbox):<\/strong> represents a dedicated programmable area where users can implement custom FPGA logic for advanced applications.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Although the selected SoC isn\u2019t the same across all imperix controllers, their architectures are very similar, as shown below. The main differences lie around the analog acquisition stage, which has been significantly improved with the introduction of the B-Box 4.<\/p>\n\n\n<style>.kb-gallery-id-36194_f2635c-a9 .kadence-blocks-gallery-item .kb-gal-image-radius, .kb-gallery-id-36194_f2635c-a9 .kb-slide-item .kb-gal-image-radius img{border-radius:0px 0px 0px 0px;;}.kb-gallery-id-36194_f2635c-a9 .kadence-blocks-gallery-item .kadence-blocks-gallery-item-inner .kadence-blocks-gallery-item__caption{color:#000000;}.kb-gallery-caption-style-cover-hover.kb-gallery-id-36194_f2635c-a9 .kadence-blocks-gallery-item .kadence-blocks-gallery-item-inner .kadence-blocks-gallery-item__caption, .kb-gallery-caption-style-below.kb-gallery-id-36194_f2635c-a9 .kadence-blocks-gallery-item .kadence-blocks-gallery-item-inner .kadence-blocks-gallery-item__caption{background:rgba(0, 0, 0, 0);}.kb-gallery-wrap-id-36194_f2635c-a9.wp-block-kadence-advancedgallery{overflow:visible;}.kb-gallery-wrap-id-36194_f2635c-a9.wp-block-kadence-advancedgallery .kt-blocks-carousel{overflow:visible;}<\/style><div class=\"kb-gallery-wrap-id-36194_f2635c-a9 alignnone wp-block-kadence-advancedgallery\"><div class=\"kb-gallery-ul kb-gallery-non-static kb-gallery-type-slider kb-gallery-id-36194_f2635c-a9 kb-gallery-caption-style-below kb-gallery-filter-none\" data-image-filter=\"none\" data-lightbox-caption=\"true\"><div class=\"kt-blocks-carousel splide kt-carousel-container-dotstyle-dark kt-carousel-arrowstyle-whiteondark kt-carousel-dotstyle-dark kb-slider-group-arrow kb-slider-arrow-position-center\" data-slider-anim-speed=\"400\" data-slider-scroll=\"1\" data-slider-arrows=\"true\" data-slider-fade=\"true\" data-slider-dots=\"true\" data-slider-type=\"slider\" data-slider-hover-pause=\"false\" data-slider-auto=\"\" data-slider-speed=\"7000\" data-show-pause-button=\"false\"><div class=\"splide__track\"><ul class=\"kt-blocks-carousel-init kb-blocks-slider splide__list\"><li class=\"kb-slide-item kb-gallery-slide-item splide__slide\"><div class=\"kadence-blocks-gallery-item\"><div class=\"kadence-blocks-gallery-item-inner\"><figure class=\"kb-gallery-figure kadence-blocks-gallery-item-has-caption\"><div class=\"kb-gal-image-radius\"><div class=\"kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-inherit kb-has-image-ratio-inherit\" ><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97.png\" width=\"1178\" height=\"1217\" alt=\"Firmware architecture of the B-Box 4\" data-full-image=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97.png\" data-light-image=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97.png\" data-id=\"47860\" class=\"wp-image-47860 skip-lazy\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97.png 1178w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97-290x300.png 290w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97-991x1024.png 991w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-97-768x793.png 768w\" sizes=\"auto, (max-width: 1178px) 100vw, 1178px\" \/><\/div><\/div><figcaption class=\"kadence-blocks-gallery-item__caption\">Firmware architecture of the B-Box 4<\/figcaption><\/figure><\/div><\/div><\/li><li class=\"kb-slide-item kb-gallery-slide-item splide__slide\"><div class=\"kadence-blocks-gallery-item\"><div class=\"kadence-blocks-gallery-item-inner\"><figure class=\"kb-gallery-figure kadence-blocks-gallery-item-has-caption\"><div class=\"kb-gal-image-radius\"><div class=\"kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-inherit kb-has-image-ratio-inherit\" ><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99.png\" width=\"1139\" height=\"1217\" alt=\"Firmware architecture of the B-Box 3\" data-full-image=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99.png\" data-light-image=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99.png\" data-id=\"48045\" class=\"wp-image-48045 skip-lazy\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99.png 1139w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99-281x300.png 281w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99-958x1024.png 958w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/Asset-99-768x821.png 768w\" sizes=\"auto, (max-width: 1139px) 100vw, 1139px\" \/><\/div><\/div><figcaption class=\"kadence-blocks-gallery-item__caption\">Firmware architecture of the B-Box 3<\/figcaption><\/figure><\/div><\/div><\/li><\/ul><\/div><\/div><\/div><\/div>\n\n\n<p class=\"wp-block-paragraph\">Beyond the architecture, the AMD Ultrascale+ present inside the B-Box 4 yields superior overall performance and a higher I\/O count. A more general comparison of the devices is provided in <a href=\"https:\/\/imperix.com\/doc\/help\/programmable-controller-selection\"><u>PN250<\/u><\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th><\/th><th><strong>Gen. 4<\/strong><\/th><th colspan=\"4\"><strong>Gen. 3<\/strong><\/th><\/tr><tr><td><strong>Controller<\/strong><\/td><td>B-Box 4<\/td><td>B-Box 3<\/td><td>B-Box Micro<\/td><td>B-Board PRO<\/td><td>TPI8032<\/td><\/tr><tr><td><strong>SoC<\/strong><\/td><td>Ultrascale+<\/td><td colspan=\"4\">Zynq 7030<\/td><\/tr><tr><td><strong>CPU (PS)<\/strong><\/td><td>4xA53 \/ 1.5 GHz<\/td><td colspan=\"4\">2xA9 \/ 1.0 GHz<\/td><\/tr><tr><td><strong>FPGA (PL)<\/strong><\/td><td>Kintex US 504K<\/td><td colspan=\"4\">Kintex 7 125K<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Key features<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The digital control of power electronic systems is a <strong>hard real-time application<\/strong>, where insufficient determinism may lead to severe consequences, such as improper PWM outputs and even damage to the power stage. Furthermore, the total control delay &#8211; counted from the ADC sampling instant to the PWM update instant &#8211; is the cornerstone of the <strong>achievable closed-loop control performance<\/strong> (bandwidth and stability margins).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consequently, imperix controllers are purpose-built to simultaneously minimize that delay and guarantee that it remains rigorously constant (very low jitter). To achieve market-leading performance, the following aspects have received particular attention:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No pipelining<\/strong> is used. In other words, the k-th control period uses data acquired immediately before (not at the k-1 period or earlier), and impacts the modulation parameters immediately afterward (not at the k+1 period or later). This differs from general-purpose RCP systems or HIL simulators, which commonly use pipelining to increase the achievable refresh rate at the cost of latency.<\/li>\n\n\n\n<li><strong>Special management of timings<\/strong>. Control is rigorously synchronous with sampling and modulation, using hardware-based interrupts issued from a high-quality time source. This also extends to networked control configurations, thanks to<a href=\"\/technology\/networked-control\/\"> RealSync<\/a>.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Underlying motivations<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Such Systems on Chip (SoC) are very well suited for power electronics, thanks to the following reasons:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The data volume involved with each control interrupt is relatively small, typically a few tens to hundreds of Bytes. However, the total input-to-output latency is critical. On SoCs, since the CPU and FPGA share the same die, the FPGA has direct access to the CPU cache, ensuring maximum throughput and virtually zero latency. This vastly overcompensates for the reduced CPU clock speed compared to the <a href=\"https:\/\/en.wikipedia.org\/wiki\/X86\">x86 architecture<\/a>, especially for systems bottlenecked by the high latency of the <a href=\"https:\/\/en.wikipedia.org\/wiki\/PCI_Express\">PCIe<\/a> bus (0.5-1.5us, typically).<\/li>\n\n\n\n<li>Power converters require simultaneous interfacing with multiple peripherals (ADCs, PWMs, etc.) and parallel processing of multi-channel data, both of which the FPGA handles effortlessly.<\/li>\n\n\n\n<li>Multi-core systems are well suited to properly isolate the execution of user-developed control algorithms from other communication- or supervision-related tasks. Notably, imperix controllers execute user code as a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bare_machine\">bare-metal application<\/a> with strictly enforced real-time constraints. This is virtually impossible on x86 processors, which are too complex for bare-metal implementation.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Main-data-paths\"><\/span>Main data paths<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">All imperix controllers present two main data paths:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-12-color\">CPU control path<\/mark><\/strong>: Piloted by the <strong>user application CPU<\/strong>, this path is dedicated to data relevant for the user-implemented control algorithms. It does not involve large amounts of data but requires utmost priority, no pipelining, and minimal latency.<\/li>\n\n\n\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-11-color\">Datalogging path<\/mark><\/strong>: Piloted by the <strong>supervisor CPU(s), <\/strong>this path is dedicated to data monitoring and visualization in Cockpit. It runs fully independently and in parallel to the CPU control path. Various data streams are relevant:\n<ul class=\"wp-block-list\">\n<li><strong>User variables<\/strong>: Global variables in user code can be logged from the user CPU and transferred to the supervisor CPU, at the control interrupt rate. This transfer occurs concurrently with the CPU-to-FPGA write cycle, as detailed in <a href=\"https:\/\/imperix.com\/doc\/help\/operating-principles-of-imperix-controllers\">PN261<\/a>.<\/li>\n\n\n\n<li><strong>Oversampled analog data (B-Box 4 only)<\/strong>: Raw ADC data are continuously sampled at the full acquisition speed (20Msps), acquired, and directly written to DDR memory. This way, the supervisor CPU can collect relevant data afterward, enabling their visualization in Cockpit.<\/li>\n\n\n\n<li><strong>Digital I\/O states (B-Box 4 only)<\/strong>: PWM outputs and similar digital I\/O signals are logged at 250Msps, encoded (compressed), and written similarly to DDR. This makes those signals also available for monitoring and troubleshooting, perfectly synchronized with ADC data.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"201\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-5-1024x201.png\" alt=\"Main data paths implemented inside imperix digital systems.\" class=\"wp-image-48160\" style=\"aspect-ratio:5.095912585997572;width:695px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-5-1024x201.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-5-300x59.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-5-768x151.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-5-1536x301.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-5-2048x402.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Main data paths present on all imperix controllers<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"983\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-31-1024x983.png\" alt=\"firmware architecture of imperix controllers.\" class=\"wp-image-47825\" style=\"aspect-ratio:1.0417373319544985;width:495px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-31-1024x983.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-31-300x288.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-31-768x737.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-31.png 1532w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Main data paths implemented on imperix controllers.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Other specialized data paths are also present:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The&nbsp;<strong>protection path<\/strong>&nbsp;instantly blocks all PWM outputs when any undesirable and potentially dangerous event is detected, such as an over-value on an analog input signal. At the FPGA level, all fault sources are routed to a fault manager, which monitors the system&#8217;s operating state and controls the PWM outputs. More information on the hardware protections is provided in <a href=\"\/doc\/help\/hardware-protections-on-imperix-controllers\">PN263<\/a>. At the software and user interface levels, faults affect the <a href=\"https:\/\/imperix.com\/doc\/help\/operating-principles-of-imperix-controllers#core-states\">core state<\/a> and can be back-traced using Cockpit&#8217;s <a href=\"\/doc\/help\/cockpit-user-guide#logs\" data-type=\"link\" data-id=\"\/doc\/help\/cockpit-user-guide#logs\">log messages<\/a>.<\/li>\n\n\n\n<li>Various <strong>custom data paths<\/strong> can be implemented in the user-programmable FPGA area. Some examples are shown <a href=\"#sandbox\" data-type=\"internal\" data-id=\"#sandbox\">below<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Firmware-architecture\"><\/span>Firmware architecture<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Along the CPU control path, three key subsystems are present:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Data acquisition<\/strong> is best illustrated by the acquisition of analog signals, but more generally encompasses all the tasks related to retrieving measurements from physical sensors and making that data available to the CPU.<\/li>\n\n\n\n<li><strong>CPU processing<\/strong> involves executing algorithms to determine appropriate control actions based on the acquired data. In most cases, these algorithms compute duty cycles (or similar modulation parameters) that are subsequently transferred to the modulators.<\/li>\n\n\n\n<li><strong>Pulse-width modulation<\/strong> converts continuously valued modulation indices into binary gating signals using one or more configurable carriers. In most cases, conventional two-level carrier-based pulse-width modulation (PWM) is used, but other types of modulations are also possible. By extension, most of what applies to this block also applies to other output peripherals, such as analog outputs, digital outputs, etc.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The corresponding hardware resources are detailed below. Other FPGA-based peripherals are introduced later in this document. More information on the sequential treatment of data along the CPU control path is also provided in <a href=\"\/doc\/help\/operating-principles-of-imperix-controllers\">PN261<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Data-acquisition\"><\/span>Data acquisition<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This subsystem is certainly where the various imperix controllers differ most. Among them, two fundamentally different approaches are used, exemplified by the B-Box 3 and 4 controllers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <strong>B-Box 3<\/strong> is designed to sample at a configurable rate (the CPU rate, up to 500 ksps), synchronously with the modulation (synchronous sampling, see <a href=\"https:\/\/imperix.com\/doc\/help\/sampling-techniques-for-power-electronics\">PN258<\/a>). Its analog front-end is hence shaped accordingly, offering comparable analog bandwidth. For users interested in implementing anti-alias filtering, programmable low-pass filters are available before sampling, i.e. at the analog level, before ADCs.<\/li>\n\n\n\n<li>The <strong>B-Box 4<\/strong> is designed to always sample at a fixed rate of 20 Msps. Thanks to that, its analog front-end can provide effective anti-alias filtering without being configurable. However, configurable low-pass filtering is then required in the digital domain before the data is downsampled to the CPU rate. Ultimately, this yields the same result, but with the added benefit of fast-sampled data being available for monitoring.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The equivalent functional diagrams are shown below:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"339\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-28-1024x339.png\" alt=\"Firmware architecture of the ADC subsystem inside the B-Box 4.\" class=\"wp-image-47800\" style=\"aspect-ratio:3.0207508696173684;width:739px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-28-1024x339.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-28-300x99.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-28-768x254.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-28-1536x508.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-28-2048x678.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Analog data acquisition on B-Box 4<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"217\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-25-1024x217.png\" alt=\"Firmware architecture of the ADC subsystem inside the B-Box 3.\" class=\"wp-image-47797\" style=\"aspect-ratio:4.71919797620163;width:725px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-25-1024x217.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-25-300x64.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-25-768x163.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-25-1536x326.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-25-2048x435.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Analog data acquisition on B-Box 3<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Other controllers implement a somewhat hybrid approach. The TPI8032, the B-Box micro, and the bare B-Board 3 (PRO) do not possess programmable low-pass filters. However, they can either sample at a user-configurable rate, implementing <a href=\"https:\/\/imperix.com\/doc\/help\/sampling-techniques-for-power-electronics#synchronous-sampling\">synchronous sampling<\/a> (without anti-alias filtering), or use imperix&#8217;s proprietary&nbsp;<a href=\"https:\/\/imperix.com\/doc\/help\/sampling-techniques-for-power-electronics#synchronous-averaging\">synchronous averaging<\/a>&nbsp;approach to achieve the devices&#8217; maximum sampling rate of 2Msps, then benefiting from the averaging&#8217;s low-pass characteristic. More information on the commonly-used sampling techniques in power electronics is available in <a href=\"https:\/\/imperix.com\/doc\/help\/sampling-techniques-for-power-electronics\">PN258<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These architectures nonetheless possess the following common sub-elements:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Analog front-end<\/strong>:<strong> <\/strong>Processes analog input signals for rejecting common-mode and RF perturbations before the useful signals reach the analog-to-digital converters (ADCs).<\/li>\n\n\n\n<li><strong>ADC driver<\/strong>: Interfaces with physical ADCs to retrieve measurement data. The corresponding FPGA-based ADC driver defines the exact sampling instant. Specific to the B-Box 4, a calibration stage is also included (see <a href=\"https:\/\/imperix.com\/doc\/help\/sensor-auto-identification\">PN255<\/a> for more information).<\/li>\n\n\n\n<li><strong>Filtering and\/or down-sampling<\/strong>: Applies configurable anti-alias filters and resamples the captured data down to the CPU control rate (see below for more details).<\/li>\n\n\n\n<li><strong>Rescaling<\/strong>: Converts the raw integer ADC values into meaningful floating-point quantities in physical units (e.g. Amperes, Volts) before their transfer to the user app.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">CPU processing<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Data exchange between the PS and PL sections is performed over the SoC&#8217;s low-latency interconnect. In practice, the FPGA directly reads or writes data to the CPU\u2019s DDR memory and L2 cache. On the other side of that memory, the user application CPU operates <strong>exclusively between the read and write caches<\/strong>, with no task other than processing control-relevant data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The read cache contains a single data page with inbound data from the sensors. Transfers to this cache are scheduled and handled by the FPGA so that data arrive just before the CPU interrupt begins. Reciprocally, the write cache contains a single data page containing actuator output data. Transfers from this cache are triggered by the CPU at the end of its processing. These transfers typically take 20-100ns in single-controller applications, and can take up to 1-2 microseconds in a large control network with thousands of I\/Os. Architecturally, the read and write buses are independent, allowing transfers to occur <strong>simultaneously<\/strong> (full-duplex).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In multi-controller configurations, more time is available between the end-of-conversion flag and the CPU interrupt, allowing all sensor data to be aggregated and transferred to the master in a timely manner. The same applies to actual data. Thanks to imperix\u2019s proprietary tree-shaped networked control topology, transfers from slaves are initiated simultaneously, which vastly reduces latency. More information on data transfers over RealSync is available on the <a href=\"\/technology\/low-latency-communication\/\">dedicated page<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Inbound sensor data<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The control-relevant data received by the CPU is typically organized as shown below. One such table exists for each FPGA, whether it is physically located inside the same controller or in slaves.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>FPGA <strong>peripheral<\/strong><\/th><th><strong>Gen. 4 (B-Box 4 only)<\/strong><\/th><th><strong>Gen. 3 (all others)<\/strong><\/th><th><strong>Remark<\/strong><\/th><\/tr><\/thead><tbody><tr><td>ADC<\/td><td>#channels x 32 bits<\/td><td>#channels x 16 bits<\/td><td><\/td><\/tr><tr><td>DEC<\/td><td>#modules x 16 bits<\/td><td>#modules x 16 bits<\/td><td><\/td><\/tr><tr><td>GPI<\/td><td rowspan=\"2\">1x 32 bits<\/td><td>1x 16 bits<\/td><td><\/td><\/tr><tr><td>FLT<\/td><td>1x 16 bits<\/td><td>Also processed by safety<\/td><\/tr><tr><td>COM (SSI\/BiSS-C\/EnDat)<\/td><td>12x #ports x16 bits<\/td><td>12x #ports x16 bits<\/td><td><\/td><\/tr><tr><td>System overhead<\/td><td>7x 16 bits<\/td><td>7x 16 bits<\/td><td><\/td><\/tr><\/tbody><tfoot><tr><td><strong>Total<\/strong><\/td><td><strong>Typ. 15-35x 32 bits<\/strong><\/td><td><strong>Typ. 15-40x 16 bits<\/strong><\/td><td><\/td><\/tr><\/tfoot><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Outbound actuator data<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The control-relevant data produced by the CPU is typically organized as shown below. One such table exists for each FPGA, whether it is physically located inside the same controller or in slaves.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>FPGA peripheral<\/strong><\/th><th><strong>Gen. 4 (B-Box 4 only)<\/strong><\/th><th><strong>Gen. 3 (all others)<\/strong><\/th><th><strong>Remark<\/strong><\/th><\/tr><\/thead><tbody><tr><td>CB-PWM<\/td><td>1-2x #channels x 32 bits<\/td><td>1-2x #channels x 16 bits<\/td><td>+1 reg.\/ch with activate<\/td><\/tr><tr><td>SV-PWM<\/td><td>3-6x #mod. x 32 bits (2L)<br>6-12x #mod. x 32 bits (3L)<\/td><td>3-6x #mod. x 16 bits (2L)<br>6-12x #mod. x 16 bits (3L)<\/td><td>+3 registers with activate<\/td><\/tr><tr><td>SS-PWM<\/td><td>2x #arms x 16 bits<\/td><td>2x #arms x 16 bits<\/td><td>+1 register with activate<\/td><\/tr><tr><td>PP-PWM<\/td><td>1x #angles x 16 bits<br>3x #modulators x 16bits<\/td><td>1x #angles x 16 bits<br>3x #modulators x 16bits<\/td><td>+1 register with activate<\/td><\/tr><tr><td>DO-PWM<\/td><td>1x #channels x 16 bits<\/td><td>1x #channels x 16 bits<\/td><td>+1 register with activate<\/td><\/tr><tr><td>DAC<\/td><td># channels x 16 bits<\/td><td># channels x 16 bits<\/td><td><\/td><\/tr><tr><td>GPO<\/td><td>1-3x 16 bits<\/td><td>1-2x 16 bits<\/td><td><\/td><\/tr><tr><td>System overhead<\/td><td>6x 16 bits<\/td><td>6x 16 bits<\/td><td><\/td><\/tr><\/tbody><tfoot><tr><td><strong>Total<\/strong><\/td><td><strong>Typ. 5-100x 32 bits<\/strong><\/td><td><strong>Typ. 5-80x 16 bits<\/strong><\/td><td><\/td><\/tr><\/tfoot><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Modulation\"><\/span>Modulation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Imperix controllers feature a powerful modulation subsystem that is nearly identical across all controller types. Its architecture is shown below. Its key functions include:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>PWM modulators: <\/strong>Represent the core of the gate signal generation. Multiple commonly-used strategies are supported. Customizing PWM modulators in the sandbox area (SB-PWM) for specialized applications is also possible (an example is shown in <a href=\"https:\/\/imperix.com\/doc\/help\/driving-pwm-outputs-from-the-fpga\">PN127<\/a>).<\/li>\n\n\n\n<li><strong>Deadtime generator:<\/strong> Automatically inserts a configurable dead time between complementary PWM outputs to prevent shoot-through.<\/li>\n\n\n\n<li><strong>High-resolution output (B-Box 4 only):<\/strong>&nbsp;Enables fine-tuning of the duty cycle or carrier phase shift with 250 ps resolution.<\/li>\n\n\n\n<li><strong>Protection and activation:<\/strong> Authorizes or blocks the physical generation of PWM outputs:\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Activation<\/strong>: Provides independent control per PWM channel, controlled by the user code.<\/li>\n\n\n\n<li><strong>Protection<\/strong>: Controlled by the core state machine, disables all PWM outputs in the event of a fault.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"307\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-27-1024x307.png\" alt=\"PWM generation system inside imperix programmable controllers.\" class=\"wp-image-47799\" style=\"aspect-ratio:3.335629139072848;width:740px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-27-1024x307.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-27-300x90.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-27-768x230.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-27-1536x461.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-27-2048x614.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Pulse-width modulation on imperix controllers<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">More information on the difference between the activation and protection mechanisms is given in <a href=\"https:\/\/imperix.com\/doc\/help\/programming-imperix-controllers#enablepwm\">PN138<\/a>. Further details on the hardware protection mechanisms are also provided in <a href=\"\/doc\/help\/hardware-protections-on-imperix-controllers\">PN263<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Timings-management\"><\/span>Timings management<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A fourth fundamental block is the clock generation system, which is at the heart of imperix&#8217;s highly deterministic timings, low-latency operation, and ultra-precise synchronization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unlike microcontrollers, which conventionally manage the timings of the acquisition, processing, and modulation using a cascade of interrupts, imperix controllers are clocked from a single resource,&nbsp;the <strong>CLK generator<\/strong>, and use predetermined relative phase shifts for each FPGA-based peripheral. This yields perfectly equivalent capabilities while strongly minimizing latencies, enabling advanced sampling approaches (see <a href=\"\/doc\/help\/sampling-techniques-for-power-electronics\">PN258<\/a>), and supporting <a href=\"\/technology\/distributed-modulation\/\">distributed modulation<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"985\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-13-1024x985.png\" alt=\"Clock generation architecture for the digital control of power converter controllers at imperix.\" class=\"wp-image-47713\" style=\"aspect-ratio:1.0396094782034346;width:546px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-13-1024x985.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-13-300x288.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-13-768x738.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-13-1536x1477.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-13.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">CLK generator subsystem, highlighted from the rest of the architecture.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Imperix controllers <strong>provide 4 clocks<\/strong> (CLK0-CLK3) as timebases for all timing-critical tasks, such as ADC, PWM, and CPU interrupts. These clocks are derived directly from the 250 MHz FPGA main clock, which itself is produced from a very clean and stable timing source. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Among the four available clocks,&nbsp;CLK0 plays a special role, as it is used for all sampling- and processing-related events. As such, its frequency cannot be changed after code initialization, ensuring regular sampling. Two important internal clocks are derived from&nbsp;it, namely:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SCLK<\/strong>, the physical sampling clock. It runs at the same rate as CLK0, but with a user-defined&nbsp;constant phase shift&nbsp;that sets the exact sampling instant. This also defines the rate at which data can be made available inside the FPGA sandbox.<\/li>\n\n\n\n<li>The&nbsp;<strong>CPU interrupt<\/strong> clock, which triggers the execution of the control task. When required,&nbsp;it&nbsp;can be obtained by&nbsp;decimating&nbsp;SCLK with a <a href=\"https:\/\/imperix.com\/doc\/help\/timing-configuration-on-imperix-controllers#postscaler\">postscaler<\/a>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">CLK1, CLK2, and CLK3 are optional clocks that can be configured to run at variable frequencies. These clocks are typically used in applications where the sampling frequency and PWM carrier frequency differ (e.g., double-rate PWM updates, see <a href=\"\/doc\/help\/timing-configuration-on-imperix-controllers\">PN259<\/a>), or where the modulation uses a variable-frequency carrier (e.g., with <a href=\"https:\/\/imperix.com\/doc\/implementation\/llc-converter-control\">resonant converters<\/a>).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"600\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-15-1024x600.png\" alt=\"Content of the clock generator.\" class=\"wp-image-47718\" style=\"aspect-ratio:1.706719528311477;width:639px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-15-1024x600.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-15-300x176.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-15-768x450.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-15-1536x899.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-15-2048x1199.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Clock generation system inside imperix controllers<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Thanks to imperix\u2019s <a href=\"https:\/\/imperix.com\/technology\/low-latency-communication\/\">RealSync<\/a> technology, the clock domain derived from the master&#8217;s 250MHz base clock is distributed across the network, enabling the synchronization of all four shared clocks with an absolute frequency matching and a phase accuracy of \u00b12ns. In other words, from a timing perspective, all FPGA-based peripherals behave as if they belonged to the same physical SoC.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Practical considerations about the timing configuration for imperix controllers are documented in <a href=\"https:\/\/imperix.com\/doc\/help\/timing-configuration-on-imperix-controllers\">PN259<\/a>..<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Frequency-domains-derived-from-CLK0\"><\/span>Frequency domains derived from CLK0<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">As presented above, CLK0 serves as the reference clock for several acquisition- and processing-related mechanisms. At the hardware level, this defines several frequency domains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-2-color\"><strong>Oversampling domain<\/strong> <strong>F<sub>OVS<\/sub><\/strong> <strong>(B-Box 4 only)<\/strong><\/mark>, representing the physical sampling frequency. Since this frequency is fixed (20Msps), CLK0 and SCLK are constrained to be an integer sub-multiple of 20 MHz.<\/li>\n\n\n\n<li><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-15-color\"><strong>User sampling domain<\/strong> <strong>F<sub>SCLK<\/sub><\/strong><\/mark>, corresponding to the CLK0 frequency, but with a user-configurable sampling phase. Custom logic in the FPGA sandbox can access ADC data at this rate. Therefore, the execution rate of custom FPGA control tasks is usually identical to F<sub>SCLK<\/sub>.<\/li>\n\n\n\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-12-color\">CPU frequency domain F<sub>CPU<\/sub><\/mark><\/strong>, setting the execution rate for the CPU-based control tasks. By default, F<sub>CPU<\/sub> equals F<sub>SCLK<\/sub>. However, it can optionally be slowed down by adding a postscaler, which is typically useful to allow faster tasks to run on the FPGA.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"438\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-33-1024x438.png\" alt=\"Frequency domains and timing architecture.\" class=\"wp-image-47852\" style=\"aspect-ratio:2.337913108057928;width:763px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-33-1024x438.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-33-300x128.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-33-768x328.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-33-1536x657.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-33-2048x876.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Sampling-related frequency domains derived from CLK0.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The typical achievable rates are summarized in the table below.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th><\/th><th><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-13-color\">F<sub>OVS<\/sub><\/mark><\/strong><\/th><th><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-15-color\">F<sub>SCLK<\/sub><\/mark><\/strong><\/th><th><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-12-color\">F<sub>CPU<\/sub><\/mark><\/strong><\/th><th><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-11-color\">F<sub>FPGA<\/sub><\/mark><\/strong><\/th><\/tr><tr><td><strong>B-Box 4<\/strong><\/td><td>20 MHz<\/td><td>50 Hz \u2013 10 MHz<\/td><td>50 Hz \u2013 500 kHz<\/td><td>50 Hz \u2013 10 MHz<\/td><\/tr><tr><td><strong>B-Box 3<\/strong><\/td><td>N\/A<\/td><td>50 Hz \u2013 500 kHz<\/td><td>50 Hz \u2013 200 kHz<\/td><td>50 Hz \u2013 500 kHz<\/td><\/tr><tr><td><strong>B-Board \/ B-Box Micro \/ TPI8032<\/strong><\/td><td>N\/A<\/td><td>50 Hz \u2013 2 MHz<\/td><td>50 Hz \u2013 200 kHz<\/td><td>50 Hz \u2013 2 MHz<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Other-FPGA-based-peripherals\"><\/span>Other FPGA-based peripherals<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In addition to the acquisition (ADC) and modulation (PWM) resources presented above, several other subsystems are implemented as FPGA-based peripherals. All these resources are accessible using two different register types:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Configuration registers<\/strong> are designed to receive information that is written only at startup or updated rarely during operation. Typical examples include the configuration of the low-pass filters, the CPU interrupt rate, or the PWM dead time. Writing to (or reading from) configuration registers uses RealSync&#8217;s read-through (or write-through) traffic, which takes place immediately after the corresponding function call in the software code.<\/li>\n\n\n\n<li><strong>Real-time registers<\/strong> are systematically read or written once per CPU interrupt, even if the related information has not changed during the interval. This uses RealSync read-back (or write-back) traffic, which is scheduled together with all other read (respectively write) instructions before (respectively after) the execution of the CPU interrupt.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Other than to the ADC and PWM resources, this applies to:<\/p>\n\n\n\n<h4 id=\"input\" class=\"wp-block-heading\">Input peripherals<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/doc\/software\/fault-inputs\">FLT<\/a>: These are special-purpose digital inputs that are directly tied to the internal fault manager. They can be used to react to protection-related signals faster than the CPU rate.<\/li>\n\n\n\n<li><a href=\"\/doc\/software\/general-purpose-inputs\">GPI<\/a>: The corresponding pins are general-purpose digital inputs that can be read by user code at the CPU rate or via the FPGA sandbox (faster). On the B-Box 4, more pins are available than on Gen. 3 controllers, but these pins are multiplexed with FLT inputs.<\/li>\n\n\n\n<li><a href=\"\/doc\/software\/angle-decoder\">DEC<\/a>: These inputs can be configured as either&nbsp;four independent&nbsp;or&nbsp;two differential&nbsp;decoders for quadrature-encoded signals. This is&nbsp;typically used by analog motor speed\/position sensors. The corresponding pins are also multiplexed with GPI pins on all controllers.<\/li>\n\n\n\n<li>COM: Two ports are available to support serial communication from digital encoders using <a href=\"\/doc\/software\/endat-digital-encoder-input\">EnDat 2.2<\/a>, <a href=\"\/doc\/software\/ssi-digital-encoder-input\">SSI<\/a>, or <a href=\"\/doc\/software\/biss-angle-encoder-input\">BiSS-C<\/a>. This peripheral is only available on the B-Box 4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The values read or decoded by input peripherals are <strong>latched synchronously with SCLK<\/strong>. However, a few differences must be noticed regarding the relative phase:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The angle captured by the <a href=\"\/doc\/software\/angle-decoder\">DEC<\/a> peripheral is always latched perfectly synchronously with ADC data, namely at the rising edge of SCLK.<\/li>\n\n\n\n<li><a href=\"\/doc\/software\/general-purpose-inputs\">GPI<\/a> and <a href=\"\/doc\/software\/fault-inputs\">FLT<\/a> inputs are always latched as late as possible before the CPU read transfer. In practice, latching occurs simultaneously with the ADC end-of-conversion flag.<\/li>\n\n\n\n<li>Data transfers from digital encoders (COM peripheral) are initiated by SCLK, but the corresponding data can be retrieved only on a subsequent SCLK edge. If time permits, the corresponding measurement will be available in the next cycle. Otherwise, a two-period delay is induced, and rate decimation occurs.<\/li>\n<\/ul>\n\n\n\n<h4 id=\"output\" class=\"wp-block-heading\">Output peripherals<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/doc\/software\/analog-outputs\">DAC<\/a>: Digital-to-analog converter (DAC) outputs are peripherals specific to the B-Boxes 3 and 4. Their implementation, I\/O count, and performance differ significantly.<\/li>\n\n\n\n<li><a href=\"\/doc\/software\/general-purpose-outputs\">GPO<\/a>: The corresponding pins are general-purpose digital outputs that can be asserted by the CPU or directly from the sandbox (faster). On the B-Box 4, more pins are available than on Gen. 3 controllers, but these pins are multiplexed with PWM outputs.<\/li>\n\n\n\n<li>COM: Serial communication <em>to<\/em> digital encoders (as opposed to <em>from <\/em>them) is technically possible using <a href=\"\/doc\/software\/endat-digital-encoder-input\">EnDat 2.2<\/a>. This is, however, not (yet) supported at the software level.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For output peripherals, the exact instant of their update depends on the peripheral type:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/doc\/software\/carrier-based-pwm\">CB-PWM<\/a> and <a href=\"\/doc\/software\/sort-select-multilevel-pwm\">SS-PWM<\/a> have their update instant defined by the CLK they are tied to (CLK0\u2013CLK3), the carrier type, and whether single- or double-update rate is implemented. This is generally independent of the CPU operation, except if the peripherals are all clocked on CLK0.<\/li>\n\n\n\n<li><a href=\"\/doc\/implementation\/space-vector-modulation\">SV-PWM<\/a> resources update their outputs identically to CB-PWM, using triangular carriers and single- or double-rate update.<\/li>\n\n\n\n<li><a href=\"\/doc\/software\/direct-output-pwm\">DO-PWM<\/a> and <a href=\"\/doc\/software\/general-purpose-outputs\">GPO<\/a>s are latched immediately at the end of the CPU write cycle.<\/li>\n\n\n\n<li><a href=\"\/doc\/software\/analog-outputs\">DAC<\/a> data are transmitted to the physical DAC circuits at the end of the write cycle, and their outputs are latched immediately afterward. The total update latency is 2.26 \u00b5s across all devices.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"sandbox\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"FPGA-sandbox\"><\/span>FPGA sandbox<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The programmable logic (PL) section of the SoC is partitioned into two areas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Uneditable firmware area: <\/strong>Contains all the logic required to implement and communicate with the FPGA-based peripherals. This is encapsulated in a base firmware IP that must always be present. For FPGA users, this IP can be customized (wizard) and instantiated within the FPGA sandbox, allowing custom logic to be implemented around it. More information is available in the <a href=\"https:\/\/imperix.com\/doc\/help\/imperix-ip-user-guide\">IP product guide<\/a>.<\/li>\n\n\n\n<li><strong>User-programmable area (sandbox)<\/strong>: The remaining resources are available for users to develop their own logic, providing maximum flexibility for advanced applications. The user-programmable area represents 50-75% of the total logic resources in both Gen. 3 and Gen. 4 controllers. Getting-started information for FPGA-based development is also available in <a href=\"https:\/\/imperix.com\/doc\/help\/getting-started-with-fpga-control-development?currentThread=getting-started-with-fpga-programming\">PN159<\/a>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Thanks to the flexibility of the SoC architecture, users can also combine FPGA and CPU resources for more complex, hybrid applications:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>High-performance control<\/strong>: Typically, users leverage the FPGA sandbox to implement algorithms that run significantly faster on FPGA than on CPU. For example, <a href=\"https:\/\/imperix.com\/doc\/implementation\/fpga-based-inverter-control?currentThread=fpga-based-control-of-a-grid-tied-inverter\">TN147<\/a> demonstrates an FPGA-based current controller for a grid-following inverter running at 650 kHz on Gen. 3 hardware. In such a case, the CPU is used only indirectly to monitor variables using <a href=\"\/doc\/software\/sandbox-input-from-fpga\">SBI<\/a> blocks. The corresponding paths are illustrated below:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-19-1024x402.png\" alt=\"Data path when converter control is implemented on FPGA.\" class=\"wp-image-47750\" style=\"aspect-ratio:2.547390248836739;width:671px;height:auto\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-19-1024x402.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-19-300x118.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-19-768x302.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-19-1536x603.png 1536w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2025\/12\/image-19-2048x804.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">FPGA-based control data flow (red) and FPGA-to-CPU monitoring data flow (green).<\/figcaption><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Multi-rate control:<\/strong> In this case, both the FPGA and the CPU are used for control-relevant purposes but operate at decoupled rates. For example, in <a href=\"https:\/\/imperix.com\/doc\/implementation\/cascaded-voltage-control?currentThread=static-synchronous-compensator-statcom\">cascaded controllers<\/a>, a typical practice is to run a high-speed inner loop (e.g., current control) in the FPGA, while the CPU manages the slower outer loop (e.g., voltage or speed control).<\/li>\n\n\n\n<li><strong>Interface with custom peripherals:<\/strong> The FPGA can also be used to interface with custom hardware peripherals, for instance, via the dedicated USR pins. Typical examples include:\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/imperix.com\/doc\/implementation\/fpga-based-spi-communication-ip\">(TN130) SPI communication with an external ADC<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/imperix.com\/doc\/implementation\/fpga-based-delta-sigma-modulator\">(TN149) Decoder for a Delta-Sigma modulator<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Communication-resources\"><\/span>Communication resources<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Various means of communication are available and can be used either across imperix controllers or with third-party devices. The corresponding protocols are listed below and further documented in <a href=\"\/doc\/help\/real-time-communication-protocols\">PN202<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>Gen. 4 (B-Box 4)<\/th><th>Gen. 3 (all others)<\/th><\/tr><\/thead><tbody><tr><td><strong>CAN<\/strong><\/td><td>CAN-FD (2x)<\/td><td>CAN (1x)<\/td><\/tr><tr><td><strong>Ethernet<\/strong><\/td><td>TCP\/IP, Modbus TCP, OPC-UA<\/td><td>TCP\/IP, Modbus TCP, OPC-UA<\/td><\/tr><tr><td><strong>RealSync<\/strong><\/td><td>4x QSFP+ (40Gbps)<\/td><td>3x SFP+ (10Gbps)<br><em>N\/A on B-Box micro<\/em><\/td><\/tr><tr><td><strong>Serial COM (RS-232, RS-485)<\/strong><\/td><td>BiSS-C, EnDat, SSI<\/td><td>N\/A<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">At the hardware level, these protocols are supported in different manners and serve distinct purposes. This directly relates to their achievable performance:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CAN(-FD) <\/strong>is supported from the supervisor CPU(s) in the PS section of the SoC. The corresponding <em>read<\/em> data is made available in the L2 shared cache before the CPU interrupt begins. Respectively, <em>write <\/em>data is extracted from the cache after the CPU interrupt ends. The resulting latencies are negligible given that CAN is a slow and non-deterministic protocol.<\/li>\n\n\n\n<li><strong>Ethernet<\/strong> is used for various means:\n<ul class=\"wp-block-list\">\n<li><strong>User-configurable communication<\/strong> tasks can be implemented using <a href=\"\/doc\/software\/ethernet-output-mailbox\">UDP<\/a> or <a href=\"\/doc\/software\/modbus-output-mailbox\">Modbus TCP<\/a>. These are supported similarly to <a href=\"\/doc\/software\/can-output-mailbox\">CAN(-FD)<\/a>, via the supervisor CPU(s). Given the slow and non-deterministic latencies of these protocols, this is also adequate.<\/li>\n\n\n\n<li><strong>Device support<\/strong> tasks primarily include device programming and monitoring via Cockpit, which relies on OPC UA and TCP\/IP. To guarantee optimal performance when extracting data from DDR memory or bridging device-to-device Ethernet communication over RealSync, a Gigabit-capable Ethernet switch is implemented in the FPGA fabric. The related resources are neither visible nor editable by the user.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>RealSync<\/strong> also supports various duties:\n<ul class=\"wp-block-list\">\n<li><strong>Clock dissemination<\/strong>: The 250 MHz base clock issued by the network top master is automatically disseminated throughout the control network. This is subsequently used to reconstruct and align the CLK0-CLK3 clocks across all devices. The corresponding method is a patended imperix technology.<\/li>\n\n\n\n<li><strong>Master-slave communication<\/strong>: The CPU read and write cycles are arranged and scheduled so that data from all devices is written (or read) into the L2 cache right before (or after) the CPU interrupt. This uses automatically-configured read- or write-back traffic that guarantees minimal latency.<\/li>\n\n\n\n<li><strong>Master-master communication<\/strong>: For CPU-to-CPU communication, i.e. for communication between user codes, <a href=\"\/doc\/software\/sfp-out-sfp-output-mailbox\">SFP<\/a> blocks can be instantiated to &#8220;manually&#8221; arrange data transfers. This uses write-through traffic, resulting in a 1-period latency for concurrently scheduled CPU events.<\/li>\n\n\n\n<li><strong>Ethernet encapsulation<\/strong>: To enable Cockpit to communicate with slaves, Ethernet can be carried over RealSync as an encapsulated, low-priority traffic. This simplifies connectivity for the user and also leverages the fiber&#8217;s galvanic isolation. In this context, the RealSync arbiter has the critical task of guaranteeing the absolute, latency-free, priority of hard real-time traffic over Ethernet traffic.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Serial communication (COM)<\/strong> with incremental encoders is supported in the same way as other FPGA-based I\/O peripherals. However, as the duration of the data transmission is sensor-dependent, variable delays are incurred (see above).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"To-go-further\"><\/span>To go further<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following pages can help learn more about how imperix controllers operate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/doc\/help\/data-acquisition-in-b-box-4\">PN260<\/a> provides a detailed description of the ADC-related resources inside the B-Box 4.<\/li>\n\n\n\n<li><a href=\"\/doc\/help\/pulse-width-modulation-on-imperix-controllers\">PN262<\/a> presents the implementation and operation of modulators inside imperix controllers.<\/li>\n\n\n\n<li><a href=\"\/doc\/help\/operating-principles-of-imperix-controllers\">PN261<\/a> explains, from a sequential perspective, how imperix controllers operate.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This page presents the firmware architecture of imperix controllers and details their corresponding data paths. Indirectly, this provides useful insights into how these devices operate,&#8230;<\/p>\n","protected":false},"author":3,"featured_media":48371,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[3],"tags":[],"software-environments":[],"provided-results":[],"related-products":[31,32,92,166,110],"guidedreadings":[],"tutorials":[],"user-manuals":[],"coauthors":[69,72],"class_list":["post-36194","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-help","related-products-b-board-pro","related-products-b-box-rcp","related-products-b-box-micro","related-products-b-box-rcp-3-0","related-products-tpi"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Architecture of imperix controllers - imperix<\/title>\n<meta name=\"description\" content=\"The article explains presents the firmware architecture of imperix controllers and links to their principles of operation.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Architecture of imperix controllers - imperix\" \/>\n<meta property=\"og:description\" content=\"The article explains presents the firmware architecture of imperix controllers and links to their principles of operation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers\" \/>\n<meta property=\"og:site_name\" content=\"imperix\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-06T15:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-07T12:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2026\/08\/image-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1338\" \/>\n\t<meta property=\"og:image:height\" content=\"812\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nicolas Cherix, Shu Wang\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nicolas Cherix, Shu Wang\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers\"},\"author\":{\"name\":\"Nicolas Cherix\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/person\\\/44e7187157f1379207dce2b570f63f86\"},\"headline\":\"Architecture of imperix controllers\",\"datePublished\":\"2026-08-06T15:30:00+00:00\",\"dateModified\":\"2026-08-07T12:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers\"},\"wordCount\":4290,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/image-2.png\",\"articleSection\":[\"Product notes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers\",\"name\":\"Architecture of imperix controllers - imperix\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/image-2.png\",\"datePublished\":\"2026-08-06T15:30:00+00:00\",\"dateModified\":\"2026-08-07T12:00:00+00:00\",\"description\":\"The article explains presents the firmware architecture of imperix controllers and links to their principles of operation.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#primaryimage\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/image-2.png\",\"contentUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/image-2.png\",\"width\":1338,\"height\":812},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/architecture-of-imperix-controllers#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Knowledge base\",\"item\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Product notes\",\"item\":\"https:\\\/\\\/imperix.com\\\/doc\\\/category\\\/help\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Architecture of imperix controllers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#website\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\",\"name\":\"imperix\",\"description\":\"power electronics\",\"publisher\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/imperix.com\\\/doc\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\",\"name\":\"imperix\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/imperix_logo.png\",\"contentUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/imperix_logo.png\",\"width\":350,\"height\":120,\"caption\":\"imperix\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/person\\\/44e7187157f1379207dce2b570f63f86\",\"name\":\"Nicolas Cherix\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/07fe58bb65e7c65d6f4c53854ee4045d0c6cb2eb7b2cd3f58f03c926fab246c7?s=96&d=mm&r=gaafd9afe469fe587a71b66de1b538283\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/07fe58bb65e7c65d6f4c53854ee4045d0c6cb2eb7b2cd3f58f03c926fab246c7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/07fe58bb65e7c65d6f4c53854ee4045d0c6cb2eb7b2cd3f58f03c926fab246c7?s=96&d=mm&r=g\",\"caption\":\"Nicolas Cherix\"},\"description\":\"Nicolas is the chief engineer and product director at imperix. On the knowledge base, he is the author, co-author, or reviewer of numerous notes.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/nicolas-cherix-268a2b83\\\/\"],\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/author\\\/cherix\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Architecture of imperix controllers - imperix","description":"The article explains presents the firmware architecture of imperix controllers and links to their principles of operation.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers","og_locale":"en_US","og_type":"article","og_title":"Architecture of imperix controllers - imperix","og_description":"The article explains presents the firmware architecture of imperix controllers and links to their principles of operation.","og_url":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers","og_site_name":"imperix","article_published_time":"2026-08-06T15:30:00+00:00","article_modified_time":"2026-08-07T12:00:00+00:00","og_image":[{"width":1338,"height":812,"url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2026\/08\/image-2.png","type":"image\/png"}],"author":"Nicolas Cherix, Shu Wang","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Nicolas Cherix, Shu Wang","Est. reading time":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#article","isPartOf":{"@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers"},"author":{"name":"Nicolas Cherix","@id":"https:\/\/imperix.com\/doc\/#\/schema\/person\/44e7187157f1379207dce2b570f63f86"},"headline":"Architecture of imperix controllers","datePublished":"2026-08-06T15:30:00+00:00","dateModified":"2026-08-07T12:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers"},"wordCount":4290,"commentCount":0,"publisher":{"@id":"https:\/\/imperix.com\/doc\/#organization"},"image":{"@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#primaryimage"},"thumbnailUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2026\/08\/image-2.png","articleSection":["Product notes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#respond"]}]},{"@type":"WebPage","@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers","url":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers","name":"Architecture of imperix controllers - imperix","isPartOf":{"@id":"https:\/\/imperix.com\/doc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#primaryimage"},"image":{"@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#primaryimage"},"thumbnailUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2026\/08\/image-2.png","datePublished":"2026-08-06T15:30:00+00:00","dateModified":"2026-08-07T12:00:00+00:00","description":"The article explains presents the firmware architecture of imperix controllers and links to their principles of operation.","breadcrumb":{"@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#primaryimage","url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2026\/08\/image-2.png","contentUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2026\/08\/image-2.png","width":1338,"height":812},{"@type":"BreadcrumbList","@id":"https:\/\/imperix.com\/doc\/help\/architecture-of-imperix-controllers#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Knowledge base","item":"https:\/\/imperix.com\/doc\/"},{"@type":"ListItem","position":2,"name":"Product notes","item":"https:\/\/imperix.com\/doc\/category\/help"},{"@type":"ListItem","position":3,"name":"Architecture of imperix controllers"}]},{"@type":"WebSite","@id":"https:\/\/imperix.com\/doc\/#website","url":"https:\/\/imperix.com\/doc\/","name":"imperix","description":"power electronics","publisher":{"@id":"https:\/\/imperix.com\/doc\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/imperix.com\/doc\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/imperix.com\/doc\/#organization","name":"imperix","url":"https:\/\/imperix.com\/doc\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imperix.com\/doc\/#\/schema\/logo\/image\/","url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/imperix_logo.png","contentUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/imperix_logo.png","width":350,"height":120,"caption":"imperix"},"image":{"@id":"https:\/\/imperix.com\/doc\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/imperix.com\/doc\/#\/schema\/person\/44e7187157f1379207dce2b570f63f86","name":"Nicolas Cherix","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/07fe58bb65e7c65d6f4c53854ee4045d0c6cb2eb7b2cd3f58f03c926fab246c7?s=96&d=mm&r=gaafd9afe469fe587a71b66de1b538283","url":"https:\/\/secure.gravatar.com\/avatar\/07fe58bb65e7c65d6f4c53854ee4045d0c6cb2eb7b2cd3f58f03c926fab246c7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/07fe58bb65e7c65d6f4c53854ee4045d0c6cb2eb7b2cd3f58f03c926fab246c7?s=96&d=mm&r=g","caption":"Nicolas Cherix"},"description":"Nicolas is the chief engineer and product director at imperix. On the knowledge base, he is the author, co-author, or reviewer of numerous notes.","sameAs":["https:\/\/www.linkedin.com\/in\/nicolas-cherix-268a2b83\/"],"url":"https:\/\/imperix.com\/doc\/author\/cherix"}]}},"_links":{"self":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/36194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/comments?post=36194"}],"version-history":[{"count":52,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/36194\/revisions"}],"predecessor-version":[{"id":48434,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/36194\/revisions\/48434"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/media\/48371"}],"wp:attachment":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/media?parent=36194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/categories?post=36194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/tags?post=36194"},{"taxonomy":"software-environments","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/software-environments?post=36194"},{"taxonomy":"provided-results","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/provided-results?post=36194"},{"taxonomy":"related-products","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/related-products?post=36194"},{"taxonomy":"guidedreadings","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/guidedreadings?post=36194"},{"taxonomy":"tutorials","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/tutorials?post=36194"},{"taxonomy":"user-manuals","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/user-manuals?post=36194"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/coauthors?post=36194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}