{"id":261884,"date":"2015-07-20T17:04:03","date_gmt":"2015-07-20T13:04:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=261884"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=261884","title":{"rendered":"\u041a\u0430\u043a Python \u0438 Jinja \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c FPGA \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443"},"content":{"rendered":"<p>     \t\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u0422\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438? \u041b\u0438\u0431\u043e \u0441\u043c\u0438\u0440\u044f\u044e\u0442\u0441\u044f, \u043b\u0438\u0431\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443:  <\/p>\n<ul>\n<li> \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u044f\u0437\u044b\u043a\u0430 Verilog, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 ASIC\/FPGA, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b>Python<\/b> \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <b>Jinja<\/b>.<\/li>\n<li> \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 IP-\u044f\u0434\u0435\u0440, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e-\u0441\u0442\u0430\u0442\u0443\u0441\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438\u0437 \u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442!<br \/>  <a name=\"habracut\"><\/a><\/p>\n<h3>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/h3>\n<p>  \u0418\u0441\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 <b>Verilog-2001<\/b> \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440:<\/p>\n<pre><code class=\"vhdl\">module simple_mux #(   parameter D_WIDTH = 8 ) (    input  [D_WIDTH-1:0] data_0_i,   input  [D_WIDTH-1:0] data_1_i,    input                sel_i,    output [D_WIDTH-1:0] data_o  );  assign data_o = ( sel_i ) ? ( data_1_i ):                             ( data_0_i );  endmodule <\/code><\/pre>\n<p>  \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 \u043d\u0430 24\/48 \u043f\u043e\u0440\u0442\u043e\u0432, \u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0440\u0442\u043e\u0432\u044b\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440\u044b). <\/p>\n<p>  \u0414\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e:  <\/p>\n<pre><code class=\"vhdl\">input [D_WIDTH-1:0] data_0_i, input [D_WIDTH-1:0] data_1_i, ... input [D_WIDTH-1:0] data_47_i, <\/code><\/pre>\n<p>  \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043d\u0443\u0436\u0435\u043d \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0433\u0434\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043e\u0434\u0438\u043d, \u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0447\u0438\u0442\u0430\u0439, \u043f\u043e\u0440\u0442\u043e\u0432). <\/p>\n<p>  \u0414\u0443\u0448\u0430 \u043f\u0440\u043e\u0441\u0438\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"vhdl\">module simple_mux #(   parameter D_WIDTH   = 8,   parameter PORT_CNT  = 48,    \/\/ internal param   parameter SEL_WIDTH = $clog2( PORT_CNT ) ) (    input  [D_WIDTH-1:0]   data_i [PORT_CNT-1:0],    input  [SEL_WIDTH-1:0] sel_i,    output [D_WIDTH-1:0]   data_o  );  assign data_o = data_i[ sel_i ];  endmodule <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432 \u043f\u043e\u0440\u0442\u0430\u0445 \u043c\u043e\u0434\u0443\u043b\u044f <b>\u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f<\/b> \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c IEEE 1364-2001 (\u0433\u0434\u0435 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d Verilog-2001).<\/p>\n<p>  \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <b>Quartus<\/b> \u0432\u044b\u0434\u0430\u0441\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<br \/>  <code> Error (10773): Verilog HDL error: declaring module ports or function arguments with unpacked array types requires SystemVerilog extensions <\/code><\/p>\n<p>  \u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c?<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SystemVerilog.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\ud83d\ude42  <\/div>\n<\/div>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0431\u0445\u043e\u0434\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043d\u0430 <a href=\"http:\/\/stackoverflow.com\/questions\/16369698\/how-to-pass-array-structure-between-two-verilog-modules\">StackOverflow<\/a>. \u0418\u0434\u0435\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f, \u043d\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \ud83d\ude42<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u0440\u0443\u0447\u043a\u0430\u043c\u0438, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0447\u0442\u043e\u0431\u044b \u0437\u0430 \u043d\u0430\u0441 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043c\u0430\u0448\u0438\u043d\u0430:<br \/>  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <b>Template<\/b> \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430 <b>Jinja2<\/b><\/p>\n<pre><code class=\"python\">  t = Template(u&quot;&quot;&quot;  module {{name}} #(   parameter D_WIDTH = 8 ) ( {%- for p in ports %}   input  [D_WIDTH-1:0]       data_{{p}}_i, {%- endfor %}    input  [{{sel_width-1}}:0] sel_i,    output [D_WIDTH-1:0]       data_o );  always @(*)   begin     case( sel_i ) {% for p in ports %}     {{sel_width}}'d{{p}}:        begin         data_o = data_{{p}}_i;       end {%  endfor %}     endcase   end endmodule  &quot;&quot;&quot;)    print t.render(        n         = 4,        sel_width = 2,        name      = &quot;simple_mux_4habr&quot;,        ports     = range( 4 )   ) <\/code><\/pre>\n<p>  \u041c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043c\u043e\u0434\u0443\u043b\u044f, \u0433\u0434\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b>for<\/b> \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u0440\u043d\u0443\u043b\u0438 <b>render<\/b>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0440\u0442\u043e\u0432, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u043f\u0440.). \u042d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b>{{ }}<\/b> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043c\u0435\u0441\u0442\u043e.<\/p>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"vhdl\">module simple_mux_4habr #(   parameter D_WIDTH = 8 ) (   input  [D_WIDTH-1:0]       data_0_i,   input  [D_WIDTH-1:0]       data_1_i,   input  [D_WIDTH-1:0]       data_2_i,   input  [D_WIDTH-1:0]       data_3_i,    input  [1:0] sel_i,    output [D_WIDTH-1:0]       data_o );  always @(*)   begin     case( sel_i )      2'd0:        begin         data_o = data_0_i;       end      2'd1:        begin         data_o = data_1_i;       end      2'd2:        begin         data_o = data_2_i;       end      2'd3:        begin         data_o = data_3_i;       end      endcase   end endmodule <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0435\u043b\u0435\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438, \u043d\u043e \u0435\u0449\u0435 \u0438 \u0442\u0438\u043f\u044b Python&#8217;a (\u043b\u0438\u0441\u0442\u044b, \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432), \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043a\u043e\u0434\u0435 Python&#8217;a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"python\">{{ foo['bar'] }} <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e perl\/sed\/awk \u0438 \u043f\u0440.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u043f\u0440\u043e Jinja \u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c, \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439. \u042f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u0438 FPGA \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0434\u043e\u043b\u0436\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0432\u0430\u0441 \u043a \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<h3>IP-\u044f\u0434\u0440\u0430<\/h3>\n<p>  \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 ASIC\/FPGA \u0438\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043a IP-\u044f\u0434\u0440\u0430. \u041d\u0435 \u0432\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e IP-\u044f\u0434\u0440\u043e \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. <\/p>\n<p>  \u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 IP-\u044f\u0434\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0438\u043b\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u044e\u0442\u0441\u044f, <s>\u0432\u043e\u0440\u0443\u044e\u0442\u0441\u044f<\/s>\/<s>\u0432\u0437\u043b\u0430\u043c\u044b\u0432\u0430\u044e\u0442\u0441\u044f<\/s>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b (\u0442\u0438\u043f\u0430 AXI \u0438\u043b\u0438 Avalon). \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u0440\u0443\u0447\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0433\u0434\u0435 \u043c\u044b\u0448\u043a\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u0438\u043a\u0430\u0442\u044c \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u044f\u0434\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <b>Qsys<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 <b>Quartus<\/b>.<\/p>\n<p>  \u041f\u043b\u044e\u0441\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b:  <\/p>\n<ul>\n<li>\u0440\u0435\u044e\u0437 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/li>\n<li>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f\u0434\u0435\u0440<\/li>\n<li>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438<\/li>\n<\/ul>\n<p>  \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u0438\u043d\u0443\u0441\u043e\u0432 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0432\u0435\u0440\u0445\u044d\u0434 \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b: \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430, \u0442\u0430\u043a \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u044f\u0447\u0435\u0435\u043a).<\/p>\n<p>  \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044f\u0434\u0435\u0440 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e-\u0441\u0442\u0430\u0442\u0443\u0441\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 <b>CSR<\/b>. <\/p>\n<p>  \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043d\u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 32-\u0431\u0438\u0442\u043d\u044b\u043c), \u0433\u0434\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u043b\u044f\u043c, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b:  <\/p>\n<ul>\n<li><b>RW<\/b> \u2014 read and write: \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c. \u0421\u043b\u0443\u0436\u0430\u0442 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043f\u0440.). <\/li>\n<li><b>RW\/SC<\/b> \u2014 read write self clear: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0442\u043e \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u0441\u0431\u0440\u043e\u0441\u0438\u0442 \u0432 \u043d\u043e\u043b\u044c (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0440\u0435\u0441\u0435\u0442\u0430 \u044f\u0434\u0440\u0430 \u0438\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u044f \u044f\u0434\u0440\u0430: \u0441\u0442\u0430\u0432\u0438\u0448\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0430 \u043e\u043d \u0441\u0430\u043c \u0441\u0431\u0440\u043e\u0441\u0438\u0442 \u0441\u0435\u0431\u044f \u0432 \u043d\u043e\u043b\u044c).<\/li>\n<li><b>RO<\/b> \u2014 read only: \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0438\u043b\u0438 \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0434\u0440\u0430). \u0422\u0430\u043a \u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f RO \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0435\u0440\u0441\u0438\u044e \u044f\u0434\u0440\u0430, \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (capabilities) ).<\/li>\n<li><b>RO\/LL<\/b> \u0438 <b>RO\/LH<\/b> \u2014 read only latch low \/ latch high: \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0445\u0438\u0442\u0440\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u2014 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u0432\u0430\u0440\u0438\u0439, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0444\u043e\u0448\u043a\u0438 (\u0441\u0438\u0433\u043d\u0430\u043b <b>full<\/b> \u0441\u0442\u0430\u043b \u0440\u0430\u0432\u043d\u044b\u043c \u0435\u0434\u0438\u043d\u0438\u0446\u0435), \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 RO \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0442\u043e CPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0442.\u043a. \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0442\u043e\u0432. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c LH, \u0442\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u043e\u043d\u043e \u0437\u0430\u0449\u0435\u043b\u043a\u043d\u0435\u0442\u0441\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0431\u044b\u043b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u043d\u043e\u043b\u044c. <\/li>\n<\/ul>\n<p>  \u0412 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0439, \u043f\u0440\u0438\u0447\u0435\u043c \u0438\u0445 \u0440\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b. <\/p>\n<p>  CSR \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u043f\u043e\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 I2C \u044d\u043a\u0441\u043f\u0430\u043d\u0434\u0435\u0440\u043e\u0432, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440\u0430\u043c\u0438, \u0438 \u0434\u0430\u0436\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430\u043c\u0438. <\/p>\n<p>  \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f? <br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c MAC-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 <b>Triple Speed Ethernet<\/b> \u043e\u0442 \u0444\u0438\u0440\u043c\u044b Altera. \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u043e\u0435\u043c <a href=\"https:\/\/www.altera.com\/en_US\/pdfs\/literature\/ug\/ug_ethernet.pdf\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a> \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043d\u0430 \u0433\u043b\u0430\u0432\u0443 <b>Configuration Register Space<\/b>, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u0432 \u0432\u0441\u0435\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044f\u0434\u0440\u043e\u043c, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432). <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0447\u0430\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b:<br \/>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/files\/cb1\/c2f\/c89\/cb1c2fc895b847fab2da36648f154254.png\" alt=\"image\"\/><\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u044b, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e IP-\u044f\u0434\u0440\u043e.<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b 0x03 \u0438 0x04 \u0432 \u044d\u0442\u043e\u043c \u044f\u0434\u0440\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 MAC-\u0430\u0434\u0440\u0435\u0441\u0430. \u0414\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u044f\u0434\u0440\u0430 (\u043e\u0442 Xilinx \u0438\u043b\u0438 \u043e\u0442 Intel) \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b.<\/p>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043c\u0435\u043d\u0430 MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u0432 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/drivers\/net\/ethernet\/altera\/altera_tse_main.c\">\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/a>:<\/p>\n<pre><code>static void tse_update_mac_addr(struct altera_tse_private *priv, u8 *addr) {     u32 msb;     u32 lsb;      msb = (addr[3] &lt;&lt; 24) | (addr[2] &lt;&lt; 16) | (addr[1] &lt;&lt; 8) | addr[0];     lsb = ((addr[5] &lt;&lt; 8) | addr[4]) & 0xffff;      \/* Set primary MAC address *\/     csrwr32(msb, priv-&gt;mac_dev, tse_csroffs(mac_addr_0));     csrwr32(lsb, priv-&gt;mac_dev, tse_csroffs(mac_addr_1)); } <\/code><\/pre>\n<p>  <b>mac_addr_0<\/b> \u0438 <b>mac_addr_1<\/b> \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448\u0438 0x03 \u0438 0x04, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u0438\u0442\u0440\u043e (\u043d\u0430 \u043c\u043e\u0439 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0445\u043e\u0442\u044f \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e, \u0447\u0442\u043e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u0445 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/drivers\/net\/ethernet\/altera\/altera_tse.h\">\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435<\/a>.<\/p>\n<p>  \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IP-\u044f\u0434\u0440\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 CSR, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0442\u043e, \u0447\u0442\u043e, \u043a\u0430\u043a \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c. \u042d\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043e\u043d\u0438 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0438\u0448\u0443\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 <b>tse_update_mac_addr<\/b> \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \ud83d\ude42<\/p>\n<h3>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044f\u0434\u0435\u0440<\/h3>\n<p>  \u0427\u0430\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u0434\u043d\u0438\u043c \u044f\u0434\u0440\u043e\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u2014 \u0438\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e.<br \/>  \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u0448\u0438\u043d\u0443, \u0432\u044b\u0434\u0435\u043b\u0438\u0432 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u044f\u0434\u0435\u0440 \u0441\u0432\u043e\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e:  <\/p>\n<ul>\n<li>IP-\u044f\u0434\u0440\u043e A: 0x0000 \u2014 0x00FF<\/li>\n<li>IP-\u044f\u0434\u0440\u043e B: 0x0100 \u2014 0x01FF<\/li>\n<li>IP-\u044f\u0434\u0440\u043e C: 0x0200 \u2014 0x02FF<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u0443\u0440\u043e\u0432\u043d\u044e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 0x03 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u044f\u0434\u0440\u0430 B, \u0442\u043e \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x0103. (\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0435 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435, \u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x010C).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/files\/981\/287\/990\/981287990a9841dfaac5d85319ed3235.png\" alt=\"image\"\/><\/p>\n<p>  \u041c\u0430\u0441\u0442\u0435\u0440 (\u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c CPU (ARM\/x86) \u0438\u043b\u0438 MCU, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u043e\u0435 IP-\u044f\u0434\u0440\u043e) \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IP-\u044f\u0434\u0440\u0430 \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 (AXI \u0438\u043b\u0438 Avalon). <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043b\u0435\u0439\u0432\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u043d\u0442\u0435\u0440\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430 (\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440 \u0438\u043b\u0438 \u0430\u0440\u0431\u0438\u0442\u0440 \u0448\u0438\u043d\u044b). \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u0442\u0430\u043a \u0436\u0435 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0448\u0438\u043d\u0443, \u043f\u043e\u043a\u0430 \u0441\u043b\u0435\u0439\u0432 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0438 \u0442.\u0434. \u0422\u0430\u043a, \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u044b\u043b 0x0103, \u0430 \u043f\u043e\u0441\u043b\u0435 \u2014 0x0003, \u0442.\u043a. IP-\u044f\u0434\u0440\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 (\u0434\u0430 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e) \u043a\u0430\u043a\u043e\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0437\u0430 \u043d\u0438\u043c \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043e.<\/p>\n<h3>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 IP-\u044f\u0434\u0440\u043e (\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443)<\/h3>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 IP-\u044f\u0434\u0440\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0438\u0445 \u0432 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 IP-\u044f\u0434\u0440\u0430, \u043d\u043e \u0441\u043a\u0440\u044b\u0442\u044b \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0438\u0440\u0430. <\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 IP-\u044f\u0434\u0440\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 Ethernet-\u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <a href=\"http:\/\/metrotek.spb.ru\/b100.html\">\u0438\u0437\u043c\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c<\/a> <a href=\"http:\/\/metrotek.spb.ru\/b3etx.html\">\u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0438<\/a>.<\/p>\n<p>  \u041f\u0443\u0441\u043a\u0430\u0439 \u0443 \u044d\u0442\u043e \u044f\u0434\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b:  <\/p>\n<pre><code>0x0: [7:0]   - IP_CORE_VERSION [RO] - \u0412\u0435\u0440\u0441\u0438\u044f IP-\u044f\u0434\u0440\u0430 [15:8]  - Reserved [16]    - GEN_EN [RW] - \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 [17]    - GEN_ERROR [ROLH] - \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 [30:18] - Reserved [31]    - GEN_RESET [RWSC] - \u0421\u0431\u0440\u043e\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430  0x1: [31:0]  - IP_DST [RW] - IP-\u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432  0x2: [15:0]  - FRM_SIZE [RW] - \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430 [31:16] - Reserved  0x3: [31:0]  - FRM_CNT [RO] - \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <\/code><\/pre>\n<p>  \u0421\u0430\u043c\u043e IP-\u044f\u0434\u0440\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/751\/7ce\/811\/7517ce8116cc45cc8957a56967210e7b.png\" alt=\"image\"\/><\/p>\n<p>  \u041c\u043e\u0434\u0443\u043b\u044c <b>csr_map<\/b> \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u00ab\u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438\u00bb \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f <b>traffic_generator<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0435\u0434\u043a\u043e IP-\u044f\u0434\u0440\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439: \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 IP-\u044f\u0434\u0440\u0430.<\/p>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u043a \u0447\u0435\u043c\u0443 \u044f \u043a\u043b\u043e\u043d\u044e: <br \/>  <i>\u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0438 \u044d\u0442\u043e\u0442 <b>csr_map<\/b> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432<\/i>? <\/p>\n<p>  \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434 \u0441\u043e\u0442\u043d\u044e, \u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u043e:  <\/p>\n<ul>\n<li>\u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0442\u044f\u0442 \u0437\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043d\u0443\u0441 \u043e\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 (\u0430\u0432\u0442\u043e\u0441\u0433\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0447\u0430\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442).<\/li>\n<li>\u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0445\u0430\u0431\u0440\u0430 (\u043d\u0443, \u0438\u043b\u0438 \u0433\u0438\u043a\u0442\u0430\u0439\u043c\u0441\u0430, \u0442.\u043a. \u0445\u0430\u0431 FPGA \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b \u0442\u0443\u0434\u0430 &gt;_&lt;) \u0438\u043b\u0438 \u0438\u0433\u0440\u0443 \u0432 \u043a\u0438\u043a\u0435\u0440.<\/li>\n<\/ul>\n<h3>\u0420\u0435\u0448\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443<\/h3>\n<p>  \u0414\u0435\u043b\u0430\u0435\u043c \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c, \u0438 \u043f\u043e \u0431\u0438\u0442\u0430\u043c (\u043f\u043e\u043b\u044f\u043c).   <\/p>\n<pre><code class=\"python\">class Reg( ):    def __init__( self, num, name ):     self.num          = '{:X}'.format( num )     self.name         = name     self.name_lowcase = self.name.lower()     self.bits         = []      def add_bits( self, reg_bits ):     self.bits.append( reg_bits )  class RegBits( ):    def __init__( self, bit_msb, bit_lsb, name, mode = &quot;RW&quot;, init_value = 0 ):     self.bit_msb      = bit_msb     self.bit_lsb      = bit_lsb     self.width        = bit_msb - bit_lsb + 1     self.name         = name     self.name_lowcase = self.name.lower()     self.mode         = mode     self.init_value   = '{:X}'.format( init_value )      # bit modes:     # RO       - read only     # RO_CONST - read only, constant value      # RO_LH    - read only, latch high     # RO_LL    - read only, latch low     # RW       - read and write     # RW_SC    - read and write, self clear     assert self.mode in [&quot;RO&quot;, &quot;RO_CONST&quot;, &quot;RO_LH&quot;, &quot;RO_LL&quot;, &quot;RW&quot;, &quot;RW_SC&quot; ], &quot;Unknown bit mode&quot;           if self.mode in [&quot;RO_LH&quot;, &quot;RO_LL&quot;, &quot;RW_SC&quot;]:       assert self.width == 1, &quot;Wrong width for this bit mod&quot;       self.port_signal_input  = self.mode in [&quot;RO&quot;, &quot;RO_LH&quot;, &quot;RO_LL&quot;]     self.port_signal_output = self.mode in [&quot;RW&quot;, &quot;RW_SC&quot;]     self.need_port_signal   = self.port_signal_input or self.port_signal_output <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CSR:  <\/p>\n<pre><code class=\"python\">  MODULE_NAME = &quot;trafgen_map_4habr&quot;    r0 = Reg( 0x0, &quot;MAIN&quot;)   r0.add_bits( RegBits( 7, 0,   &quot;IP_CORE_VERSION&quot;,  &quot;RO_CONST&quot;, 0x7      ) )   r0.add_bits( RegBits( 16, 16, &quot;GEN_EN&quot; ,   &quot;RW&quot;      ) )   r0.add_bits( RegBits( 17, 17, &quot;GEN_ERROR&quot;, &quot;RO_LH&quot; ) )   r0.add_bits( RegBits( 31, 31, &quot;GEN_RESET&quot;, &quot;RW_SC&quot; ) )    r1 = Reg( 0x1, &quot;IP_DST&quot; )   # let ip destination in reset will be 178.248.233.33 ( habrahabr.ru )   r1.add_bits( RegBits( 31, 0, &quot;IP_DST&quot;, &quot;RW&quot;, 0xB2F8E921  ) )    r2 = Reg( 0x2, &quot;FRM_SIZE&quot; )   r2.add_bits( RegBits( 15, 0, &quot;FRM_SIZE&quot;, &quot;RW&quot;, 64  ) )    r3 = Reg( 0x3, &quot;FRM_CNT&quot; )   r3.add_bits( RegBits( 31, 0, &quot;FRM_CNT&quot;, &quot;RO&quot; ) )    reg_l = [r0, r1, r2, r3] <\/code><\/pre>\n<p>  \u0421\u0430\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\"><a href=\"https:\/\/github.com\/johan92\/csr-map-generator\/blob\/master\/csr_map_generator.py\">\u0412\u044b\u043b\u043e\u0436\u0438\u043b \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431<\/a>  <\/div>\n<\/div>\n<p>  \u0414\u0435\u0440\u0433\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0430:  <\/p>\n<pre><code>  res = csr_map_template.render(       module_name = MODULE_NAME,       reg_d_w     = 32,       reg_a_w     = 8,       data        = reg_l   ) <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"vhdl\">\/\/ Generated using CSR map generator  \/\/ https:\/\/github.com\/johan92\/csr-map-generator  module trafgen_map_4habr(   \/\/ Register MAIN signals   output       [0:0]      gen_en_o,    input        [0:0]      gen_error_i,   output       [0:0]      gen_reset_o,    \/\/ Register IP_DST signals   output       [31:0]     ip_dst_o,     \/\/ Register FRM_SIZE signals   output       [15:0]     frm_size_o,    \/\/ Register FRM_CNT signals   input        [31:0]     frm_cnt_i,     \/\/ CSR interface   input        [0:0]      reg_clk_i,   input        [0:0]      reg_rst_i,   input        [31:0]     reg_wr_data_i,   input        [0:0]      reg_wr_en_i,   input        [0:0]      reg_rd_en_i,   input        [7:0]      reg_addr_i,   output       [31:0]     reg_rd_data_o );  \/\/ ****************************************** \/\/        Register MAIN  \/\/ ******************************************  logic [31:0] reg_0_main_read; logic [7:0] reg_0_main___ip_core_version = 8'h7; logic [0:0] reg_0_main___gen_en = 1'h0; logic [0:0] reg_0_main___gen_error = 1'h0; logic [0:0] reg_0_main___gen_reset = 1'h0;    always_ff @( posedge reg_clk_i or posedge reg_rst_i )   if( reg_rst_i )     reg_0_main___gen_en &lt;= 1'h0;   else      if( reg_wr_en_i && ( reg_addr_i == 8'h0 ) )       reg_0_main___gen_en &lt;= reg_wr_data_i[16:16];  always_ff @( posedge reg_clk_i or posedge reg_rst_i )   if( reg_rst_i )     reg_0_main___gen_error &lt;= 1'h0;   else     begin       if( reg_rd_en_i && ( reg_addr_i == 8'h0 ) )         reg_0_main___gen_error &lt;= 1'h0;               if( gen_error_i == 1'b1 )         reg_0_main___gen_error &lt;= 1'b1;     end    always_ff @( posedge reg_clk_i or posedge reg_rst_i )   if( reg_rst_i )     reg_0_main___gen_reset &lt;= 1'h0;   else      if( reg_wr_en_i && ( reg_addr_i == 8'h0 ) )       reg_0_main___gen_reset &lt;= reg_wr_data_i[31:31];     else       reg_0_main___gen_reset &lt;= 1'h0;      \/\/ assigning to output assign gen_en_o = reg_0_main___gen_en; assign gen_reset_o = reg_0_main___gen_reset;  \/\/ assigning to read data always_comb   begin     reg_0_main_read        = 32'h0;     reg_0_main_read[7:0]   = reg_0_main___ip_core_version;     reg_0_main_read[16:16] = reg_0_main___gen_en;     reg_0_main_read[17:17] = reg_0_main___gen_error;     reg_0_main_read[31:31] = reg_0_main___gen_reset;   end  \/\/ ****************************************** \/\/        Register IP_DST  \/\/ ******************************************  logic [31:0] reg_1_ip_dst_read; logic [31:0] reg_1_ip_dst___ip_dst = 32'hB2F8E921;   always_ff @( posedge reg_clk_i or posedge reg_rst_i )   if( reg_rst_i )     reg_1_ip_dst___ip_dst &lt;= 32'hB2F8E921;   else      if( reg_wr_en_i && ( reg_addr_i == 8'h1 ) )       reg_1_ip_dst___ip_dst &lt;= reg_wr_data_i[31:0];   \/\/ assigning to output assign ip_dst_o = reg_1_ip_dst___ip_dst;  \/\/ assigning to read data always_comb   begin     reg_1_ip_dst_read        = 32'h0;     reg_1_ip_dst_read[31:0]  = reg_1_ip_dst___ip_dst;   end  \/\/ ****************************************** \/\/        Register FRM_SIZE  \/\/ ******************************************  logic [31:0] reg_2_frm_size_read; logic [15:0] reg_2_frm_size___frm_size = 16'h40;   always_ff @( posedge reg_clk_i or posedge reg_rst_i )   if( reg_rst_i )     reg_2_frm_size___frm_size &lt;= 16'h40;   else      if( reg_wr_en_i && ( reg_addr_i == 8'h2 ) )       reg_2_frm_size___frm_size &lt;= reg_wr_data_i[15:0];   \/\/ assigning to output assign frm_size_o = reg_2_frm_size___frm_size;  \/\/ assigning to read data always_comb   begin     reg_2_frm_size_read        = 32'h0;     reg_2_frm_size_read[15:0]  = reg_2_frm_size___frm_size;   end  \/\/ ****************************************** \/\/        Register FRM_CNT  \/\/ ******************************************  logic [31:0] reg_3_frm_cnt_read;     \/\/ assigning to output  \/\/ assigning to read data always_comb   begin     reg_3_frm_cnt_read        = 32'h0;     reg_3_frm_cnt_read[31:0]  = frm_cnt_i;   end   \/\/ ****************************************** \/\/      Reading stuff  \/\/ ****************************************** logic [31:0] reg_rd_data = 32'h0;  always_ff @( posedge reg_clk_i or posedge reg_rst_i )   if( reg_rst_i )     reg_rd_data &lt;= 32'h0;   else     if( reg_rd_en_i )       begin          case( reg_addr_i )                  8'h0:           begin             reg_rd_data &lt;= reg_0_main_read;           end                  8'h1:           begin             reg_rd_data &lt;= reg_1_ip_dst_read;           end                  8'h2:           begin             reg_rd_data &lt;= reg_2_frm_size_read;           end                  8'h3:           begin             reg_rd_data &lt;= reg_3_frm_cnt_read;           end                  default:           begin             reg_rd_data &lt;= 32'h0;           end          endcase        end  assign reg_rd_data_o = reg_rd_data;  endmodule <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0438\u0434\u0435\u044f \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430: \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043d\u0430\u0434\u043e \u0434\u043e\u043f\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u2014 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0431\u0440\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d)<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u0438\u0435 <b>Avalon-MM<\/b>.<\/p>\n<h3>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432<\/h3>\n<p>  \u0421 <b>Jinja2<\/b> \u044f \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 <a href=\"https:\/\/github.com\/alexforencich\/verilog-ethernet\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e<\/a> 1G \u0438 10G MAC-\u044f\u0434\u0435\u0440 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 UDP\/IP \u0441\u0442\u0435\u043a\u043e\u043c. \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u0442\u0430\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e \u0438 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438, \u0430 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b. <\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Jinja2 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/github.com\/alexforencich\/verilog-ethernet\/blob\/master\/lib\/axis\/rtl\/axis_mux_64.py\">N-\u043f\u043e\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440\u0430 AXI4-Stream<\/a>. \u042d\u0442\u043e\u0442 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0445\u0438\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 <b>csr_map<\/b> \u044f \u043d\u0430\u043a\u0438\u0434\u0430\u043b \u043d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0440\u0443\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Jinja2 (\u0443\u0432\u0435\u0440\u0435\u043d, \u043e\u0446\u0435\u043d\u0438\u043b \u044f \u0435\u0451 \u043c\u0430\u043b\u0443\u044e \u0447\u0430\u0441\u0442\u044c), \u043d\u043e \u043c\u043e\u0433\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u043e\u0434 FPGA \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u044b\u0440\u043e\u0439, \u0438 <a href=\"http:\/\/habrahabr.ru\/company\/metrotek\/\">\u043c\u044b<\/a> \u0435\u0433\u043e \u0435\u0449\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 (\u0438 \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442, \u0442.\u043a. \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 IP-\u044f\u0434\u0435\u0440 \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439). <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434: \u0433\u043e\u0442\u043e\u0432 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c, \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0447\u044c\u0438-\u0442\u043e pull-request&#8217;\u044b)<\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0437\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0431\u0435\u0437 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u0439.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\u0416\u0430\u043b\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0447\u0442\u043e \u0445\u0430\u0431 FPGA <a href=\"http:\/\/habrahabr.ru\/company\/tm\/blog\/139898\/\">\u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438<\/a> \u043d\u0430 \u0433\u0438\u043a\u0442\u0430\u0439\u043c\u0441.  <\/div>\n<\/div>\n<div class=\"clear\"><\/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=\"http:\/\/habrahabr.ru\/post\/263005\/\"> http:\/\/habrahabr.ru\/post\/263005\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u0422\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438? \u041b\u0438\u0431\u043e \u0441\u043c\u0438\u0440\u044f\u044e\u0442\u0441\u044f, \u043b\u0438\u0431\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443:  <\/p>\n<ul>\n<li> \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u044f\u0437\u044b\u043a\u0430 Verilog, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 ASIC\/FPGA, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b>Python<\/b> \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <b>Jinja<\/b>.<\/li>\n<li> \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 IP-\u044f\u0434\u0435\u0440, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e-\u0441\u0442\u0430\u0442\u0443\u0441\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438\u0437 \u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442!  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-261884","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/261884","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=261884"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/261884\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=261884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=261884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=261884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}