рдореЗрд░реА "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" FPGA рдпрд╛ UART рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░

рдореЗрд░реА рдирдорд╕реНрдХрд╛рд░ рджреБрдирд┐рдпрд╛!  FPGA рдпрд╛ UART рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░

рдЕрдВрдд рдореЗрдВ, рдореЗрд░реЗ рд╣рд╛рде 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 /*s == 4'd10*/) 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 рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЧрддрд┐ рд╕реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдПред

рдмрд╣реБрдордд рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдЖрд░рдПрдХреНрд╕ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо
RX рдкреВрд░реНрд╡ рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░реАрдХреНрд╖рдг
рд╕рд┐рдЧреНрдирд▓ рдЯреИрдк рд╕рд┐рдЧреНрдирд▓ рд╕реНрдерд┐рддрд┐
UART рд░рд┐рд╕реАрд╡рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ

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

рдЯрд┐рдкреНрдкрдгреА


рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдХреНрд╡рд╛рд░реНрдЯрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдФрд░ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдФрд░ рдореИрдВрдиреЗ рдЕрдиреНрдп рд╢реБрд░реБрдЖрддреА 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 рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЪрдврд╝рдиреЗ рдХреА рд╣рд┐рдореНрдордд рд░рдЦрддреЗ рд╣реИрдВред

рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА

  1. рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЯреНрд░рд╛рдВрд╕реАрд╡рд░ (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛)
  2. рдЕрдзрд┐рдХрд╛рдВрд╢ рддрддреНрд╡ (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛)

Source: https://habr.com/ru/post/hi427011/


All Articles