рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ FPGA рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдкрд░рд┐рдЪрд┐рдд рджреЛ рд╕рд╛рд▓ рдкреБрд░рд╛рдиреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдЫрд╛рддреНрд░ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдПрд▓реНрдЯреЗрд░рд╛ рдФрд░ рдПрдХреНрд╕рд┐рд▓рд┐рдирдХреНрд╕ рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкрдврд╝рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд░реИрдо рдФрд░ рд░реЛрдо рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдПрдХ рдлреАрдлреЛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ "рдорд╛рдереЗ рдкрд░" рдмрдирд╛рдХрд░ рдЕрдкрдиреЗ рдбрд┐рдкреНрд▓реЛрдорд╛ рдХрд╛ рдмрдЪрд╛рд╡ рдХрд┐рдпрд╛ред
рдореБрдЭреЗ FPGA рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдкрдиреЗ "рдЬреНрдЮрд╛рди" рдХреЗ рдХрд╛рд░рдг рдиреМрдХрд░реА рдорд┐рд▓реАред рддреБрд░рдВрдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рдерд╛: рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ 90% рддрд╛рд░реНрдХрд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдХрдмреНрдЬрд╛ рдерд╛, рдФрд░ рдореЗрд░рд╛ рдХрд╛рдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдбрд┐рдЬрд┐рдЯрд▓ рдлрд┐рд▓реНрдЯрд░ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдерд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ "рдорд╛рдереЗ рдкрд░" рдЗрд╕ тАЛтАЛрд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред рдореМрдЬреВрджрд╛ рдХреЛрдб рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛? рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВред рдФрд░ рддрднреА рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдо рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреЗрддрд╛рд╡рдиреА! рдпрд╣рд╛рдВ рдПрд▓рдИрдбреА рдирд╣реАрдВ рдЭрдкрдХреЗрдЧреАред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, M4K рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрджрд▓рд╛рд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкреНрд░рдХрд╛рд╢рди FPGA рдФрд░ рд╡реЗрд░рд┐рд▓реЛрдЧ рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рдкрд░рд┐рдЪрд┐рддрддрд╛ рдорд╛рдирддрд╛ рд╣реИредрд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ "рдорд╛рдереЗ рдореЗрдВ" рдЖрд╡рд╢реНрдпрдХ рдлрд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкрддрд▓реА рдЬрдЧрд╣ рдХрд╣рд╛рдВ рд╣реИред рдпрд╣ рекрекрек * резрем рдмрд┐рдЯреНрд╕ (рекрекреж рдлрд╝рд┐рд▓реНрдЯрд░ рдХреНрд░рдо рд╣реИ, резрем рдмрд┐рдЯреНрд╕ рд╢рдмреНрдж рдЖрдпрд╛рдо рд╣реИ) рдХреА рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд┐рдХрд▓рд╛ред рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдпрд╛ рдХрд┐ рд╢рд┐рдлреНрдЯ рдПрдХ рддреБрдЪреНрдЫ рдСрдкрд░реЗрд╢рди рд╣реИред рд╕реНрдЯреЗрдк N рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЪрд░рдг N-1 рдореЗрдВ рд▓рд┐рдП рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдореВрд▓реНрдп рд▓рд┐рдЦреЗрдВред рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд░реИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:
module pip #(parameter DATA_WIDTH=16, parameter ADDR_WIDTH=9) ( input [(DATA_WIDTH-1):0] data, input [(ADDR_WIDTH-1):0] read_addr, write_addr, input we, clk, output reg [(DATA_WIDTH-1):0] q ); reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0]; always @ (posedge clk) begin q <= ram[read_addr]; if (we) ram[write_addr] <= data; end endmodule
рдпрд╣ рд╕реАрдзреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓ рдЧрдП рд╣реИрдВред рдЕрдм рдпрд╣ рд░реИрдо рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд░реИрдо рд░реИрдкрд░ рдХрд╣рд╛ рдерд╛, рд▓рд┐рдЦрд╛ рдерд╛ред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд╛рдЬреНрдп рдорд╢реАрди:
module upr #(parameter DATA_WIDTH = 16, parameter ADDR_WIDTH = 9) ( input wire clk, input wire en, input wire [ (DATA_WIDTH-1) : 0 ] ram_upr, input wire [ (DATA_WIDTH-1) : 0 ] data_in, output wire [ (DATA_WIDTH-1) : 0 ] upr_ram, output wire we_ram, output wire [ (ADDR_WIDTH-1) : 0 ] adr_out ); assign upr_ram = ram; assign we_ram = r_we; assign adr_out = r_adr; reg [ 2 : 0 ] r_state = state0; localparam state0 = 3'b001, state1 = 3'b010, state2 = 3'b100; reg [ (ADDR_WIDTH-1) : 0 ] r_adr = {ADDR_WIDTH{1'b0}}; reg [ (DATA_WIDTH-1) : 0 ] ram = {DATA_WIDTH{1'b0}}; reg r_we = 1'b0; always @(posedge clk) if(en) begin case(r_state) state0: r_state <= state1; state1: r_state <= state2; state2: r_state <= state1; endcase end always @(posedge clk) case(r_state) state0: begin r_we <= 1'b0; r_adr <= {ADDR_WIDTH{1'b0}}; ram <= data_in; end state1: begin r_we <= 1'b1; if(r_adr == {ADDR_WIDTH{1'b0}}) ram <= data_in; else ram <= ram_upr; end state2: begin r_adr <= r_adr + 1'b1; r_we <= 1'b0; end endcase endmodule
рдпрд╣ рджреЛ рдЪрд░рдгреЛрдВ + рдПрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░реАрд╕реЗрдЯ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдорд╢реАрди рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ - рдХреЛрдИ рд╕рдВрдХреНрд░рдордг рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдШрдбрд╝реА рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рдордиреЗред рдкрд╣рд▓рд╛ рдЪрд░рдг (State1) рдбреЗрдЯрд╛ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдпрд╛ RAM рд╕реЗ рдкрд┐рдЫрд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рд╣реИред рдпрд╣ рдПрдХ рдРрд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рдЪрд░рдг рддрдХ, рд░рд╛рдЗрдЯ рд╕рд┐рдЧреНрдирд▓ рдПрдХ рдкрд░ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░реИрдо рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдЧрд╛ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдЗрдирд╕ рд╣реИ - рд╢рд┐рдлреНрдЯ рдореЗрдВ 2 рдШрдбрд╝реА рдЪрдХреНрд░ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЛрдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рдореЗрдВ рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ "рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛" рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рджреГрдврд╝ рдПрдирдХреЛрдбрд░ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рд╕реНрдореГрддрд┐ рдХреЗ рдХрд╛рд░рдг рддрд░реНрдХ рддрддреНрд╡реЛрдВ (рдПрд▓рдИ рдпрд╛ рд╕реНрд▓рд╛рдЗрд╕) рдХреА рдмрдЪрдд рд╣реИред
2 рдЙрдкрд╛рдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ рдФрд░, рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реА рдбрд┐рдЬрд┐рдЯрд▓ рдПрдлрдЖрдИрдЖрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред