рдЕрдВрдд рдореЗрдВ, рдореЗрд░реЗ рд╣рд╛рде FPGAs рдХреЗ рдЕрдзреНрдпрдпрди рддрдХ рдкрд╣реБрдБрдЪ рдЧрдПред рдФрд░ рдлрд┐рд░ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдореИрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рд╕рд░реНрдХрд┐рдЯ рдкрдврд╝рддрд╛ рд╣реВрдВ (рдФрд░ рдереЛрдбрд╝рд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддрд╛ рд╣реВрдВ), рдореБрдЭреЗ рдФрд░ рдмрдврд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рдПрд▓рдИрдбреА рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, UART рдХреЗ рд▓рд┐рдП рд░рд┐рд╕реАрд╡рд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦреЗрдВ, рдЙрдиреНрд╣реЗрдВ FPGA рдХреЗ рдЕрдВрджрд░ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ (рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдИрдкреА рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╣ рд╕рдордЭреЗрдВ), рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдФрд░ рдпрд╣ рд╕рдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред
рдореИрдВ рддреБрд░рдВрдд рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдорд╛рдирдХреАрдХреГрдд рдХреЛрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдерд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, "FPGA рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реЗрдВ" рдХреЗ рд╡рд┐рд╖рдп рдкрд░ред
рддреЛ, рдЪрд▓реЛ рд░рд┐рд╕реАрд╡рд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ред
- рдЖрд░рдПрдХреНрд╕ рд╕рд┐рдЧреНрдирд▓ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдЖрд╡реГрддреНрддрд┐ рдЖрд╡рд╢реНрдпрдХ UART рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рджрд░ рд╕реЗ рдЪрд╛рд░ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИред
- рд░рд┐рд╕реЗрдкреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рд╕реЗ рдирд┐рдореНрди рд╕реНрддрд░ рддрдХ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдЖрд░рдПрдХреНрд╕ рдХрд╛ рд╕рдВрдХреНрд░рдордг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рд░рд┐рд╕реЗрдкреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдкрд░ рдирд╣реАрдВ рд╣реИред
- рдкреНрд░рд╛рд░рдВрдн рдмрд┐рдЯ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХреЛ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдХреА рджреВрд╕рд░реА рдШрдбрд╝реА рдореЗрдВ рдХрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрд░рдПрдХреНрд╕ рд╕рд┐рдЧреНрдирд▓ рдХреА рдЕрд╡рдзрд╛рд░рдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдмрд┐рдЯ рдкрд▓реНрд╕ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╣рд░ 4 рдЪрдХреНрд░реЛрдВ рдкрд░ рджрд╛рд▓реЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
- рдкреНрд░рд╛рд░рдВрдн рдпрд╛ рдмрд┐рдЯреНрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рд╕рдВрдХреЗрдд рддреНрд░реБрдЯрд┐ рд╕реЗрдЯ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдлрд╛рд╕реНрдЯрд╕рд┐рдВрдХ рд╕рд┐рдЧреНрдирд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдлрд╛рд╕реНрдЯ рд░рд┐рд╕реАрд╡рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
- рд╕реНрдЯрд╛рд░реНрдЯ рдмрд┐рдЯ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдмрд╕реЗ рдХрдо рдЙрдореНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдХреНрд░рдорд┐рдХ рд╕реНрд╡рд╛рдЧрдд рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдмрд┐рдЯ рд╕реЗ рд╢рд┐рдлреНрдЯ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рд┐рд╕реЗрдкреНрд╢рди рдХреЗ рдЕрдВрдд рдХреА рд╕реНрдерд┐рддрд┐ рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ 0 рд╡реЗрдВ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рд╢реБрд░реБрдЖрдд рдмрд┐рдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреАред
- рдЬрдм рд░рд┐рд╕реАрд╡рд░ рдЖрд░рдПрдХреНрд╕ рд╕рд┐рдЧреНрдирд▓ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ (рддреЛ рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ "1" рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди, рд╕реНрдЯреЙрдк рдмрд┐рдЯ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдпрд╛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд▓рд╛рдЗрди рдХреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд░рд┐рд╕реАрд╡рд░ рдХреА рддреНрд╡рд░рд┐рдд рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рддреА рд╣реИред
- рд░рд┐рд╕реЗрдкреНрд╢рди рдХреЗ рд╕рдлрд▓ рд╕рдорд╛рдкрди (рд╕реНрдЯрд╛рд░реНрдЯ рдФрд░ рд╕реНрдЯреЙрдк рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╣реА рдорд╛рди) рдХреЗ рд▓рд┐рдП рд╢рд░реНрдд рдкреВрд░реНрдг рд╕рдВрдХреЗрдд рд╣реИред рдЗрд╕рд╕реЗ (рдЬрдм rdclk рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдПрдХ рддреИрдпрд╛рд░ рдкрд▓реНрд╕ рд╕рд┐рдЧреНрдирд▓ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ rxdata рдмрд╕ рдкрд░ рд╡реИрдз рдбреЗрдЯрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдХреНрд▓реЙрдХ рдХреНрд▓реЙрдХ рд╕рд┐рдЧреНрдирд▓ (рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ, рд╕рд╣реА?) рд╕реЗ рддреИрдпрд╛рд░ рд░реАрдб рд╕рд┐рдЧреНрдирд▓ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдмрд╛рдж рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЧрддрд┐ рдХреЛ UART рд╡рд┐рдирд┐рдордп рджрд░ рд╕реЗ рдЬреЛрдбрд╝ рди рд╕рдХреЗред рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдореЙрдбреНрдпреВрд▓ (
рдиреАрдЪреЗ рджреЗрдЦреЗрдВ ) рдореЗрдВ рд╣реИред рд░рд┐рд╕реАрд╡рд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЧреБрдЪреНрдЫрд╛ рдЗрдВрдЯреЗрд▓ рдХреЗ рдЖрдИрдкреА рдХреЛрд░ рдлреАрдлреЛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдФрд░ рдбреЗрдЯрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЧрддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╣реИред рдХреЗрд╡рд▓ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рдШрдбрд╝реА рдХреА рдЖрд╡реГрддреНрддрд┐ рдШрдбрд╝реА рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рдХреНрд▓рд░реНрдХ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рд░рд┐рд╕реАрд╡рд░ рдореЙрдбреНрдпреВрд▓ (рд╡реЗрд░рд┐рд▓реЛрдЧ)// // UART // // rxdata , ready==1 error==0. // ready 1 rdclk. // // : // rx // 2- . , . // 8 - ( 9 ). // 2 - , // . // // . // . '0' , . '1' // idle (. '1') // start- (. '0') // stop- (. '1') module uart_rx( nreset, // (, 0) clk, // UART, .. UART rx, // UART rdclk, // (rxdata, ready) rxdata, // , ready==1 ready, // rxdata ( 1) error, // ( 1) busy, // ( , 1) idle); // ( 1) input wire nreset; // (, 0) input wire clk; // , .. UART input wire rx; // UART input wire rdclk; // output wire[7:0] rxdata; output wire ready; output error; output busy; output idle; // , rdclk reg[2:0] done = 3'b000; // , rdclk //assign ready = (done == 2'b10) ? 1'b1 : 1'b0; assign ready = (done[1] && !done[0]) ? 1'b1 : 1'b0; // reg error = 1'b0; // // error // rx, . wire fastsync = (error && rx); // reg idle = 1'b1; // : // d[9] - , .. == 1 // d[8:1] - // d[0] - , .. == 0 reg[9:0] d = 10'b1xxxxxxxx1; // . 2'b10 wire[1:0] status = { d[9], d[0] }; // . wire complete = (status == 2'b10) ? 1'b1 : 1'b0; // assign rxdata = d[8:1]; // reg busy = 0; // rx reg[1:0] cnt; always @(posedge clk, negedge nreset) begin if(!nreset) begin rxreset(); end else begin if(fastsync) begin rxreset(); end else begin if(busy == 1'b1) begin // -, rx if(cnt == 2'd0) begin // // // (.. ) d <= { rx, d[9:1] }; if(d[1] == 1'b0) begin // , busy <= 1'b0; // error <= (rx == 1'b1) ? 1'b0 : 1'b1; end else begin // if(rx && (d == 10'b1111111111)) begin // busy <= 1'b0; // error <= 1'b1; end else begin // // - - cnt <= 2'd3; end end end else begin // - cnt <= cnt - 2'd1; end end else begin // if(!error) begin // , if(rx == 1'b0) begin // - busy <= 1'b1; // . 1, .. // d[0]==0 d <= 10'b1111111111; // rx 1/2 // 1- - // 2- - (cnt 0) cnt <= 2'd0; // .. , idle <= 1'b0; end else begin // idle <= 1'b1; end end end end end end task rxreset; begin // error <= 1'b0; // (!?) idle <= 1'b1; // busy <= 0; // -, complete d <= 10'b1xxxxxxxx1; end endtask always @(negedge rdclk, negedge nreset) begin if(!nreset) begin done <= 3'b000; end else begin // complete. // ready // complete 0 1 rdclk. done <= { complete, done[2:1] }; end end endmodule
рдЪреВрдВрдХрд┐ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдЖрд░рдПрдХреНрд╕ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ рдФрд░ (рд╕рдВрднрд╡рддрдГ) рдЕрд╕реНрдерд┐рд░ рд╣реИ,
рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рд┐рд╕реАрд╡рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ
рдмрд╣реБрдордд рддрддреНрд╡ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдерд╛ред рддрддреНрд╡ рдХреЛ рд╡реЗрд░рд┐рд▓реЛрдЧ рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдб рдпрд╣рд╛рдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рддрддреНрд╡ рдХреА рдПрдХ рд╕реБрдВрджрд░ рддрд╕реНрд╡реАрд░ред
рдмрд╣реБрд╕рдВрдЦреНрдпрдХ рддрддреНрд╡ рдХреА рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдпреЛрдЬрдирд╛ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдЗрдХрд╛рдИ рдФрд░ рднреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдореЙрдбреНрдпреВрд▓ (рд╡реЗрд░рд┐рд▓реЙрдЧ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдФрд░ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рдЕрдВрджрд░) // // UART // // : // clk - 4 , // rdclk - txdata, write, fetch. .. clk // txdata - , write/fetch // write - (1=) // fetch - (1=) // tx - UART // idle - (1=, ) // // FIFO dcfifo_component.lpm_showahead = "ON" module uart_tx( nreset, // (, 0) clk, // UART, .. UART rdclk, // txdata, // write, // ( 1) idle, // ( 1) fetch, // , rdclk tx); // UART input wire nreset; // (, 0) input wire clk; // UART input wire rdclk; input wire[7:0] txdata; input wire write; output wire idle; output fetch; output tx; // reg tx = 1'b1; reg fetch = 1'b0; // 4 reg[1:0] div4 = 2'd0; // : reg[3:0] s = 4'd10; // assign idle = (s == 4'd10); // reg[7:0] d; // reg sendstart; // reg canfetch; // , clk reg gotdata = 1'b0; // clock domains reg[2:0] sync = 3'b000; // rdclk write reg wr = 1'b0; // getdata==1 // nextdata // gotdata==1. , // . // gotdata getdata. always @(posedge rdclk, negedge nreset) begin if(!nreset) begin wr <= 1'b0; sync <= 3'b000; // fetch <= 1'b0; end else begin // write wr <= write; // sync <= { gotdata, sync[2:1] }; // gotdata // . // . fetch <= (sync[1] && !sync[0]) ? 1'b1 : 1'b0; end end always @(posedge clk, negedge nreset) begin if(!nreset) begin // div4 <= 2'd0; s <= 4'd10; gotdata <= 1'b0; end else begin // sendstart = 1'b0; // canfetch = wr; if(div4 == 2'd0) begin case(s) 4'd0: begin // sendstart = 1'b1; // , canfetch = 1'b0; end 4'd9: begin // tx <= 1'b1; end 4'd10: begin // idle, end default: begin // , tx <= d[0]; // d <= { 1'b0, d[7:1] }; // , canfetch = 1'b0; end endcase end else begin // div4 <= div4 - 2'd1; if(s < 4'd9) begin // 9 ! canfetch = 1'b0; end end if(canfetch) begin // , d <= txdata; // gotdata <= 1'b1; if(idle ) begin // idle - sendstart = 1'b1; end else begin // s <= 4'd0; end end if(gotdata) begin // , gotdata <= 1'b0; end if(sendstart) begin // tx <= 1'b0; // s <= 4'd1; // div4 <= 2'd3; end else begin if(div4 == 2'd0) begin if(s < 4'd10) begin // s <= s + 4'd1; // div4 <= 2'd3; end end end end end endmodule
рдЙрдкрд░реЛрдХреНрдд рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЧрд░реНрдо рдЪрд░реНрдЪрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рд░ рдХреЛрдИ рд╕рд╣рдордд рдерд╛ рдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд╕реЗред рдЖрдкрдХреЗ рдорди рдХреА рд╢рд╛рдВрддрд┐ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рднреА рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд▓рд╛рдЧреВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдорд╛рдирд╡реАрдп рдзрд╛рд░рдгрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдореЙрдбреНрдпреВрд▓ (рд╡реЗрд░рд┐рд▓реЛрдЧ, рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА) // // UART // // : // clk - 4 , // rdclk - txdata, write, fetch. .. clk // txdata - , write/fetch // write - (1=) // fetch - (1=) // tx - UART // idle - (1=, ) // // FIFO dcfifo_component.lpm_showahead = "ON" module uart_tx( nreset, // (, 0) clk, // UART, .. UART rdclk, // txdata, // write, // ( 1) idle, // ( 1) fetch, // , rdclk tx); // UART input wire nreset; // (, 0) input wire clk; // UART input wire rdclk; input wire[7:0] txdata; input wire write; output wire idle; output fetch; output tx; // reg tx = 1'b1; reg fetch = 1'b0; // 4 reg[1:0] div4 = 2'd0; // : reg[3:0] s = 4'd10; // assign idle = (s == 4'd10); // reg[7:0] d; // reg sendstart; // reg canfetch; // , clk reg gotdata = 1'b0; // clock domains reg[2:0] sync = 3'b000; // rdclk write reg wr = 1'b0; // getdata==1 // nextdata // gotdata==1. , // . // gotdata getdata. always @(posedge rdclk, negedge nreset) begin if(!nreset) begin wr <= 1'b0; sync <= 3'b000; // fetch <= 1'b0; end else begin // write wr <= write; // sync <= { gotdata, sync[2:1] }; // gotdata // . // . fetch <= (sync[1] && !sync[0]) ? 1'b1 : 1'b0; end end // (?) always // sendstart canfetch always @(*) begin // sendstart = 1'b0; if(nreset) begin // canfetch = wr; if(div4 == 2'd0) begin case(s) 4'd0: begin // sendstart = 1'b1; // , canfetch = 1'b0; end 4'd9: begin // end 4'd10: begin // idle, end default: begin // // , canfetch = 1'b0; end endcase end else begin if(s < 4'd9) begin // 9 ! canfetch = 1'b0; end end if(canfetch && idle) begin // idle - sendstart = 1'b1; end end else begin // reset canfetch = 1'b0; end end always @(posedge clk, negedge nreset) begin if(!nreset) begin // div4 <= 2'd0; s <= 4'd10; gotdata <= 1'b0; end else begin if(div4 == 2'd0) begin case(s) 4'd0: begin // sendstart end 4'd9: begin // tx <= 1'b1; end 4'd10: begin // idle, end default: begin // , tx <= d[0]; // d <= { 1'b0, d[7:1] }; end endcase end else begin // div4 <= div4 - 2'd1; end if(canfetch) begin // , d <= txdata; // gotdata <= 1'b1; if(!idle /*s == 4'd10*/) begin // s <= 4'd0; end end else begin // , gotdata <= 1'b0; end if(sendstart) begin // tx <= 1'b0; // s <= 4'd1; // div4 <= 2'd3; end else begin if((div4 == 2'd0) && (s < 4'd10)) begin // s <= s + 4'd1; // div4 <= 2'd3; end end end end endmodule
рд░рд┐рд╕реАрд╡рд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдШреБрдЯрдиреЗ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЖрдкрд╕реЗ рдЗрд╕реЗ рдХрд╕рдо рдирд╣реАрдВ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдбрд┐рдЬрд╛рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдмрд╛рд╣рд░реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдХреЗрдд nreset, FIFO рд░реАрд╕реЗрдЯ рдХреА рдХрдореА, рдЖрджрд┐) рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ, рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред
рдореЗрд░рд╛ рдбреЗрдореЛ рдмреЛрд░реНрдб 50Mhz рд╕рд┐рдЧреНрдирд▓ рд╕реНрд░реЛрдд рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рдореИрдВрдиреЗ PLL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ C0 рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдореИрдВрдиреЗ UART (1.8432Mhz, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1.843198Mhz) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдмрдирд╛рдИ рдФрд░, рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реВрдЪрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рд░реНрдХрд┐рдЯ рдХреЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП 300hhz (рдЖрдЙрдЯрдкреБрдЯ c1 PLL) рдХреА рдЖрд╡реГрддреНрддрд┐ рдмрдирд╛рдИред
рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ (рд╡реЗрд░рд┐рд▓реЛрдЧ) // // .. UART UART, // FPGA, // FIFO IP CORE DCFIFO. // //NB! // SDC- ! // ( if , // ). module uart( input wire clk50mhz, // 50Mhz input wire nreset, // input wire rx, // UART output wire tx, // UART output wire overflow ); // 1.8432Mhz ( 1.843198Mhz) wire clk_1843200; // 1.2288Mhz ( 1.228799Mhz) //wire clk_1228800; // 300Mhz, PLL wire clk300mhz; // UART uart_pll pll50mhz(.inclk0(clk50mhz), .c0(clk_1843200) /*, .c1(clk_1228800)*/, .c1(clk300mhz)); // UART 38400 // (1843200/38400)/4 = 12 ('b1100). // UART 57600 // (1843200/57600)/4 = 8 // UART 115200 // (1843200/115200)/4 = 4 // UART 230400 // (1843200/230400)/4 = 2 // UART 460800 // (1843200/460800)/4 = 1 (.. !) // UART wire uart_baud4; // // .data 1 . // uart_baud4 .clock/ // uart_baud4 .clock uart_osc uart_osc_1(.clock(clk_1843200), .data(5'd2/*5'd4*//*5'd12*/-5'd1), .sload(uart_baud4), .cout(uart_baud4)); //wire uart_baud4 = clk_1843200; // wire rxf; // mfilter mfilter_rx(.clk(clk50mhz /*clk_1843200*/), .in(rx), .out(rxf)); //wire rxf = rx; // wire[7:0] rxdata; wire rxready; wire error; uart_rx uart_rx_1(.nreset(nreset), .clk(uart_baud4), .rx(rxf), .rdclk(clk300mhz /*clk50mhz*/ /*clk_1843200*/), .rxdata(rxdata), .ready(rxready), .error(error)); wire[7:0] txdata; // , , wire txnone; // , wire fetch; wire full; // // uart_baud4 // clk50mhz uart_fifo_rx uart_fifo_rx_1(.data(rxdata), .rdclk(clk300mhz /*clk50mhz*/ /*clk_1843200*/ /*uart_baud4*/), .rdreq(fetch), .wrclk(clk300mhz /*clk50mhz*/ /*clk_1843200*/ /*uart_baud4*/), .wrreq(rxready), .rdempty(txnone), .q(txdata), .wrfull(full)); assign overflow = ~error; uart_tx uart_tx_1(.nreset(nreset), .clk(uart_baud4), .rdclk(clk300mhz /*clk50mhz*/ /*clk_1843200*/), .txdata(txdata), .write(~txnone), .fetch(fetch), .tx(tx)); endmodule
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЬрд╝реАрд▓реИрдХреНрд╕ рд╕реЗ рдЯреЗрд╕реНрдЯрдХреЙрдо рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ USB / UART рдПрдбрд╛рдкреНрдЯрд░ рдиреЗ 230400BPS рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЧрддрд┐ рд╕реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдПред
рдмрд╣реБрдордд рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдЖрд░рдПрдХреНрд╕ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо
рд╕рд┐рдЧреНрдирд▓ рдЯреИрдк рд╕рд┐рдЧреНрдирд▓ рд╕реНрдерд┐рддрд┐

рдФрд░ рдпрд╣рд╛рдВ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рд╕реЗ рдмрд╣реБрдордд рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдХреНрдпрд╛, рдФрд░ рдХреИрд╕реЗ рдореИрдВ рддреЗрдЬреА рд╕реЗ рддреБрд▓реНрдпрдХрд╛рд▓рди рдпреЛрдЬрдирд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рдордирдорд╛рдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╕рд┐рдЧреНрдирд▓ рдЯреИрдк рд╕рд┐рдЧреНрдирд▓ рд╕реНрдерд┐рддрд┐

рдЯрд┐рдкреНрдкрдгреА
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдХреНрд╡рд╛рд░реНрдЯрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдФрд░ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдФрд░ рдореИрдВрдиреЗ рдЕрдиреНрдп рд╢реБрд░реБрдЖрддреА FPGAs рдХреЛ рдХреНрдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рджреА: рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ SDC рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдШрдбрд╝реА рдХреА рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред рд╣рд╛рдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдИ рдЬрд╛ рд░рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдШрдбрд╝реА рдХреА рд╕рдордп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рддреЛ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрдкрдиреЗ рд░рд┐рд╕реАрд╡рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреНрдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзреЗ рджрд┐рди рддрдХ рдирд╣реАрдВ рдорд╛рд░рд╛
if(rx == 1'b0) begin busy <= 1'b1; d <= 10'b1111111111; cnt <= 2'd0; idle <= 1'b0; end else begin
рд╡реНрдпрд╕реНрдд рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рд┐рдЧреНрдирд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдереЗ, рд▓реЗрдХрд┐рди рд░рдЬрд┐рд╕реНрдЯрд░ рдбреА рдХреА рд╕рд╛рдордЧреНрд░реА рдХрднреА-рдХрднреА рдирд╣реАрдВ рдмрджрд▓рддреА рдереАред
рдкрд░рд┐рд╢рд┐рд╖реНрдЯ: рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрд╕реА рдлрд╝рд╛рдЗрд▓ set_time_format -unit ns -decimal_places 3 # 50Mhz, (50/50 duty cycle) create_clock -name {clk50mhz} -period 20.000 -waveform { 0.000 10.000 } ############################################################################## Now that we have created the custom clocks which will be base clocks,# derive_pll_clock is used to calculate all remaining clocks for PLLs derive_pll_clocks -create_base_clocks derive_clock_uncertainty # PLL ? # altpll_component.clk0_divide_by = 15625, # altpll_component.clk0_duty_cycle = 50, # altpll_component.clk0_multiply_by = 576, # altpll_component.clk0_phase_shift = "0", #create_generated_clock -name clk_1843200 -source [get_ports {clk50mhz}] -divide_by 15625 -multiply_by 576 -duty_cycle 50 -phase 0 -offset 0 # baudrate=38400 # 1/4 , .. duty=(1/4)*100=25% #create_generated_clock -name uart_baud4 -source [get_nets {pll50mhz|altpll_component|auto_generated|wire_pll1_clk[0]}] -divide_by 12 -duty_cycle 25 [get_nets {uart_osc_1|LPM_COUNTER_component|auto_generated|counter_reg_bit[0]}] # baudrate=230400 # 1/4 , .. duty=(1/4)*100=50% create_generated_clock -name uart_baud4 -source [get_nets {pll50mhz|altpll_component|auto_generated|wire_pll1_clk[0]}] -divide_by 2 -duty_cycle 25 [get_nets {uart_osc_1|LPM_COUNTER_component|auto_generated|counter_reg_bit[0]}] # baudrate=460800 # 1, PLL, .
рдЬреЛ рдЖрдзрд╛рд░ рдШрдбрд╝рд┐рдпреЛрдВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдШрдбрд╝рд┐рдпрд╛рдВ, # derive_pll_clock рд╕рднреА рд╢реЗрд╖ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ set_time_format -unit ns -decimal_places 3 # 50Mhz, (50/50 duty cycle) create_clock -name {clk50mhz} -period 20.000 -waveform { 0.000 10.000 } ############################################################################## Now that we have created the custom clocks which will be base clocks,# derive_pll_clock is used to calculate all remaining clocks for PLLs derive_pll_clocks -create_base_clocks derive_clock_uncertainty # PLL ? # altpll_component.clk0_divide_by = 15625, # altpll_component.clk0_duty_cycle = 50, # altpll_component.clk0_multiply_by = 576, # altpll_component.clk0_phase_shift = "0", #create_generated_clock -name clk_1843200 -source [get_ports {clk50mhz}] -divide_by 15625 -multiply_by 576 -duty_cycle 50 -phase 0 -offset 0 # baudrate=38400 # 1/4 , .. duty=(1/4)*100=25% #create_generated_clock -name uart_baud4 -source [get_nets {pll50mhz|altpll_component|auto_generated|wire_pll1_clk[0]}] -divide_by 12 -duty_cycle 25 [get_nets {uart_osc_1|LPM_COUNTER_component|auto_generated|counter_reg_bit[0]}] # baudrate=230400 # 1/4 , .. duty=(1/4)*100=50% create_generated_clock -name uart_baud4 -source [get_nets {pll50mhz|altpll_component|auto_generated|wire_pll1_clk[0]}] -divide_by 2 -duty_cycle 25 [get_nets {uart_osc_1|LPM_COUNTER_component|auto_generated|counter_reg_bit[0]}] # baudrate=460800 # 1, PLL, .
рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдЗрдирдореЗрдВ рд╕реЗ, рдореИрдВрдиреЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрднреА-рдХрднреА рдХреБрдЫ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдЬрд╛рдирдХрд╛рд░реАред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЙрдирдХрд╛ рдореВрд▓реНрдп рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдФрд░, рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рд╡реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ рдЬреЛ FPGAs рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЪрдврд╝рдиреЗ рдХреА рд╣рд┐рдореНрдордд рд░рдЦрддреЗ рд╣реИрдВредрдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА
- рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЯреНрд░рд╛рдВрд╕реАрд╡рд░ (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛)
- рдЕрдзрд┐рдХрд╛рдВрд╢ рддрддреНрд╡ (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛)