рдЪрдХреНрд░рд╡рд╛рдд IV FPGA рдмреЛрд░реНрдб рдкрд░ рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рдХреИрд▓рдХреБрд▓реЗрдЯрд░

рдкрд░рд┐рдЪрдп


рдЗрдиреЛрдкреЛрд▓рд┐рд╕ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреЗ рдкреНрд░рдердо рд╡рд░реНрд╖ рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА рдиреЗ рд╣рдореЗрдВ рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реБрдЭрд╛рдП рдФрд░ рд╣рдордиреЗ рд░рд┐рд╡рд░реНрд╕ рдкреЙрд▓рд┐рд╢ рдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП FPGA рдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред



рд╣рдорд╛рд░реЗ рдмреЛрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдордиреЗ рд╕рд╛рдЗрдХреНрд▓реЛрди IV рдХреЛ рдЪреБрдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ рдкрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдерд╛ред рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рд╣рдордиреЗ рд╡реЗрд░рд┐рд▓реЙрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕реЗ рдЪреБрдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреЗ рдкрд╛рд╕ FPGA рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ numpad, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдордиреЗ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо FPGA рдФрд░ рд╡реЗрд░рд┐рд▓реЙрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЬреНрдЮрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдореВрд▓ рдбрд┐рдЬрд╛рдЗрди


рд╣рдордиреЗ рджреЛ рд▓реЛрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ рдФрд░ рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдмреИрдардХ рдЖрдпреЛрдЬрд┐рдд рдХреАред рд╡рд╣рд╛рдВ рд╣рдордиреЗ рдмреБрдирд┐рдпрд╛рджреА рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдЕрдкрдиреА рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИред рдпрд╣реА рд╣рдо рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рд╡реЗрд░рд┐рд▓реЛрдЧ рдореЗрдВ рд╕реНрдЯреИрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
  • рд╕реБрдиреНрдирдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦреЗрдВ
  • FPGA рдмреЛрд░реНрдб рдкрд░ рд╕реНрдерд┐рдд 8-рд╕реЗрдЧрдореЗрдВрдЯ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
  • рдПрдХ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдЧрд╛



рдЯреАрдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдиреЗ рдЦреБрдж рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЪреБрдирд╛ рд╣реИред рд╕реНрдЯреИрдХ, рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЗрдирдкреБрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдЖрджреЗрд╢ рдХрд╛рд░реНрдп рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рдордиреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдЕрдиреЗрдХрддрд╛


рд╕реНрдЯреИрдХ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдСрдкрд░реЗрдВрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╕реНрдореГрддрд┐ рдХреЗ 32 рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд┐рдпрд╛ред

рдвреЗрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб
module stack( //Just 50 MHz clock input clock, //Reset signal input reset, //PUSH operation control signal input push, //POP operation control signal input pop, //SWAP operation control signal input swap, //UPDATE operation control signal input write, //Value to write input [31:0] value, //Top element output [31:0] top, //Second element from stack top output [31:0] next, //Total elements count output [5:0] count, //Stack overflow error output error ); //Stack memory for 32 words reg [31:0] memory [0:31]; //Stack pointer on top element, indexing from 0 reg [5:0] pointer = 0; //First element by default is 0 initial memory[0] = 0; //Top stack element assign top = memory[pointer]; //Second element if such exists, 0 otherwise assign next = pointer == 0 ? 0 : memory[pointer - 1]; //Stack elements count assign count = pointer[4:0] + 1; //Stack overflow signal assign error = pointer[5]; always @(posedge clock) begin //Reseting if (reset) begin memory[0] <= 0; pointer <= 0; end //Remove one element form stack if (pop) pointer <= pointer - 1; //Swaps top and next elements if (swap) begin memory[pointer] <= memory[pointer - 1]; memory[pointer - 1] <= memory[pointer]; end //Update top element if (write) memory[pointer - pop] <= value; //Push new zero element on top if (push) begin pointer <= pointer + 1; //Here pointer is still not updated, so +1 memory[pointer + 1] <= 0; end end endmodule 


рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реНрдЯреИрдХ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдирдП рдорд╛рди рдХреЛ рдзрдХреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рди рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░рдЦрддрд╛ рд╣реИред рдпрджрд┐ рдорд╛рди рд╕реНрдЯреИрдХ рд╕реЗ рдмрд╛рд╣рд░ рдкреЙрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рд╢реАрд░реНрд╖ рддрддреНрд╡ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред



рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рд░реАрд╕реЗрдЯ рдмрдЯрди рдЬреЛрдбрд╝рд╛, рддрд╛рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓ рд╕рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рдкреНрд░рджрд░реНрд╢рди


рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рд╣рдордиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрд╣ рд╣рдорд╛рд░реА рд╕рдВрдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ рдПрдХ рдЗрдирдкреБрдЯ рдорд╛рди рднреАред



рдпрд╣рд╛рдБ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ
 module display_bcd ( //Just 50 MHz clock input clock, //Switching hexademical and decimal representations input show_in_hex, //Asserted if something is going wrong, displaing error message input error, //Value to be displayed in binary format input [31:0] value, //Segments of display output [7:0] control, //LEDs of one segment output [7:0] leds ); // ###0### // # # // # # // 5 1 // # # // # # // ###6### // # # // # # // 4 2 // # # ### // # # #7# // ###3### ### //All representation of used symbols parameter D_0 = 8'b00111111; parameter D_1 = 8'b00000110; parameter D_2 = 8'b01011011; parameter D_3 = 8'b01001111; parameter D_4 = 8'b01100110; parameter D_5 = 8'b01101101; parameter D_6 = 8'b01111101; parameter D_7 = 8'b00000111; parameter D_8 = 8'b01111111; parameter D_9 = 8'b01101111; parameter D_DOT = 8'b10000000; parameter D_A = 8'b01110111; parameter D_B = 8'b01111100; parameter D_C = 8'b01011000; parameter D_D = 8'b01011110; parameter D_E = 8'b01111001; parameter D_F = 8'b01110001; parameter D_R = 8'b01010000; parameter D_O = 8'b01011100; parameter D_MINUS = 8'b01000000; parameter D_EMPTY = 8'b00000000; parameter D_E_CODE = 14; parameter D_R_CODE = 16; parameter D_O_CODE = 17; parameter D_MINUS_CODE = 18; parameter D_EMPTY_CODE = 31; //Delay counter, delaying 8192 clock cycles ~ 0.16 ms reg [12:0] counter = 0; //Saved Binary-Coded Decimal reg [31:0] r_bcd; //Number of segment that is active on current iteration reg [2:0] ctrl = 0; //Current digit shown on the current segment reg [4:0] digit; //Asserted for 1 cycle when conversion to Binary-Coded Decimal is done wire converted; //Intermediate Binary-Coded decimal value wire [31:0] bcd; //Decoded number digits wire [31:0] digits; //Number sign wire sign; //Digits from unsigned numbers wire [31:0] unsigned_number; bcd_convert #(32, 8) bcd_convert( .i_Clock(clock), .i_Binary(unsigned_number), .i_Start(1'b1), .o_BCD(bcd), .o_DV(converted)); //Get number sign assign sign = value[31]; //Get unsigned number assign unsigned_number = sign ? -value : value; //Switching final number representation assign digits = show_in_hex ? unsigned_number : r_bcd; //Constolling segments assign control = ~(1 << ctrl); reg [7:0] r_leds; //Controlling LEDs assign leds = ~r_leds; always @(posedge clock) begin case (digit) 0: r_leds <= D_0; 1: r_leds <= D_1; 2: r_leds <= D_2; 3: r_leds <= D_3; 4: r_leds <= D_4; 5: r_leds <= D_5; 6: r_leds <= D_6; 7: r_leds <= D_7; 8: r_leds <= D_8; 9: r_leds <= D_9; 10: r_leds <= D_A; 11: r_leds <= D_B; 12: r_leds <= D_C; 13: r_leds <= D_D; 14: r_leds <= D_E; 15: r_leds <= D_F; 16: r_leds <= D_R; 17: r_leds <= D_O; 18: r_leds <= D_MINUS; default: r_leds <= D_EMPTY; endcase if (error) //Display error message case(ctrl) 0: digit <= D_R_CODE; 1: digit <= D_O_CODE; 2: digit <= D_R_CODE; 3: digit <= D_R_CODE; 4: digit <= D_E_CODE; 5: digit <= D_EMPTY_CODE; 6: digit <= D_EMPTY_CODE; 7: digit <= D_EMPTY_CODE; endcase else //Select current digit case(ctrl) 0: digit <= digits[3:0]; 1: digit <= digits[31:4] ? digits[7:4] : D_EMPTY_CODE; 2: digit <= digits[31:8] ? digits[11:8] : D_EMPTY_CODE; 3: digit <= digits[31:12] ? digits[15:12] : D_EMPTY_CODE; 4: digit <= digits[31:16] ? digits[19:16] : D_EMPTY_CODE; 5: digit <= digits[31:20] ? digits[23:20] : D_EMPTY_CODE; 6: digit <= digits[31:24] ? digits[27:24] : D_EMPTY_CODE; 7: digit <= sign ? D_MINUS_CODE : (digits[31:28] ? digits[31:28] : D_EMPTY_CODE); endcase //Increase current delay counter <= counter + 1; //Delay is done, increase segment number if (counter == 13'b1000000000000) ctrl <= ctrl + 1; //Save converted Binary-Coded Decimal if (converted) r_bcd <= bcd; end endmodule 


рдЪрдХреНрд░рд╡рд╛рдд IV рдореЗрдВ рдЖрда рдЖрда-рдЦрдВрдб рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ 16 рдкрд┐рди рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдЖрда рдкрд┐рди рдХрдВрдЯреНрд░реЛрд▓ рд╕реЗрдЧрдореЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВ (рдЪрд▓реЛ рдЗрд╕реЗ рд▓реАрдб рдХрд╣рддреЗ рд╣реИрдВ) рдФрд░ рджреВрд╕рд░рд╛ рдЖрда рдкрд┐рди рдХрдВрдЯреНрд░реЛрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕рдХреНрд░рд┐рдп рд╣реЛрдЧрд╛ (рдмрд╕ рдЗрд╕реЗ рдХрдВрдЯреНрд░реЛрд▓ рдХрд╣рддреЗ рд╣реИрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ рддреАрд╕рд░реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдкрд░ рдЕрдВрдХ 5 рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг 00000100 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрд▓рдИрдбреА 01101101 (рдХреЛрдб рдореЗрдВ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рд╕реНрдкреНрд▓реЗ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рд▓рд╛рдЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ 8192 рдШрдбрд╝реА рдЪрдХреНрд░, рд╣рдо рдмрд╛рдИрдВ рдУрд░ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ 1 рдмрд┐рдЯ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рд╢реБрд░реВ рдореЗрдВ 00000001 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЬрдм рд╣рдо рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирдВрдмрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдЗрддрдиреА рддреЗрдЬреА рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдХрд┐ рд╣рдорд╛рд░реА рдЖрдВрдЦ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрдХ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред



рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдмрд╛рдЗрдирд░реА рдирдВрдмрд░ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдорд┐рд▓рд╛ , рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ, рдбрдмрд▓ рдбреИрдмрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдпрд╣ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдирд░реА рдирдВрдмрд░ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрд╛рдЗрдирд░реА рдХреЛрдбреЗрдб рджрд╢рдорд▓рд╡ (4 рдмрд┐рдЯ рдкреНрд░рддрд┐ рдЕрдВрдХ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ
 module bcd_convert #(parameter INPUT_WIDTH, parameter DECIMAL_DIGITS) ( input i_Clock, input [INPUT_WIDTH-1:0] i_Binary, input i_Start, // output [DECIMAL_DIGITS*4-1:0] o_BCD, output o_DV ); parameter s_IDLE = 3'b000; parameter s_SHIFT = 3'b001; parameter s_CHECK_SHIFT_INDEX = 3'b010; parameter s_ADD = 3'b011; parameter s_CHECK_DIGIT_INDEX = 3'b100; parameter s_BCD_DONE = 3'b101; reg [2:0] r_SM_Main = s_IDLE; // The vector that contains the output BCD reg [DECIMAL_DIGITS*4-1:0] r_BCD = 0; // The vector that contains the input binary value being shifted. reg [INPUT_WIDTH-1:0] r_Binary = 0; // Keeps track of which Decimal Digit we are indexing reg [DECIMAL_DIGITS-1:0] r_Digit_Index = 0; // Keeps track of which loop iteration we are on. // Number of loops performed = INPUT_WIDTH reg [7:0] r_Loop_Count = 0; wire [3:0] w_BCD_Digit; reg r_DV = 1'b0; always @(posedge i_Clock) begin case (r_SM_Main) // Stay in this state until i_Start comes along s_IDLE : begin r_DV <= 1'b0; if (i_Start == 1'b1) begin r_Binary <= i_Binary; r_SM_Main <= s_SHIFT; r_BCD <= 0; end else r_SM_Main <= s_IDLE; end // Always shift the BCD Vector until we have shifted all bits through // Shift the most significant bit of r_Binary into r_BCD lowest bit. s_SHIFT : begin r_BCD <= r_BCD << 1; r_BCD[0] <= r_Binary[INPUT_WIDTH-1]; r_Binary <= r_Binary << 1; r_SM_Main <= s_CHECK_SHIFT_INDEX; end // Check if we are done with shifting in r_Binary vector s_CHECK_SHIFT_INDEX : begin if (r_Loop_Count == INPUT_WIDTH-1) begin r_Loop_Count <= 0; r_SM_Main <= s_BCD_DONE; end else begin r_Loop_Count <= r_Loop_Count + 1; r_SM_Main <= s_ADD; end end // Break down each BCD Digit individually. Check them one-by-one to // see if they are greater than 4. If they are, increment by 3. // Put the result back into r_BCD Vector. s_ADD : begin if (w_BCD_Digit > 4) begin r_BCD[(r_Digit_Index*4)+:4] <= w_BCD_Digit + 3; end r_SM_Main <= s_CHECK_DIGIT_INDEX; end // Check if we are done incrementing all of the BCD Digits s_CHECK_DIGIT_INDEX : begin if (r_Digit_Index == DECIMAL_DIGITS-1) begin r_Digit_Index <= 0; r_SM_Main <= s_SHIFT; end else begin r_Digit_Index <= r_Digit_Index + 1; r_SM_Main <= s_ADD; end end s_BCD_DONE : begin r_DV <= 1'b1; r_SM_Main <= s_IDLE; end default : r_SM_Main <= s_IDLE; endcase end // always @ (posedge i_Clock) assign w_BCD_Digit = r_BCD[r_Digit_Index*4 +: 4]; assign o_BCD = r_BCD; assign o_DV = r_DV; endmodule // Binary_to_BCD 


рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдкрд╣рд▓реЗ 4 рдмрд┐рдЯреНрд╕ рджрд╢рдорд▓рд╡ рдореЗрдВ 4 рд╕реЗ рдмрдбрд╝реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рджрд╢рдорд▓рд╡ 3 рдЬреЛрдбрд╝рддрд╛ рд╣реИред



рдирдордкреИрдб


рдпрд╣ рдореЙрдбреНрдпреВрд▓ numpad рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдиреНрдирдкреИрдб рд╕реЗ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреАрдмреЛрд░реНрдб рдХреЗ рджреЛ рд░рд╛рдЬреНрдп рд╣реИрдВред Fpga рдкрд░ рдПрдХ рдмрдЯрди рджрдмрд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЦреНрдп рдХреАрдмреЛрд░реНрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреА рддрд░рд╣:



рд╕рдВрдЦреНрдпрд╛ рдХреЛрдб
 module numpad ( //Just 50 MHz clock input clock, //Alternative keyboard input alt_key, //Alternative keyboard indicator output alt_led, //Numpad rows input [3:0] rows, //Numpad columns output [3:0] columns, //State change description [5:5] - is_changed, [4:4] - keyboard, [3:0] - button output [5:0] value ); // col 0 col 1 col 2 col 3 // // ############################# // # # # # # // # 1(0) # 2(4) # 3(8) # A(12)# row 0 // # # # # # // ############################# // # # # # # // # 4(1) # 5(5) # 6(9) # B(13)# row 1 // # # # # # // ############################# // # # # # # // # 7(2) # 8(6) # 9(10)# C(14)# row 2 // # # # # # // ############################# // # # # # # // # 0(3) # F(7) # E(11)# D(15)# row 3 // # # # # # // ############################# parameter BTN_EMPTY = 6'b000000; //Previous pressed button reg [5:0] prev = 0; //Current pressed button reg [5:0] cur = 0; //Current column number reg [1:0] col = 0; //Counter for delay reg [8:0] counter = 0; //Rows pressed flags reg [3:0] pressed = 0; //Is alternative keyboard reg is_alt = 0; //Alt key on prev clock cycle reg prev_alt_key = 0; //Controlling column assign columns = ~(1 << col); assign alt_led = ~is_alt; always @(posedge clock) begin //Increase counter counter <= counter + 1; //Evaluating alternative keyboard signal if (value != BTN_EMPTY) is_alt <= 0; else is_alt <= (alt_key == 1 && prev_alt_key == 0) ? ~is_alt : is_alt; prev_alt_key <= alt_key; if (counter == 9'b1111111111) begin //Evaluating current button case(~rows) 4'b0001: begin pressed[col] <= 1; cur <= {1'b1, ~is_alt, col, 2'b00}; end 4'b0010: begin pressed[col] <= 1; cur <= {1'b1, ~is_alt, col, 2'b01}; end 4'b0100: begin pressed[col] <= 1; cur <= {1'b1, ~is_alt, col, 2'b10}; end 4'b1000: begin pressed[col] <= 1; cur <= {1'b1, ~is_alt, col, 2'b11}; end default: begin pressed[col] <= 0; cur <= pressed ? cur : BTN_EMPTY; end endcase end //increase column number when counter is 9'011111111, using different edges of counter[8] to let counter pass through zero, to assert wire value if need if (counter == 9'b011111111) begin //Saving previous button every 4 iterations if (&col) prev <= cur; col <= col + 1; end end //Evaluating state change //Comparing current and previous states without keyboard bit assign value = (counter == 9'b000000000 && col == 2'b11 && {prev[5], prev[3:0]} != {cur[5], cur[3:0]}) ? cur : BTN_EMPTY; endmodule 


рддреЛ, numpad рдПрдХ рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 16 рдмрдЯрди (4 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ 4 рдХреЙрд▓рдо) рд╣реЛрддреЗ рд╣реИрдВред рджрдмрд╛рдП рдЧрдП рдмрдЯрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 4 рдЖрдЙрдЯрдкреБрдЯ (рдЗрд╕реЗ рдХреЙрд▓рдо рд╣реЛрдиреЗ рджреЗрдВ) рдФрд░ 4 рдЗрдирдкреБрдЯ (рдкрдВрдХреНрддрд┐рдпреЛрдВ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╡реЛрд▓реНрдЯреЗрдЬ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрдХрд┐рдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рдкрдВрдХреНрддрд┐ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╕реНрддрдВрдн рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкрдВрдХреНрддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣рдорд╛рд░реЗ рдмрдЯрди рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред



рдпрджрд┐ рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рдореБрдЦреНрдп рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирдВрдмрд░ 5 рдорд┐рд▓реЗрдЧрд╛ред

рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓


рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдХрд╛ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓
 module main( //Just 50 MHz clock input clock, //Reset signal input reset, //Representation switch input show_in_hex, //Show stack elements count switch input show_count, //Button, switches to operations keyboard input alt_numpad_key, //Alternative keyboard indicator output alt_numpad_led, //Numpad rows and columns input [3:0] numpad_rows, output [3:0] numpad_columns, //Display and display control output [7:0] display_leds, output [7:0] display_control ); // 1 2 3 C // 4 5 6 PUSH // 7 8 9 POP // 0 +- CE SWAP parameter BTN_0 = 6'b110011; parameter BTN_1 = 6'b110000; parameter BTN_2 = 6'b110100; parameter BTN_3 = 6'b111000; parameter BTN_4 = 6'b110001; parameter BTN_5 = 6'b110101; parameter BTN_6 = 6'b111001; parameter BTN_7 = 6'b110010; parameter BTN_8 = 6'b110110; parameter BTN_9 = 6'b111010; parameter BTN_CLEAR_DIGIT = 6'b111100; parameter BTN_PUSH = 6'b111101; parameter BTN_POP = 6'b111110; parameter BTN_SWAP = 6'b111111; parameter BTN_CLEAR_NUMBER = 6'b111011; parameter BTN_UNARY_MINUS = 6'b110111; // + - * / // sqr cbe inc dec parameter BTN_ADDITION = 6'b100000; parameter BTN_SUBTRACTION = 6'b100100; parameter BTN_MULTIPLICATION = 6'b101000; parameter BTN_DIVISION = 6'b101100; parameter BTN_SQUARE = 6'b100001; parameter BTN_CUBE = 6'b100101; parameter BTN_INCREMENT = 6'b101001; parameter BTN_DECREMENT = 6'b101101; //Numpad state wire [5:0] pressed; //Stack elements count wire [5:0] count; //First and second stack elements wire [31:0] top, next; wire stack_error; //Evaluated new value reg [31:0] new_value; //Stack control signals reg write, push, pop, swap; reg arithmetic_error = 0; numpad numpad( .clock (clock), .alt_key (~alt_numpad_key), .alt_led (alt_numpad_led), .rows (numpad_rows), .columns (numpad_columns), .value (pressed) ); stack stack( .clock (clock), .reset (~reset), .push (push), .pop (pop), .swap (swap), .write (write), .value (new_value), .top (top), .next (next), .count (count), .error (stack_error) ); display_bcd display( .clock (clock), .error (stack_error || arithmetic_error), .show_in_hex (show_in_hex), .value (show_count ? count : top), .control (display_control), .leds (display_leds) ); // Division result wire [31:0] res; assign res = ((next[31] ? -next : next) / (top[31] ? -top : top)); always @(posedge clock) begin //Reseting arithmetic error if (~reset) arithmetic_error <= 0; case (pressed) BTN_0: begin write <= 1; new_value <= top * 10; end BTN_1: begin write <= 1; new_value <= top * 10 + (top[31] ? -1 : 1); end BTN_2: begin write <= 1; new_value <= top * 10 + (top[31] ? -2 : 2); end BTN_3: begin write <= 1; new_value <= top * 10 + (top[31] ? -3 : 3); end BTN_4: begin write <= 1; new_value <= top * 10 + (top[31] ? -4 : 4); end BTN_5: begin write <= 1; new_value <= top * 10 + (top[31] ? -5 : 5); end BTN_6: begin write <= 1; new_value <= top * 10 + (top[31] ? -6 : 6); end BTN_7: begin write <= 1; new_value <= top * 10 + (top[31] ? -7 : 7); end BTN_8: begin write <= 1; new_value <= top * 10 + (top[31] ? -8 : 8); end BTN_9: begin write <= 1; new_value <= top * 10 + (top[31] ? -9 : 9); end BTN_CLEAR_DIGIT: begin write <= 1; new_value <= top / 10; end BTN_CLEAR_NUMBER: begin write <= 1; new_value <= 0; end BTN_PUSH: begin push <= 1; end BTN_POP: begin pop <= 1; end BTN_SWAP: begin swap <= 1; end BTN_UNARY_MINUS: begin write <= 1; new_value <= -top; end BTN_ADDITION: begin pop <= 1; write <= 1; new_value <= next + top; end BTN_SUBTRACTION: begin pop <= 1; write <= 1; new_value <= next - top; end BTN_MULTIPLICATION: begin pop <= 1; write <= 1; new_value <= next * top; end BTN_DIVISION: begin pop <= 1; write <= 1; new_value <= (next[31] ^ top[31] ? -res : res); arithmetic_error <= ~(|top); end BTN_SQUARE: begin write <= 1; new_value <= top * top; end BTN_CUBE: begin write <= 1; new_value <= top * top * top; end BTN_INCREMENT: begin write <= 1; new_value <= top + 1; end BTN_DECREMENT: begin write <= 1; new_value <= top - 1; end default: // Nothing usefull is pressed begin write <= 0; push <= 0; pop <= 0; swap <= 0; end endcase end endmodule 


"рд╣рдореЗрд╢рд╛" рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЗрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдСрдкрд░реЗрд╢рди рдЪреБрди рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдВрдмрд░рдкреИрдб рдХрд╛ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЕрдВрдХ рд╡рд╛рд▓рд╛ рдПрдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдВрдХ рдвреЗрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрдХ рд╣реИрдВ, рддреЛ рд╕реНрдЯреИрдХ рдореЗрдВ рд╢реАрд░реНрд╖ рд╕рдВрдЦреНрдпрд╛ рдХреЛ 10 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЧреБрдгрд╛ рдорд╛рди рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдСрдкрд░реЗрд╢рди рд╡рд╛рд▓рд╛ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдСрдкрд░реЗрд╢рди рд╕реНрдЯреИрдХ рдореЗрдВ рдкрд╣рд▓реЗ рджреЛ рдирдВрдмрд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред



рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рд╡реЗрд░рд┐рд▓реЛрдЧ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдорд┐рд▓реАред рдХреБрдЫ рдЕрдЬреАрдм рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрдЧрд░ рд╣рдо рджреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рдгрд╛рдо рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдЦрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣рд╛рдВ рд╡реАрдбрд┐рдпреЛ рд╣реИ, рдЬреЛ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рдХрд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ github рд╣реИред

рд╡реЗрд░рд┐рд▓реЛрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рдордЭ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдЯреАрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдирд░рдо рдХреМрд╢рд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рд╣реИред

рд▓реЗрдЦрдХ: рдлрд╝реЗрдбреЛрдЬрд╝реЗрд╡ рдХрд┐рд░рд┐рд▓, рдпреБрд▓реЛрд╕рдХреЛрд╡ рдЖрд░реНрдЯреЗрдоред

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


All Articles