{"id":485335,"date":"2026-06-28T12:14:55","date_gmt":"2026-06-28T12:14:55","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=485335"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=485335","title":{"rendered":"\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c bitstream \u0438\u0437 Linux \u0447\u0435\u0440\u0435\u0437 FPGA Manager \u043d\u0430 Zynq-7000"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c!<br \/> \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Buildroot \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b \u043d\u0430 \u0431\u0430\u0437\u0435 Zynq-7000. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e Linux-\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0432 Vivado \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 PL-\u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b\u0438. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 bring-up \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e: bitstream \u043e\u0431\u044b\u0447\u043d\u043e \u0448\u044c\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 JTAG \u0438\u043b\u0438 \u043a\u043b\u0430\u0434\u0443\u0442 \u0432 boot \u0440\u0430\u0437\u0434\u0435\u043b, \u0447\u0442\u043e\u0431\u044b PL \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0435\u0449\u0451 \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430 Linux.<br \/> \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u043d\u044f\u0442\u044c bitstream. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Linux \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 FPGA Manager.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c PL \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Linux.<br \/> \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c FPGA-\u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 bitstream \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e FPGA \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p><em>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 partial reconfiguration \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 \u0438 vendor flow. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u0430\u044f full reconfiguration \u043d\u0430 Zynq-7000.<\/em><\/p>\n<\/blockquote>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f Device Tree Overlay;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 kernel options \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f FPGA Manager \u0438 overlay-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c bitstream \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 Linux;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream \u0432 C++-\u0443\u0442\u0438\u043b\u0438\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Zynq-7000 \u0438 Buildroot, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<br \/> \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0444\u043e\u043a\u0443\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 Zynq-7000. \u0414\u043b\u044f ZynqMP \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0445\u043e\u0436, \u043d\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a firmware-\u0441\u0442\u0435\u043a\u0443 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<blockquote>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 overlay. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e, \u043a\u0430\u043a fpga_loader \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 configfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DTS overlay, \u043d\u044e\u0430\u043d\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0442.\u043a. \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 PL \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e PS\/Linux \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 PL: \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c userspace, \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c\/\u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c DMA, quiesce AXI-\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0443\u0431\u0440\u0430\u0442\u044c overlay \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439. \u0418\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c bus hang, \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u044f\u0434\u0440\u0430 \u0438\u043b\u0438 device timeout.<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0442\u0435\u043c\u0435:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/xilinx-wiki.atlassian.net\/wiki\/spaces\/A\/pages\/18841645\/Solution+Zynq+PL+Programming+With+FPGA+Manager\" rel=\"noopener noreferrer nofollow\">https:\/\/xilinx-wiki.atlassian.net\/wiki\/spaces\/A\/pages\/18841645\/Solution+Zynq+PL+Programming+With+FPGA+Manager<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/xilinx-wiki.atlassian.net\/wiki\/spaces\/A\/pages\/18841847\/Solution+ZynqMP+PL+Programming\" rel=\"noopener noreferrer nofollow\">https:\/\/xilinx-wiki.atlassian.net\/wiki\/spaces\/A\/pages\/18841847\/Solution+ZynqMP+PL+Programming<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>FPGA Manager<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a Linux \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u0442 FPGA.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 bitstream \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f SoC FPGA, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Zynq \u0438 Zynq UltraScale+, \u0432 \u044f\u0434\u0440\u0435 Linux \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a FPGA Manager.<\/p>\n<p>FPGA Manager \u2014 \u044d\u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u0441\u043b\u043e\u0439 \u0432 \u044f\u0434\u0440\u0435 Linux \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 FPGA image. \u041e\u043d \u043f\u0440\u044f\u0447\u0435\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0437\u0430 \u0435\u0434\u0438\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c: userspace \u043f\u0438\u0448\u0435\u0442 \u0438\u043c\u044f firmware, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c image \u0432 FPGA.<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code>Bitstream    \u2193FPGA Manager    \u2193\u0414\u0440\u0430\u0439\u0432\u0435\u0440 FPGA    \u2193    PL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 bitstream \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 sysfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 FPGA Manager. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 Zynq-7000 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0431\u043b\u043e\u043a\u043e\u043c PCAP (Processor Configuration Access Port), \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c PL \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0431\u0435\u0437 \u0443\u0447\u0430\u0441\u0442\u0438\u044f JTAG.<\/p>\n<h3>\u041f\u0438\u0448\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e PL-\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream \u0447\u0435\u0440\u0435\u0437 FPGA Manager, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f PL.<\/p>\n<p><em>\u042f \u043d\u0435 RTL-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439: \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 Verilog\/SystemVerilog, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 bitstream \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 FPGA Manager.<\/em><\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PL \u043e\u0442 PS, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0443\u0442<\/p>\n<p>Zynq Processing System -&gt; Clock Configuration -&gt; FCLK_CLK0<\/p>\n<p>IO PLL, requested freq. 50 MHz<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b04\/fa4\/815\/b04fa48159d50aa29ac2214acc382126.png\" width=\"1039\" height=\"787\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b04\/fa4\/815\/b04fa48159d50aa29ac2214acc382126.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b04\/fa4\/815\/b04fa48159d50aa29ac2214acc382126.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0438\u0433\u0430\u0442\u044c \u0434\u0438\u043e\u0434\u043e\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u043c, \u0447\u0442\u043e \u0445\u043e\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code>module blink #(parameter int unsigned CLK_HZ = 50_000_000,parameter int unsigned BLINK_HZ = 1,parameter bit LED_ACTIVE_HIGH = 1'b1)(input logic clk_i,input logic rst_n,output logic led_o);initial beginif (BLINK_HZ &lt; 1) $fatal(1, \"BLINK_HZ must be &gt;= 1\");if (CLK_HZ &lt; 1) $fatal(1, \"CLK_HZ must be &gt;= 1\");if (CLK_HZ &lt; (BLINK_HZ * 2)) $fatal(1, \"CLK_HZ too low for requested BLINK_HZ\");endlocalparam int unsigned COUNT_MAX = CLK_HZ \/ (BLINK_HZ * 2);localparam int unsigned DIV_MAX = COUNT_MAX - 1;localparam int unsigned CNT_W = (COUNT_MAX &lt;= 1) ? 1 : $clog2(COUNT_MAX);logic [CNT_W-1:0] cnt;logic led_raw;always_ff @(posedge clk_i or negedge rst_n) beginif (!rst_n) begincnt &lt;= '0;led_raw &lt;= 1'b0;end else if (cnt == DIV_MAX[CNT_W-1:0]) begincnt &lt;= '0;led_raw &lt;= ~led_raw;end else begincnt &lt;= cnt + 1'b1;endendalways_comb beginled_o = (LED_ACTIVE_HIGH) ? led_raw : ~led_raw;endendmodule<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0441\u0438\u043d\u0442\u0435\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442.<br \/> \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 BlockDesign, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u041f\u041a\u041c -&gt; Add module.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c SystemVerilog \u043c\u043e\u0434\u0443\u043b\u044c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 wrapper \u043d\u0430 Verilog, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c.<\/p>\n<pre><code>module blink_bd (    input  wire       clk_i,    input  wire       rst_n,    output wire [1:0] led_o);wire led_blink;blink #(    .CLK_HZ(50000000),    .BLINK_HZ(1),    .LED_ACTIVE_HIGH(1'b1)) u_blink (    .clk_i(clk_i),    .rst_n(rst_n),    .led_o(led_blink));assign led_o[0] = led_blink;assign led_o[1] = ~led_blink;endmodule<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c (\u041f\u041a\u041c -&gt; Add module)<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/182\/afa\/c78\/182afac78d71a42f201477a8f88b353b.png\" width=\"397\" height=\"448\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/182\/afa\/c78\/182afac78d71a42f201477a8f88b353b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/182\/afa\/c78\/182afac78d71a42f201477a8f88b353b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043a\u043b\u043e\u043a\u0438, reset, \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0440\u0443\u0436\u0443 led_o<br \/> \u0422\u044b\u043a\u0430\u0435\u043c \u041f\u041a\u041c led_o, make external.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e BlockDesign \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e46\/593\/57a\/e4659357a051e61e638c0a2d568e8926.png\" width=\"929\" height=\"450\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e46\/593\/57a\/e4659357a051e61e638c0a2d568e8926.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e46\/593\/57a\/e4659357a051e61e638c0a2d568e8926.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0435\u0439\u043d\u0430\u0445 \u044f \u0443\u043a\u0430\u0436\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0434\u043b\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 (\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0432\u0435 \u0448\u0442\u0443\u043a\u0438):<\/p>\n<pre><code>## LEDs (PL pins)set_property IOSTANDARD LVCMOS33 [get_ports {led_o_0[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {led_o_0[1]}]  set_property PACKAGE_PIN V15 [get_ports {led_o_0[0]}]set_property PACKAGE_PIN V13 [get_ports {led_o_0[1]}]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442. \u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0448 xsa \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0451 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0438 ps_init, \u0442\u043e \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. <\/p>\n<p>\u0421\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u043c, \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/960\/09d\/000\/96009d000c30e0a8cb2329c0acb78f4c.png\" width=\"1602\" height=\"211\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/960\/09d\/000\/96009d000c30e0a8cb2329c0acb78f4c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/960\/09d\/000\/96009d000c30e0a8cb2329c0acb78f4c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0442\u0441\u0442\u0440\u0438\u043c.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c xsa \u0444\u0430\u0439\u043b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 bitstream. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0432 \u0432\u043e\u0442 \u0441\u044e\u0434\u0430:<br \/> Export hardware, Include bitstream<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/264\/0f6\/434\/2640f6434deae42c7d9d3f70826bd5bf.png\" width=\"802\" height=\"709\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/264\/0f6\/434\/2640f6434deae42c7d9d3f70826bd5bf.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/264\/0f6\/434\/2640f6434deae42c7d9d3f70826bd5bf.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u0442\u044c \u043d\u0430\u0448 xsa \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 buildroot. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; ps_init_gpl (c + h) \u0438\u0437 xsa \u0444\u0430\u0439\u043b\u0430, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 DTS.<\/p>\n<blockquote>\n<p> \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0434\u043b\u044f Zynq-7000 \u0432 Xilinx\/AMD FPGA Manager flow \u0432 PL \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 <code>.bit<\/code>, \u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 <code>.bin<\/code>, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 <code>.bit<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>bootgen<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 <code>.bin<\/code> \u0444\u0430\u0439\u043b \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f FPGA Manager \u0447\u0435\u0440\u0435\u0437 <code>firmware<\/code>\/<code>firmware-name<\/code>.<\/p>\n<p>\u0414\u043b\u044f ZynqMP flow \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 PL \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 platform firmware, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 Xilinx\/AMD software stack \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e flow. \u0412 PetaLinux\/AMD flow \u0434\u043b\u044f Zynq UltraScale+ \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f bitstream \u0432 <code>.bin<\/code> \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0438\u043b\u0438 <code>.pdi<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c Zynq-7000 \u0438 ZynqMP. \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c Zynq-7000, \u0433\u0434\u0435 \u0434\u043b\u044f FPGA Manager \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e <code>.bin<\/code>.<\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0443 \u0441\u0435\u0431\u044f \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 bash-\u0441\u043a\u0440\u0438\u043f\u0442 (\u0435\u0441\u043b\u0438 \u0447\u0442\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 scripts):<\/p>\n<pre><code class=\"bash\">#!\/bin\/bashshow_usage() {    echo \"Usage: $0 [options] &lt;input.bit&gt; [output.bin]\"    echo \"\"    echo \"Options:\"    echo \"  -a, --arch &lt;arch&gt;    \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: zynq, zynqmp (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: zynqmp)\"    echo \"  -h, --help           \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u043f\u0440\u0430\u0432\u043a\u0443\"    echo \"\"    echo \"Arguments:\"    echo \"  input.bit            \u0412\u0445\u043e\u0434\u043d\u043e\u0439 bitstream \u0444\u0430\u0439\u043b\"    echo \"  output.bin           (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e) \u0418\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430\"    echo \"\"    echo \"Examples:\"    echo \"  $0 design.bit                          # ZynqMP, output: design.bit.bin\"    echo \"  $0 design.bit fpga.bin                 # ZynqMP, output: fpga.bin\"    echo \"  $0 --arch zynq design.bit                # Zynq-7000, output: design.bit.bin\"    echo \"  $0 -a zynq design.bit output.bin         # Zynq-7000, output: output.bin\"    exit 0}ARCH=\"zynqmp\"while [[ $# -gt 0 ]]; do    case $1 in        -a|--arch)            ARCH=\"$2\"            shift 2            ;;        -h|--help)            show_usage            ;;        -*)            echo \"Error: Unknown option $1\"            show_usage            ;;        *)            break            ;;    esacdoneif [ $# -lt 1 ]; then    echo \"Error: Missing input file\"    echo \"\"    show_usagefiINPUT_BIT=\"$1\"if [ ! -f \"$INPUT_BIT\" ]; then    echo \"Error: File '$INPUT_BIT' not found\"    exit 1fiif [ \"$ARCH\" != \"zynq\" ] &amp;&amp; [ \"$ARCH\" != \"zynqmp\" ]; then    echo \"Error: Invalid architecture '$ARCH'\"    echo \"Supported architectures: zynq, zynqmp\"    exit 1fiif [ $# -ge 2 ]; then    OUTPUT_BIN=\"$2\"else    OUTPUT_BIN=\"${INPUT_BIT}.bin\"fiecho \"Converting bitstream:\"echo \"  Input:       $INPUT_BIT\"echo \"  Output:      $OUTPUT_BIN\"echo \"  Target arch: $ARCH\"BIF_FILE=\"bitstream_temp.bif\"echo \"all : { $INPUT_BIT }\" &gt; \"$BIF_FILE\"# \u041f\u0443\u0442\u044c \u043a bootgen (\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 Vivado)BOOTGEN=\"bootgen\"# \u0415\u0441\u043b\u0438 bootgen \u043d\u0435 \u0432 PATH, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0443\u0442\u044c:BOOTGEN=\"\/home\/fka\/tools\/Xilinx\/2025.1\/Vitis\/bin\/bootgen\"if ! command -v $BOOTGEN &amp;&gt; \/dev\/null; then    echo \"Error: bootgen not found in PATH\"    echo \"Please install Xilinx Vivado or set BOOTGEN variable to bootgen path\"    rm -f \"$BIF_FILE\"    exit 1fiecho \"Running bootgen with architecture: $ARCH\"$BOOTGEN -image \"$BIF_FILE\" -arch \"$ARCH\" -process_bitstream binif [ $? -ne 0 ]; then    echo \"Error: bootgen conversion failed\"    rm -f \"$BIF_FILE\"    exit 1fiTEMP_BIN=\"${INPUT_BIT}.bin\"if [ \"$TEMP_BIN\" != \"$OUTPUT_BIN\" ]; then    if [ -f \"$TEMP_BIN\" ]; then        mv \"$TEMP_BIN\" \"$OUTPUT_BIN\"    else        echo \"Error: Expected output file '$TEMP_BIN' not found\"        rm -f \"$BIF_FILE\"        exit 1    fifirm -f \"$BIF_FILE\"echo \"Conversion completed successfully: $OUTPUT_BIN\"echo \"Target architecture: $ARCH\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442, \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0432 \u0435\u043c\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 zynq, \u0438 \u043f\u0440\u043e\u043a\u0438\u043d\u0443\u0432 \u043f\u0443\u0442\u044c \u0434\u043e bitstream \u0444\u0430\u0439\u043b\u0430 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <code>.bit<\/code>.<\/p>\n<blockquote>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 &#8212; zynqmp.<\/p>\n<\/blockquote>\n<h3>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u044f\u0434\u0440\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 FPGA Manager<\/h3>\n<p>\u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 bitstream \u0438\u0437 Linux \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u044f\u0434\u0440\u0435 \u0431\u044b\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 FPGA Manager \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, Device Tree Overlay. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 defconfig \u0434\u043b\u044f Zynq\/ZynqMP \u044d\u0442\u0438 \u043e\u043f\u0446\u0438\u0438 \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u044f\u0432\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0437\u0430 \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<p>\u0412 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0434\u043b\u044f Zynq-7000 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 FPGA framework \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 FPGA Manager \u0434\u043b\u044f Xilinx Zynq:<\/p>\n<pre><code>CONFIG_FPGA=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u043f\u0446\u0438\u044f <code>CONFIG_FPGA<\/code> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 FPGA Configuration Framework \u0432 \u044f\u0434\u0440\u0435 Linux.<br \/> \u042d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0441\u043b\u043e\u0439 FPGA Manager \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b FPGA Manager, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0434\u0440\u043e \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c FPGA.<br \/> \u0421\u0430\u043c FPGA Manager \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044e: \u043e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0430 \u0432\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435\u043b\u0435\u0436\u0430\u0449\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0414\u043b\u044f Zynq-7000 \u0442\u0430\u043a\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>CONFIG_FPGA_MGR_ZYNQ_FPGA<\/code>. \u041e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PL-\u0447\u0430\u0441\u0442\u0438 Xilinx Zynq \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c FPGA Manager.<br \/> \u041d\u0430 Zynq-7000 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 bitstream \u0438\u0437 PS \u0432 PL \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u043b\u043e\u043a DevCfg\/PCAP, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 FPGA Manager \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 PL \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f Zynq UltraScale+ MPSoC \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440:<\/p>\n<pre><code>CONFIG_FPGA_MGR_ZYNQMP_FPGA=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a FPGA Manager, \u043d\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0443\u0436\u0435 \u0434\u043b\u044f ZynqMP. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Zynq-7000, \u0442\u0430\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 PL \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430 firmware-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u0442\u0430\u043b\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u043e\u043a\u0443\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 Zynq-7000.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c bitstream, \u043d\u043e \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Linux \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0432 PL, \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Device Tree Overlay:<\/p>\n<pre><code>CONFIG_OF_OVERLAY=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Device Tree Overlay \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c live device tree: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0443\u0437\u043b\u044b, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c Linux \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 platform device. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432 PL \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0438\u0433\u0430\u044e\u0449\u0438\u0439 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434, \u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, AXI GPIO, AXI DMA, BRAM-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 IP-\u0431\u043b\u043e\u043a.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 FPGA \u0441 DTS overlay \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b:<\/p>\n<pre><code>CONFIG_FPGA_BRIDGE=yCONFIG_FPGA_REGION=yCONFIG_OF_FPGA_REGION=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>CONFIG_FPGA_REGION<\/code> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0441\u043b\u043e\u0439 FPGA Region.<br \/> FPGA Region \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c FPGA: \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u0432\u0441\u044f PL-\u0447\u0430\u0441\u0442\u044c, \u0442\u0430\u043a \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f partial-reconfiguration \u043e\u0431\u043b\u0430\u0441\u0442\u044c. Region \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c FPGA Manager \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0441 FPGA bridges, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e.<\/p>\n<p><code>CONFIG_OF_FPGA_REGION<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 Device Tree-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f FPGA Region.<br \/> \u042d\u0442\u043e\u0442 \u0441\u043b\u043e\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c FPGA-\u0440\u0435\u0433\u0438\u043e\u043d \u0432 device tree \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 DT\/overlay, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>firmware-name<\/code>, <code>fpga-mgr<\/code>, <code>fpga-bridges<\/code> \u0438 \u0444\u043b\u0430\u0433\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 overlay \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0432 PL, \u043d\u043e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u044f\u0434\u0440\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 FPGA image \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 FPGA-\u0440\u0435\u0433\u0438\u043e\u043d.<\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <code>CONFIG_FPGA_REGION<\/code> \u0434\u0430\u0451\u0442 \u043e\u0431\u0449\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c region\/manager\/bridges, \u0430 <code>CONFIG_OF_FPGA_REGION<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u0447\u0435\u0440\u0435\u0437 Device Tree.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 overlay \u0447\u0435\u0440\u0435\u0437 configfs, \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u0435\u043d \u0441\u0430\u043c configfs:<\/p>\n<pre><code>CONFIG_CONFIGFS_FS=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Configfs \u2014 \u044d\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e userspace \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c kernel objects \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 <code>mkdir<\/code>, <code>rmdir<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b\u044b. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 <code>.dtbo<\/code> \u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443:<\/p>\n<pre><code class=\"bash\">mount -t configfs none \/sys\/kernel\/configmkdir \/sys\/kernel\/config\/device-tree\/overlays\/blinkcat blink.dtbo &gt; \/sys\/kernel\/config\/device-tree\/overlays\/blink\/dtbo<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 <code>CONFIG_OF_OVERLAY<\/code> \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0443\u0442\u044c <code>\/sys\/kernel\/config\/device-tree\/overlays<\/code>. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 vendor-\u044f\u0434\u0440\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Xilinx\/AMD flow, \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0435\u0441\u0442\u044c.<br \/> \u0412 mainline-\u044f\u0434\u0440\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 overlay \u0435\u0441\u0442\u044c, \u043d\u043e configfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 <code>.dtbo<\/code> \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c.<br \/> \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>.config<\/code>, \u043d\u043e \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430:<\/p>\n<pre><code class=\"bash\">mount -t configfs none \/sys\/kernel\/configls \/sys\/kernel\/config\/device-tree\/overlays<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043d\u0435\u0442, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432 <code>.dtbo<\/code>, \u043d\u0435 \u0432 bitstream. \u041f\u0440\u043e\u0441\u0442\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044f\u0434\u0440\u0435 \u043d\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e configfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 overlay.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445 \u0434\u043b\u044f Zynq\/ZynqMP \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u0438 (\u043d\u0430 atlassian wiki \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u0430\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435):<\/p>\n<pre><code>CONFIG_CMA=yCONFIG_DMA_CMA=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 bitstream \u0447\u0435\u0440\u0435\u0437 FPGA Manager \u043d\u0430 Zynq-7000 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c:<\/p>\n<pre><code>CONFIG_FPGA=yCONFIG_FPGA_MGR_ZYNQ_FPGA=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0441 FPGA Region \u0438 Device Tree Overlay \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<\/p>\n<pre><code>CONFIG_FPGA_BRIDGE=yCONFIG_FPGA_REGION=yCONFIG_OF_FPGA_REGION=yCONFIG_OF_OVERLAY=yCONFIG_CONFIGFS_FS=y<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>CONFIG_CMA<\/code> \u0438 <code>CONFIG_DMA_CMA<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 bitstream \u0447\u0435\u0440\u0435\u0437 FPGA Manager.<\/p>\n<p>\u0410 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c:<\/p>\n<pre><code class=\"bash\">zcat \/proc\/config.gz | grep -E 'CONFIG_FPGA|CONFIG_OF_OVERLAY|CONFIG_CONFIGFS|CONFIG_CMA|CONFIG_DMA_CMA'ls \/sys\/class\/fpga_manager\/mount -t configfs none \/sys\/kernel\/configls \/sys\/kernel\/config\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 <code>\/sys\/class\/fpga_manager\/fpga0<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442 FPGA Manager \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0435\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <code>\/sys\/kernel\/config\/device-tree\/overlays<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u0437\u0438\u0442\u044c Device Tree Overlay \u0447\u0435\u0440\u0435\u0437 configfs.<br \/> \u0415\u0441\u043b\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043d\u0435\u0442, \u043d\u043e <code>CONFIG_OF_OVERLAY=y<\/code>, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0435: overlay-\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432 \u044f\u0434\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 configfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 overlay \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 device tree \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 FPGA Manager<\/h3>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c ps7_init, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 U-Boot SPL.<br \/> \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c DTS, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 ProcessingSystem, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c DTS.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u0431\u044b\u043b \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0432 DTS \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b clkc \u043d\u043e\u0434\u044b, \u0438 \u043d\u0430\u0447\u0430\u043b \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0448\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u043e\u0431\u0440\u0430\u0437\u0430 \u0441 DTS \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 bitstream. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0441\u044f bitstream \u0432 PL, \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u043c\u0438\u0433\u0430\u0442\u044c \u0434\u0438\u043e\u0434\u044b, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e Linux \u0437\u0430\u0432\u0438\u0441\u0430\u043b \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e. <\/p>\n<p>\u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0432 clkc \u043d\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u043a\u0430 fclk-enable. \u042d\u0442\u043e \u043c\u0430\u0441\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 FCLK-\u0432\u044b\u0445\u043e\u0434\u043e\u0432 PS \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 clock controller. \u0422\u043e \u0435\u0441\u0442\u044c <code>0x1<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u043c\u0443 <code>FCLK_CLK0<\/code>.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>&amp;clkc {  fclk-enable = &lt;0x0&gt;;  ps-clk-frequency = &lt;33333333&gt;;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f clk \u043e\u0442 PS \u0447\u0430\u0441\u0442\u0438, \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>&amp;clkc {    fclk-enable = &lt;0x1&gt;;    ps-clk-frequency = &lt;33333333&gt;;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c fpgautil<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0437\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c bitstream, \u0438 \u0434\u0430\u0436\u0435 DTS overlay. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 fpgautil, \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043e\u0442 Xilinx, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 FPGA Manager, sysfs\/configfs \u0438 DTO \u0432 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<pre><code class=\"bash\"># fpgautil fpgautil: FPGA Utility for Loading\/reading PL ConfigurationUsage:fpgautil -b &lt;bin file path&gt; -o &lt;dtbo file path&gt;Options: -b &lt;binfile&gt;(Bin file path)         -o &lt;dtbofile&gt;(DTBO file path)         -f &lt;flags&gt;Optional: &lt;Bitstream type flags&gt;   f := &lt;Full | Partial &gt;          -n &lt;Fpga region info&gt;  FPGA Regions represent FPGA's                                and partial reconfiguration                                regions of FPGA's in the                                Device Tree Examples:(Load Full bitstream using Overlay)fpgautil -b top.bit.bin -o can.dtbo -f Full -n full (Load Partial bitstream using Overlay)fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0(Load Full bitstream using sysfs interface)fpgautil -b top.bit.bin -f Full(Load Partial bitstream using sysfs interface)fpgautil -b rm0.bit.bin -f Partial(Remove Partial Overlay)fpgautil -R -n PR0(Remove Full Overlay)fpgautil -R -n fullNote: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 bitstream, \u0431\u0435\u0437 \u043e\u0432\u0435\u0440\u043b\u0435\u044f.<br \/> \u042f \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b bitstream \u0432 \/tmp\/blink.bit.bin, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0448\u0438\u043b \u043d\u0430\u0448 \u0431\u0438\u0442\u0441\u0442\u0440\u0438\u043c:<\/p>\n<pre><code class=\"bash\"># fpgautil -b \/tmp\/blink.bit.bin -f FullTime taken to load BIN is 69.000000 Milli SecondsBIN FILE loaded through FPGA manager successfully<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043c\u0438\u0433\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 dmesg \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435 \u043e\u0442 fpga_manager:<\/p>\n<pre><code class=\"bash\">[222.499831] fpga_manager fpga0: writing blink.bit.bin to Xilinx Zynq FPGA Manager<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c bitstream \u0447\u0435\u0440\u0435\u0437 sysfs<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0442\u0443 \u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 sysfs.<br \/> \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"bash\"># mkdir -p \/lib\/firmware# cp \/tmp\/blink.bit.bin \/lib\/firmware\/# echo 0 &gt; \/sys\/class\/fpga_manager\/fpga0\/flags# echo blink.bit.bin &gt; \/sys\/class\/fpga_manager\/fpga0\/firmware# cat \/sys\/class\/fpga_manager\/fpga0\/stateoperating<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>operating<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e FPGA Manager \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream, PL \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u042d\u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0431\u044b \u043e\u0448\u0438\u0431\u043a\u0430, \u0432\u043c\u0435\u0441\u0442\u043e <code>operating<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<p>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435:<\/p>\n<pre><code class=\"bash\">echo 0 &gt; \/sys\/class\/fpga_manager\/fpga0\/flags<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>0<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0443\u044e full reconfiguration, \u043d\u0435 partial. \u041f\u043e\u0442\u043e\u043c:<\/p>\n<pre><code class=\"bash\">echo blink.bit.bin &gt; \/sys\/class\/fpga_manager\/fpga0\/firmware<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042f\u0434\u0440\u043e \u0447\u0435\u0440\u0435\u0437 firmware loader \u0438\u0449\u0435\u0442 \u0444\u0430\u0439\u043b <code>blink.bit.bin<\/code> \u0432 firmware path, \u043e\u0431\u044b\u0447\u043d\u043e <code>\/lib\/firmware<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u0433\u043e FPGA Manager core, \u0430 \u0442\u043e\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 platform-specific \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e Xilinx Zynq FPGA Manager \u0447\u0435\u0440\u0435\u0437 DevCfg\/PCAP.<br \/> \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f post-programming \u0448\u0430\u0433\u043e\u0432 state \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>operating<\/code>.<br \/> Kernel docs \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e FPGA image \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a firmware file, \u0430 platform-specific \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u044b \u0432 low-level driver ops.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442:<br \/> <a href=\"https:\/\/www.kernel.org\/doc\/html\/latest\/driver-api\/fpga\/fpga-mgr.html%EF%BF%BC\" rel=\"noopener noreferrer nofollow\">https:\/\/www.kernel.org\/doc\/html\/latest\/driver-api\/fpga\/fpga-mgr.html<br \/><\/a> <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/drivers\/fpga\/zynq-fpga.c%EF%BF%BC\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/torvalds\/linux\/blob\/master\/drivers\/fpga\/zynq-fpga.c<br \/><\/a> <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/drivers\/fpga\/zynqmp-fpga.c\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/torvalds\/linux\/blob\/master\/drivers\/fpga\/zynqmp-fpga.c<\/a><\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b fpga_loader<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0448\u0438\u043b\u0438 bitstream \u0447\u0435\u0440\u0435\u0437 <code>fpgautil<\/code> \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 sysfs, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e C++-\u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p><code>fpgautil<\/code> \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 bring-up. \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 PL \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0447\u0430\u0441\u0442\u044c\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0443 shell-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0441\u044b:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043b\u0438 <code>fpgautil<\/code> \u0432 rootfs;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0438\u0442\u044c stdout\/stderr;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 userspace-\u0443\u0442\u0438\u043b\u0438\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 shell.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <code>fpga_loader<\/code>: CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e C++-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 Linux FPGA subsystem.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<br \/> <a href=\"https:\/\/github.com\/FernandesKA\/fpga_loader\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/FernandesKA\/fpga_loader<\/a><\/p>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043d\u0435 \u0432 \u0442\u043e\u043c \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c FPGA Manager \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0430 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 kernel-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b:<\/p>\n<pre><code>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \/ CLI        \u2193fpga_loader        \u2193sysfs FPGA Manager + configfs overlays        \u2193Linux FPGA subsystem        \u2193Zynq DevCfg \/ PCAP        \u2193        PL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u044f\u0434\u0440\u0435. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e:<\/p>\n<ol>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 bitstream \u0432 firmware directory;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 flags \u0432 FPGA Manager, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 sysfs-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0435\u0441\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream \u0447\u0435\u0440\u0435\u0437 <code>firmware_name<\/code> \u0438\u043b\u0438 <code>firmware<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 FPGA Manager;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 Device Tree Overlay \u0447\u0435\u0440\u0435\u0437 configfs.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h4>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>.\u251c\u2500\u2500 CMakeLists.txt\u251c\u2500\u2500 inc\u2502   \u251c\u2500\u2500 dt_overlay.hpp\u2502   \u251c\u2500\u2500 file_utils.hpp\u2502   \u2514\u2500\u2500 fpga_manager.hpp\u251c\u2500\u2500 scripts\u2502   \u2514\u2500\u2500 bit-to-bin.sh\u251c\u2500\u2500 src\u2502   \u251c\u2500\u2500 dt_overlay.cpp\u2502   \u251c\u2500\u2500 file_utils.cpp\u2502   \u251c\u2500\u2500 fpga_manager.cpp\u2502   \u2514\u2500\u2500 main.cpp\u2514\u2500\u2500 tests    \u251c\u2500\u2500 CMakeLists.txt    \u251c\u2500\u2500 helpers.hpp    \u251c\u2500\u2500 test_dt_overlay.cpp    \u251c\u2500\u2500 test_file_utils.cpp    \u2514\u2500\u2500 test_fpga_manager.cpp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0438\u0437 <code>main.cpp<\/code> \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p>CLI \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0435:<\/p>\n<pre><code class=\"bash\">fpga-loader statusfpga-loader \/tmp\/blink.bit.binfpga-loader -m overlay --dtbo \/tmp\/blink.dtbo --name blinkfpga-loader -m overlay --remove --name blink<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 FPGA \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0447\u0430\u0441\u0442\u044c\u044e \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>load()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e <code>bool<\/code>, \u0430 <code>LoadResult<\/code>: \u043a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 FPGA Manager.<\/p>\n<pre><code class=\"cpp\">#include &lt;chrono&gt;#include &lt;iostream&gt;#include \"fpga_manager.hpp\"int main(){    fpga::FpgaManagerConfig cfg;    cfg.manager_path = \"\/sys\/class\/fpga_manager\/fpga0\";    cfg.firmware_dir = \"\/lib\/firmware\";    cfg.timeout = std::chrono::milliseconds(5000);    cfg.verbose = true;    fpga::FpgaManager mgr(cfg);    auto result = mgr.load(\"\/tmp\/blink.bit.bin\", fpga::FpgaFlagNone);    if (!result) {        std::cerr &lt;&lt; \"FPGA load failed: \" &lt;&lt; result.message &lt;&lt; '\\n';        return 1;    }    std::cout &lt;&lt; \"FPGA programmed, state=\" &lt;&lt; result.state &lt;&lt; '\\n';    return 0;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 CMake \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cmake\">add_subdirectory(third_party\/fpga_loader)target_link_libraries(my_app PRIVATE fpga::loader)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041a\u043b\u0430\u0441\u0441 FpgaManager<\/h4>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>FpgaManager<\/code>. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0432\u044b\u0448\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 sysfs, \u043d\u043e \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>load()<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a bitstream \u0438 \u0444\u043b\u0430\u0433\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>LoadResult<\/code>:<\/p>\n<pre><code class=\"cpp\">enum class FpgaError {    Ok,    ManagerNotFound,    BitstreamNotFound,    FirmwareCopyFailed,    FlagsWriteFailed,    TriggerAttrNotFound,    TriggerWriteFailed,    StateError,    Timeout,};struct LoadResult {    FpgaError error = FpgaError::Ok;    std::string message;    std::string state;    bool ok() const;    explicit operator bool() const;};LoadResult load(const std::filesystem::path&amp; bitstream,                uint32_t flags = FpgaFlagNone);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u043d\u043e \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0430\u0439\u043b bitstream \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, FPGA Manager \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 sysfs, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c flags, \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d trigger-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>firmware_name<\/code>\/<code>firmware<\/code>, FPGA Manager \u0443\u0448\u0451\u043b \u0432 error-state \u0438\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u0432 <code>operating<\/code> \u0434\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430.<\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0430 <code>load()<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">fpga::LoadResult FpgaManager::load(const std::filesystem::path&amp; bitstream,                                   uint32_t flags){    if (!available()) {        return {FpgaError::ManagerNotFound,                \"fpga manager not found at \" + cfg_.manager_path.string()};    }    if (!std::filesystem::exists(bitstream)) {        return {FpgaError::BitstreamNotFound,                \"bitstream not found: \" + bitstream.string()};    }    std::string firmware_name;    if (!utils::copy_firmware(bitstream, cfg_.firmware_dir, firmware_name)) {        return {FpgaError::FirmwareCopyFailed,                \"failed to copy bitstream to firmware directory\"};    }    if (auto r = write_flags(flags); !r) {        return r;    }    if (auto r = trigger(firmware_name); !r) {        return r;    }    return wait_operating();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u0430\u043a\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"bash\">cp blink.bit.bin \/lib\/firmware\/blink.bit.binecho 0 &gt; \/sys\/class\/fpga_manager\/fpga0\/flagsecho blink.bit.bin &gt; \/sys\/class\/fpga_manager\/fpga0\/firmwarecat \/sys\/class\/fpga_manager\/fpga0\/state<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0432 sysfs \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f firmware. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e FPGA Manager \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 kernel firmware loader. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0435\u0436\u0430\u0442\u044c \u0432 firmware search path, \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e <code>\/lib\/firmware<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432\u0440\u043e\u0434\u0435 <code>\/tmp\/blink.bit.bin<\/code>, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 firmware, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c firmware \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.<\/p>\n<h4>firmware_name \u0438 firmware<\/h4>\n<p>\u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0434\u0440\u0430\u0445 \u0438\u043c\u044f sysfs-\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>fpga_loader<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 <code>firmware_name<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c <code>firmware<\/code>:<\/p>\n<pre><code class=\"cpp\">for (const char* attr : {\"firmware_name\", \"firmware\"}) {    auto node = cfg_.manager_path \/ attr;    if (!std::filesystem::exists(node)) {        continue;    }    return utils::write_sysfs(node, firmware_name);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0431\u0438\u0432\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438 \u043a \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 \u0438\u043b\u0438 \u043e\u0434\u043d\u043e\u043c\u0443 vendor BSP. \u0415\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043d\u0435\u0442, \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c bitstream-only \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 sysfs.<\/p>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f FPGA Manager<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043c\u0435\u043d\u0438 bitstream \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 sysfs. \u0423\u0441\u043f\u0435\u0445 \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 FPGA Manager \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>operating<\/code>.<\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430. \u041f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f <code>LoadResult{FpgaError::Ok, ..., \"operating\"}<\/code>. \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">fpga::LoadResult FpgaManager::wait_operating(){    auto deadline = std::chrono::steady_clock::now() + cfg_.timeout;    while (std::chrono::steady_clock::now() &lt; deadline) {        std::string s = state();        if (s == \"operating\") {            return {FpgaError::Ok, {}, s};        }        if (s.find(\"error\") != std::string::npos) {            return {FpgaError::StateError,                    \"FPGA manager entered error state: '\" + s + \"'\",                    s};        }        if (s == \"unknown\") {            return {FpgaError::StateError,                    \"FPGA manager state is 'unknown' after programming request\",                    s};        }        std::this_thread::sleep_for(std::chrono::milliseconds(50));    }    std::string s = state();    return {FpgaError::Timeout,            \"timeout waiting for FPGA state 'operating'\",            s};}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, FPGA Manager \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u0441\u0451 \u0440\u0430\u0437\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c:<\/p>\n<pre><code>firmware request errorparse header errorwrite init errorwrite errorwrite complete error<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u044d\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c \u043f\u0440\u043e\u0449\u0435 \u0441\u0443\u0437\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 firmware path, \u0444\u043e\u0440\u043c\u0430\u0442\u0435 FPGA image, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 FPGA \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 PCAP \u0438\u043b\u0438 \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0422\u043e\u0447\u043d\u0443\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>state<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0434\u0438\u044e, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<h4>\u0424\u043b\u0430\u0433\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h4>\n<p>FPGA Manager \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code>\/sys\/class\/fpga_manager\/fpga0\/flags<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>0<\/code>:<\/p>\n<pre><code class=\"bash\">echo 0 &gt; \/sys\/class\/fpga_manager\/fpga0\/flags<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e enum-\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>FPGA_MGR_*<\/code> \u0438\u0437 kernel header <code>include\/linux\/fpga\/fpga-mgr.h<\/code>:<\/p>\n<pre><code class=\"cpp\">enum FpgaFlags : uint32_t {    FpgaFlagNone                 = 0,    FpgaFlagPartialReconfig      = 1u &lt;&lt; 0, \/\/ FPGA_MGR_PARTIAL_RECONFIG    FpgaFlagExternalConfig       = 1u &lt;&lt; 1, \/\/ FPGA_MGR_EXTERNAL_CONFIG    FpgaFlagEncryptedBitstream   = 1u &lt;&lt; 2, \/\/ FPGA_MGR_ENCRYPTED_BITSTREAM    FpgaFlagBitstreamLsbFirst    = 1u &lt;&lt; 3, \/\/ FPGA_MGR_BITSTREAM_LSB_FIRST    FpgaFlagCompressedBitstream  = 1u &lt;&lt; 4, \/\/ FPGA_MGR_COMPRESSED_BITSTREAM};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 <code>blink.bit.bin<\/code> \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <code>FpgaFlagNone<\/code>.<\/p>\n<blockquote>\n<p>\u0412\u0430\u0436\u043d\u043e: \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u043b\u0430\u0433\u0430 \u0432 API \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e partial reconfiguration \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u044f\u0434\u0440\u0430, \u043b\u044e\u0431\u043e\u043c bitstream \u0438 \u043b\u044e\u0431\u043e\u043c device tree.<\/p>\n<\/blockquote>\n<h4>\u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 configfs \u0434\u043b\u044f Device Tree Overlay<\/h4>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u043a\u043b\u0430\u0441\u0441 <code>DtOverlay<\/code>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441 FPGA Manager \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u0441 configfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c Device Tree Overlay:<\/p>\n<pre><code>\/sys\/kernel\/config\/device-tree\/overlays\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">mount -t configfs none \/sys\/kernel\/configmkdir \/sys\/kernel\/config\/device-tree\/overlays\/blinkcat blink.dtbo &gt; \/sys\/kernel\/config\/device-tree\/overlays\/blink\/dtbo<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 overlay:<\/p>\n<pre><code class=\"bash\">rmdir \/sys\/kernel\/config\/device-tree\/overlays\/blink<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 C++ \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"cpp\">fpga::DtOverlay overlay;if (!overlay.apply(\"blink\", \"\/tmp\/blink.dtbo\")) {    return 1;}if (!overlay.remove(\"blink\")) {    return 1;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>apply()<\/code>:<\/p>\n<ol>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e configfs \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c configfs;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>.dtbo<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 overlay;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 <code>.dtbo<\/code> \u0432 \u0444\u0430\u0439\u043b <code>dtbo<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0438\u0442\u0430\u0435\u0442 <code>status<\/code> \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>applied<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">bool DtOverlay::apply(const std::string&amp; name,                      const std::filesystem::path&amp; dtbo_path,                      bool replace){    if (!ensure_mounted()) {        return false;    }    if (overlay already exists) {        if (!replace) {            return false;        }        remove(name);    }    create overlay directory;    write dtbo blob to &lt;overlay&gt;\/dtbo;    return status(name) == \"applied\";}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c: \u0437\u0430\u043f\u0438\u0441\u044c \u0432 configfs \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430. \u041c\u044b \u043f\u0438\u0448\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 kernel object, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 <code>dtbo<\/code> \u044f\u0434\u0440\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 overlay \u043a live device tree. \u0415\u0441\u043b\u0438 overlay \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 target, \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435\u0442 <code>\/sys\/kernel\/config\/device-tree\/overlays<\/code>;<\/p>\n<\/li>\n<li>\n<p>configfs \u043d\u0435 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d;<\/p>\n<\/li>\n<li>\n<p>overlay \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p><code>.dtbo<\/code> \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>dtbo<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 <code>status<\/code> \u043d\u0435 \u0441\u0442\u0430\u043b <code>applied<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 <code>--replace<\/code> \u0441\u0442\u0430\u0440\u044b\u0439 overlay \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043d\u043e\u0432\u043e\u0433\u043e.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0414\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b CLI<\/h4>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 CLI \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u0430.<\/p>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 bitstream \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 FPGA Manager sysfs:<\/p>\n<pre><code class=\"bash\">fpga-loader -m bitstream \/tmp\/blink.bit.bin<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a <code>bitstream<\/code> \u2014 \u0440\u0435\u0436\u0438\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u0440\u043e\u0447\u0435:<\/p>\n<pre><code class=\"bash\">fpga-loader \/tmp\/blink.bit.bin<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 Device Tree Overlay:<\/p>\n<pre><code class=\"bash\">fpga-loader -m overlay --dtbo \/tmp\/blink.dtbo<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">fpga-loader statusfpga-loader -m overlay --remove --name blinkfpga-loader -m overlay --replace --dtbo \/tmp\/blink.dtbo --name blink<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 bitstream:<\/p>\n<pre><code class=\"bash\"># .\/fpga-loader .\/blink.bit.binFPGA programmed: state=operating<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"bash\"># cat \/sys\/class\/fpga_manager\/fpga0\/stateoperating<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 <code>status<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 FPGA Manager, \u043d\u043e \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 overlays, \u0435\u0441\u043b\u0438 configfs \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d:<\/p>\n<pre><code class=\"bash\">fpga-loader status<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0434 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u0443<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 C++17 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 CMake, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u0442\u0430\u043a \u0438 \u0447\u0435\u0440\u0435\u0437 Buildroot SDK.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n<pre><code class=\"bash\">cmake -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build -j<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 SDK:<\/p>\n<pre><code class=\"bash\">source \/path\/to\/buildroot-sdk\/environment-setup-&lt;tuple&gt;cmake -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build -j<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 SDK CMake \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f: \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, sysroot, \u0444\u043b\u0430\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 linker flags.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"bash\">git submodule add https:\/\/github.com\/FernandesKA\/fpga\\_loader third_party\/fpga_loader<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code class=\"cmake\">add_subdirectory(third_party\/fpga_loader)target_link_libraries(my_target PRIVATE fpga::loader)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 bitstream<\/h4>\n<p>\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code>scripts\/bit-to-bin.sh<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>bootgen<\/code> \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 <code>.bit<\/code> \u0432 <code>.bit.bin<\/code>. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 <code>zynqmp<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 Zynq-7000 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043b\u0443\u0447\u0448\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e:<\/p>\n<pre><code class=\"bash\">.\/scripts\/bit-to-bin.sh --arch zynq design_1.bit<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f:<\/p>\n<pre><code>design_1.bit.bin<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 <code>\/lib\/firmware<\/code> \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 FPGA Manager.<\/p>\n<h4>\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0442\u0435\u0441\u0442\u0430\u043c\u0438<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 FPGA \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0436\u0435\u043b\u0435\u0437\u0430, unit-\u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b. \u0418\u043d\u0430\u0447\u0435 \u0442\u0435\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043b\u0430\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430, \u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f fake sysfs\/configfs \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code>\/tmp\/fpga_loader_test\/\u2514\u2500\u2500 sys\/    \u2514\u2500\u2500 class\/        \u2514\u2500\u2500 fpga_manager\/            \u2514\u2500\u2500 fpga0\/                \u251c\u2500\u2500 flags                \u251c\u2500\u2500 firmware                \u251c\u2500\u2500 firmware_name                \u2514\u2500\u2500 state<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f <code>FpgaManager<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442:<\/p>\n<ul>\n<li>\n<p>\u0447\u0442\u043e bitstream \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 firmware directory;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u0432 <code>flags<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>firmware_name<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u0435\u0441\u0442\u044c fallback \u043d\u0430 <code>firmware<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 <code>FpgaError<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 bitstream \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 <code>firmware_name<\/code>\/<code>firmware<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 FPGA Manager \u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 <code>operating<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f <code>DtOverlay<\/code> fake configfs \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 configfs, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <code>.dtbo<\/code>, \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 overlay, <code>--replace<\/code>, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 overlay, \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a overlays.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 <code>status=applied<\/code> \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u044f\u0434\u0440\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f overlay. \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u044f\u0434\u0440\u0430, \u043a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u0435 \u0436\u0438\u0432\u0451\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u044c overlay-\u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0434 \u0434\u043e\u0448\u0451\u043b \u0434\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 <code>dtbo<\/code>, \u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 apply \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e configfs \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e kernel stub.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0442\u0435\u0441\u0442 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0430\u043c PCAP \u0438 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e FPGA \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0448\u0438\u043b\u0430\u0441\u044c. \u041d\u043e \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443: \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u0443\u0442\u044f\u043c\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0414\u043b\u044f userspace-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<h4>\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435<\/h4>\n<p>\u041d\u0430 \u043c\u043e\u0435\u0439 \u043f\u043b\u0430\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d bitstream-only \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439:<\/p>\n<pre><code class=\"bash\">fpga-loader .\/blink.bit.bincat \/sys\/class\/fpga_manager\/fpga0\/state<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 FPGA Manager \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 <code>operating<\/code>, \u0430 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b \u0432 PL \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043c\u0438\u0433\u0430\u0442\u044c.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430:<\/p>\n<pre><code>Board:  RK-ZYNQ7020-FSoC:    Zynq-7000 \/ XC7Z020Flow:   Buildroot + U-Boot SPL + LinuxMethod: FPGA Manager sysfs, bitstream-onlyFormat: .bit.bin, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 bootgen<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Overlay-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c <code>fpga_loader<\/code> \u0438 \u0437\u0430\u0434\u0435\u043b \u043f\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 AXI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, <code>fpga-region<\/code>, <code>firmware-name<\/code>, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 <code>.dtbo<\/code> \u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c platform device \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0451\u043c\u043d\u043e\u0439.<\/p>\n<h4>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0423 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<br \/> <code>fpga_loader<\/code> \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 bitstream. \u041e\u043d \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 bitstream \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 FPGA, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f Vivado, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043b\u0438 \u0440\u0430\u0437\u0432\u0435\u0434\u0435\u043d\u044b clock\/reset, \u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u043b\u0438 overlay \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c device tree \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 \u043b\u0438 \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 FCLK.<\/p>\n<p>\u041e\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b Linux:<\/p>\n<ul>\n<li>\n<p>FPGA Manager \u0447\u0435\u0440\u0435\u0437 sysfs;<\/p>\n<\/li>\n<li>\n<p>firmware loader;<\/p>\n<\/li>\n<li>\n<p>Device Tree Overlay \u0447\u0435\u0440\u0435\u0437 configfs.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 bitstream \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 FPGA Manager, \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u0436\u0435\u043b\u0435\u0437\u0430. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 bitstream \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 <code>fpga_loader<\/code> \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 PL. \u0415\u0441\u043b\u0438 \u0432 PL \u0435\u0441\u0442\u044c AXI-\u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044f, DMA \u0438\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 reconfiguration \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u043a \u043d\u0435\u0439 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c userspace, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c DMA, \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c overlay, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 bitstream.<\/p>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f C++-\u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 FPGA Manager \u0438 configfs overlay. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0443\u044e CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e bring-up \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <code>fpgautil<\/code> \u0438 \u043f\u0430\u0440\u044b \u043a\u043e\u043c\u0430\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 sysfs. \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 PL \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043b\u0443\u0447\u0448\u0435 \u0438\u043c\u0435\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0442\u0435\u0441\u0442\u044b \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>fpga_loader<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435. \u041e\u043d \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 FPGA Manager, \u043d\u0435 \u043f\u0430\u0440\u0441\u0438\u0442 bitstream \u0438 \u043d\u0435 \u043b\u0435\u0447\u0438\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 device tree. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 shell-\u0441\u043a\u043b\u0435\u0439\u043a\u0443 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0430\u0451\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0439 \u0441\u043b\u043e\u0439 \u043d\u0430\u0434 sysfs\/configfs.<\/p>\n<p>\u0415\u0449\u0451 \u0440\u0430\u0437 \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<p><a href=\"https:\/\/github.com\/FernandesKA\/fpga_loader\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/FernandesKA\/fpga_loader<\/a><\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0438 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u043a\u0435!<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1052912\/\">https:\/\/habr.com\/ru\/articles\/1052912\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Buildroot \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b \u043d\u0430 \u0431\u0430\u0437\u0435 Zynq-7000. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e Linux-\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0432 Vivado \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 PL-\u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b\u0438. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 bring-up \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e: bitstream \u043e\u0431\u044b\u0447\u043d\u043e \u0448\u044c\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 JTAG \u0438\u043b\u0438 \u043a\u043b\u0430\u0434\u0443\u0442 \u0432 boot \u0440\u0430\u0437\u0434\u0435\u043b, \u0447\u0442\u043e\u0431\u044b PL \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0435\u0449\u0451 \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430 Linux. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u043d\u044f\u0442\u044c bitstream. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Linux \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 FPGA Manager.\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c PL \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Linux. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c FPGA-\u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b;\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438;\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 bitstream \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430;\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e FPGA \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 partial reconfiguration \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 \u0438 vendor flow. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u0430\u044f full reconfiguration \u043d\u0430 Zynq-7000.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c:\u0437\u0430\u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f Device Tree Overlay;\u043a\u0430\u043a\u0438\u0435 kernel options \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f FPGA Manager \u0438 overlay-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432;\u043a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c bitstream \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 Linux;\u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream \u0432 C++-\u0443\u0442\u0438\u043b\u0438\u0442\u0443.\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Zynq-7000 \u0438 Buildroot, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0444\u043e\u043a\u0443\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 Zynq-7000. \u0414\u043b\u044f ZynqMP \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0445\u043e\u0436, \u043d\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a firmware-\u0441\u0442\u0435\u043a\u0443 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 overlay. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e, \u043a\u0430\u043a fpga_loader \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 configfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DTS overlay, \u043d\u044e\u0430\u043d\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0442.\u043a. \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.\u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 PL \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e PS\/Linux \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 PL: \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c userspace, \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c\/\u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c DMA, quiesce AXI-\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0443\u0431\u0440\u0430\u0442\u044c overlay \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439. \u0418\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c bus hang, \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u044f\u0434\u0440\u0430 \u0438\u043b\u0438 device timeout.\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0442\u0435\u043c\u0435:https:\/\/xilinx-wiki.atlassian.net\/wiki\/spaces\/A\/pages\/18841645\/Solution+Zynq+PL+Programming+With+FPGA+Managerhttps:\/\/xilinx-wiki.atlassian.net\/wiki\/spaces\/A\/pages\/18841847\/Solution+ZynqMP+PL+ProgrammingFPGA Manager\u041f\u0435\u0440\u0435\u0434 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a Linux \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u0442 FPGA.\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 bitstream \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f SoC FPGA, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Zynq \u0438 Zynq UltraScale+, \u0432 \u044f\u0434\u0440\u0435 Linux \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a FPGA Manager.FPGA Manager \u2014 \u044d\u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u0441\u043b\u043e\u0439 \u0432 \u044f\u0434\u0440\u0435 Linux \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 FPGA image. \u041e\u043d \u043f\u0440\u044f\u0447\u0435\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0437\u0430 \u0435\u0434\u0438\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c: userspace \u043f\u0438\u0448\u0435\u0442 \u0438\u043c\u044f firmware, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c image \u0432 FPGA.\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:Bitstream    \u2193FPGA Manager    \u2193\u0414\u0440\u0430\u0439\u0432\u0435\u0440 FPGA    \u2193    PL\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 bitstream \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 sysfs-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 FPGA Manager. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 Zynq-7000 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0431\u043b\u043e\u043a\u043e\u043c PCAP (Processor Configuration Access Port), \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c PL \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0431\u0435\u0437 \u0443\u0447\u0430\u0441\u0442\u0438\u044f JTAG.\u041f\u0438\u0448\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e PL-\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 bitstream \u0447\u0435\u0440\u0435\u0437 FPGA Manager, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f PL.\u042f \u043d\u0435 RTL-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439: \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 Verilog\/SystemVerilog, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 bitstream \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 FPGA Manager.\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PL \u043e\u0442 PS, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0443\u0442Zynq Processing System -&gt; Clock Configuration -&gt; FCLK_CLK0IO PLL, requested freq. 50 MHz\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0438\u0433\u0430\u0442\u044c \u0434\u0438\u043e\u0434\u043e\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u043c, \u0447\u0442\u043e \u0445\u043e\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.module blink #(parameter int unsigned CLK_HZ = 50_000_000,parameter int unsigned BLINK_HZ = 1,parameter bit LED_ACTIVE_HIGH = 1&#8217;b1)(input logic clk_i,input logic rst_n,output logic led_o);initial beginif (BLINK_HZ &lt; 1) $fatal(1, &#171;BLINK_HZ must be &gt;= 1&#187;);if (CLK_HZ &lt; 1) $fatal(1, &#171;CLK_HZ must be &gt;= 1&#187;);if (CLK_HZ &lt; (BLINK_HZ * 2)) $fatal(1, &#171;CLK_HZ too low for requested BLINK_HZ&#187;);endlocalparam int unsigned COUNT_MAX = CLK_HZ \/ (BLINK_HZ * 2);localparam int unsigned DIV_MAX = COUNT_MAX &#8212; 1;localparam int unsigned CNT_W = (COUNT_MAX &lt;= 1) ? 1 : $clog2(COUNT_MAX);logic [CNT_W-1:0] cnt;logic led_raw;always_ff @(posedge clk_i or negedge rst_n) beginif (!rst_n) begincnt &lt;= &#8216;0;led_raw &lt;= 1&#8217;b0;end else if (cnt == DIV_MAX[CNT_W-1:0]) begincnt &lt;= &#8216;0;led_raw &lt;= ~led_raw;end else begincnt &lt;= cnt + 1&#8217;b1;endendalways_comb beginled_o = (LED_ACTIVE_HIGH) ? led_raw : ~led_raw;endendmodule\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0441\u0438\u043d\u0442\u0435\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 BlockDesign, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u041f\u041a\u041c -&gt; Add module.\u041e\u0434\u043d\u0430\u043a\u043e, \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c SystemVerilog \u043c\u043e\u0434\u0443\u043b\u044c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 wrapper \u043d\u0430 Verilog, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c.module blink_bd (    input  wire       clk_i,    input  wire       rst_n,    output wire [1:0] led_o);wire led_blink;blink #(    .CLK_HZ(50000000),    .BLINK_HZ(1),    .LED_ACTIVE_HIGH(1&#8217;b1)) u_blink (    .clk_i(clk_i),    .rst_n(rst_n),    .led_o(led_blink));assign led_o[0] = led_blink;assign led_o[1] = ~led_blink;endmodule\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c (\u041f\u041a\u041c -&gt; Add module)\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043a\u043b\u043e\u043a\u0438, reset, \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0440\u0443\u0436\u0443 led_o \u0422\u044b\u043a\u0430\u0435\u043c \u041f\u041a\u041c led_o, make external.\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e BlockDesign \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0435\u0439\u043d\u0430\u0445 \u044f \u0443\u043a\u0430\u0436\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0434\u043b\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 (\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0432\u0435 \u0448\u0442\u0443\u043a\u0438):## LEDs (PL pins)set_property IOSTANDARD LVCMOS33 [get_ports {led_o_0[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {led_o_0[1]}]  set_property PACKAGE_PIN V15 [get_ports {led_o_0[0]}]set_property PACKAGE_PIN V13 [get_ports {led_o_0[1]}]\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442. \u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0448 xsa \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0451 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0438 ps_init, \u0442\u043e \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0421\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u043c, \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c.\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0442\u0441\u0442\u0440\u0438\u043c.\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c xsa \u0444\u0430\u0439\u043b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 bitstream. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0432 \u0432\u043e\u0442 \u0441\u044e\u0434\u0430: Export hardware, Include bitstream\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u0442\u044c \u043d\u0430\u0448 xsa \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 buildroot. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; ps_init_gpl (c + h) \u0438\u0437 xsa \u0444\u0430\u0439\u043b\u0430, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 DTS. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0434\u043b\u044f Zynq-7000 \u0432 Xilinx\/AMD FPGA Manager flow \u0432 PL \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 .bit, \u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 .bin, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 .bit \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e bootgen. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 .bin \u0444\u0430\u0439\u043b \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f FPGA Manager \u0447\u0435\u0440\u0435\u0437 firmware\/firmware-name.\u0414\u043b\u044f ZynqMP flow \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 PL \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 platform firmware, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 Xilinx\/AMD software stack \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e flow. \u0412 PetaLinux\/AMD flow \u0434\u043b\u044f Zynq UltraScale+ \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f bitstream \u0432 .bin \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0438\u043b\u0438 .pdi, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c Zynq-7000 \u0438 ZynqMP. \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c Zynq-7000, \u0433\u0434\u0435 \u0434\u043b\u044f FPGA Manager \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e .bin.\u0414\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0443 \u0441\u0435\u0431\u044f \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 bash-\u0441\u043a\u0440\u0438\u043f\u0442 (\u0435\u0441\u043b\u0438 \u0447\u0442\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 scripts):#!\/bin\/bashshow_usage() {    echo &#171;Usage: $0 [options] &lt;input.bit&gt; [output.bin]&#187;    echo &#171;&#187;    echo &#171;Options:&#187;    echo &#187;  -a, &#8212;arch &lt;arch&gt;    \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: zynq, zynqmp (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: zynqmp)&#187;    echo &#187;  -h, &#8212;help           \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u043f\u0440\u0430\u0432\u043a\u0443&#187;    echo &#171;&#187;    echo &#171;Arguments:&#187;    echo &#187;  input.bit            \u0412\u0445\u043e\u0434\u043d\u043e\u0439 bitstream \u0444\u0430\u0439\u043b&#187;    echo &#187;  output.bin           (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e) \u0418\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430&#187;    echo &#171;&#187;    echo &#171;Examples:&#187;    echo &#187;  $0 design.bit                          # ZynqMP, output: design.bit.bin&#187;    echo &#187;  $0 design.bit fpga.bin                 # ZynqMP, output: fpga.bin&#187;    echo &#187;  $0 &#8212;arch zynq design.bit                # Zynq-7000, output: design.bit.bin&#187;    echo &#187;  $0 -a zynq design.bit output.bin         # Zynq-7000, output: output.bin&#187;    exit 0}ARCH=&#187;zynqmp&#187;while [[ $# -gt 0 ]]; do    case $1 in        -a|&#8212;arch)            ARCH=&#187;$2&#8243;            shift 2            ;;        -h|&#8212;help)            show_usage            ;;        -*)            echo &#171;Error: Unknown option $1&#187;            show_usage            ;;        *)            break            ;;    esacdoneif [ $# -lt 1 ]; then    echo &#171;Error: Missing input file&#187;    echo &#171;&#187;    show_usagefiINPUT_BIT=&#187;$1&#8243;if [ ! -f &#171;$INPUT_BIT&#187; ]; then    echo &#171;Error: File &#8216;$INPUT_BIT&#8217; not found&#187;    exit 1fiif [ &#171;$ARCH&#187; != &#171;zynq&#187; ] &amp;&amp; [ &#171;$ARCH&#187; != &#171;zynqmp&#187; ]; then    echo &#171;Error: Invalid architecture &#8216;$ARCH'&#187;    echo &#171;Supported architectures: zynq, zynqmp&#187;    exit 1fiif [ $# -ge 2 ]; then    OUTPUT_BIN=&#187;$2&#8243;else    OUTPUT_BIN=&#187;${INPUT_BIT}.bin&#187;fiecho &#171;Converting bitstream:&#187;echo &#187;  Input:       $INPUT_BIT&#187;echo &#187;  Output:      $OUTPUT_BIN&#187;echo &#187;  Target arch: $ARCH&#187;BIF_FILE=&#187;bitstream_temp.bif&#187;echo &#171;all : { $INPUT_BIT }&#187; &gt; &#171;$BIF_FILE&#187;# \u041f\u0443\u0442\u044c \u043a bootgen (\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 Vivado)BOOTGEN=&#187;bootgen&#187;# \u0415\u0441\u043b\u0438 bootgen \u043d\u0435 \u0432 PATH, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0443\u0442\u044c:BOOTGEN=&#187;\/home\/fka\/tools\/Xilinx\/2025.1\/Vitis\/bin\/bootgen&#187;if ! command -v $BOOTGEN &amp;&gt; \/dev\/null; then    echo &#171;Error: bootgen not found in PATH&#187;    echo &#171;Please install Xilinx Vivado or set BOOTGEN variable to bootgen path&#187;    rm -f &#171;$BIF_FILE&#187;    exit 1fiecho &#171;Running bootgen with architecture: $ARCH&#187;$BOOTGEN -image &#171;$BIF_FILE&#187; -arch &#171;$ARCH&#187; -process_bitstream binif [ $? -ne 0 ]; then    echo &#171;Error: bootgen conversion failed&#187;    rm -f &#171;$BIF_FILE&#187;    exit 1fiTEMP_BIN=&#187;${INPUT_BIT}.bin&#187;if [ &#171;$TEMP_BIN&#187; != &#171;$OUTPUT_BIN&#187; ]; then    if [ -f&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-485335","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=485335"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485335\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=485335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=485335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=485335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}