рдПрдХ рдФрд░ рд╕рд░рд▓ verilog рдкреНрд░реЛрд╕реЗрд╕рд░

рд▓реЗрдЦ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдЖрджрд┐рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп RISC / CISC рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдХреЙрдкреА рдирд┐рд░реНрджреЗрд╢ рд╣реИред


рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдореИрдХреНрд╕рд┐рдо MAXQ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, ROM рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА


module rom1r(addr_r, data_r); parameter ADDR_WIDTH = 8; parameter DATA_WIDTH = 8; input [ADDR_WIDTH - 1 : 0] addr_r; output [DATA_WIDTH - 1 : 0] data_r; reg [DATA_WIDTH - 1 : 0] mem [0 : (1<<ADDR_WIDTH) - 1]; initial $readmemh("rom.txt", mem, 0, (1<<ADDR_WIDTH) - 1); assign data_r = mem[addr_r]; endmodule 

рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдбреНрдпреВрд▓ рдкреЛрд░реНрдЯ рд░реИрдо


 module ram1r1w(clk_wr, addr_w, data_w, addr_r, data_r); parameter ADDR_WIDTH = 8; parameter DATA_WIDTH = 8; input clk_wr; input [ADDR_WIDTH - 1 : 0] addr_r, addr_w; output [DATA_WIDTH - 1 : 0] data_r; input [DATA_WIDTH - 1 : 0] data_w; reg [DATA_WIDTH - 1 : 0] mem [0 : (1<<ADDR_WIDTH) - 1]; assign data_r = mem[addr_r]; always @ (posedge clk_wr) mem[addr_w] <= data_w; endmodule 

рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реА


 module cpu(clk, reset, port); parameter WIDTH = 8; parameter RAM_SIZE = WIDTH; parameter ROM_SIZE = WIDTH; input clk, reset; output [WIDTH-1 : 0] port; 

рдХрдо рд╕реЗ рдХрдо, рдЙрд╕реЗ рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рд╕рд╣рд╛рдпрдХ рд░рдЬрд┐рд╕реНрдЯрд░, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЖрдИрдУ рдкреЛрд░реНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗред


  reg [WIDTH-1 : 0] reg_pc; reg [WIDTH-1 : 0] reg_reg; reg [WIDTH-1 : 0] reg_port; assign port = reg_port; 

рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдбреНрд░реЗрд╕ рд╣реЛрдЧрд╛ред


  wire [WIDTH-1 : 0] addr_w, addr_r, data_r, data_w, data; rom1r rom (reg_pc, {addr_w, addr_r}); defparam rom.ADDR_WIDTH = ROM_SIZE; defparam rom.DATA_WIDTH = RAM_SIZE * 2; 

рджреЛрд╣рд░реА рдЪреМрдбрд╝рд╛рдИ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА рдореЗрдВ рджреЛ рдкрддреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдЬрд╣рд╛рдВ рдФрд░ рдЬрд╣рд╛рдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рджреЛрд╣рд░реЗ рдкреЛрд░реНрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред


  ram1r1w ram (clk, addr_w, data_w, addr_r, data_r); defparam ram.ADDR_WIDTH = RAM_SIZE; defparam ram.DATA_WIDTH = WIDTH; 

рд╣рдо рд╡рд┐рд╢реЗрд╖ рдкрддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ: рдПрдХ рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░, рдПрдХ рдирд┐рд░рдВрддрд░ рдЬрдирд░реЗрдЯрд░, 0 рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ (рд╕рд╢рд░реНрдд рдЫрд▓рд╛рдВрдЧ рдХреЗ рд▓рд┐рдП), рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ / рдШрдЯрд╛рд╡ рд╕рдВрдЪрд╛рд▓рди, рдФрд░ рдПрдХ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯред


  parameter PC = 0; parameter CG = 1; parameter TST = 2; parameter ADD = 3; parameter SUB = 4; parameter PORT = 5; 

рджреЛ рдореЗрдореЛрд░реА рдкреЛрд░реНрдЯреНрд╕ рдХреА рдбреЗрдЯрд╛ рдмрд╕реЗрдВ рдкрд░рд╕реНрдкрд░ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ ALU рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреАред


рдПрдХ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ - рд░реАрдб рдкреЛрд░реНрдЯ рдХреЗ рдбреЗрдЯрд╛ рдмрд╕ рдкрд░ рддрд╛рдХрд┐ рдХреБрдЫ рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рдХреЗ рдмрдЬрд╛рдп, рдХрдорд╛рдВрдб рдХреЗ рдХрд╛рдЙрдВрдЯрд░ (рд░рд┐рд╢реНрддреЗрджрд╛рд░ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП), рдЖрдИрдУ, рдЖрджрд┐ рдкрдврд╝реЗрдВред


рджреВрд╕рд░рд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреЛрд░реНрдЯ рдХреЗ рдбреЗрдЯрд╛ рдмрд╕ рдкрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрддреЗ рдкрд░ рднреАред


  assign data = (addr_r == PC) ? reg_pc : (addr_r == PORT) ? reg_port : data_r; assign data_w = (addr_w == CG) ? addr_r : (addr_w == TST) ? |data : (addr_w == ADD) ? data + reg_reg : (addr_w == SUB) ? data - reg_reg : data; 

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


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЗрдореЛрд░реА рд╕реЗ рджреЛ рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдХрд╣реАрдВ рднреА рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ (рдФрд░ рдЙрд╕реА рд╕рдордп reg_reg рдореЗрдВ), рдФрд░ рдпреЛрдЬрдХ рдкрддреЗ рдкрд░ рдЕрдЧрд▓рд╛ рд░рд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╡рд╣рд╛рдБ рдкрд┐рдЫрд▓реЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдпреЛрдЧ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред


рдирд┐рд░рдВрддрд░ рдЬрдирд░реЗрдЯрд░ рдЗрд╕ рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рд╡реИрд▓реНрдпреВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдПрдбреНрд░реЗрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИред


рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЙрд╕ рдкрддреЗ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк reg_pc рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╢рд░реНрдд рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ TST рдкрддрд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВ, рдЬреЛ рдХрд┐рд╕реА рднреА рдиреЙрдирдЬрд░реЛ рдорд╛рди рдХреЛ 1 рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреЛ 0 рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЕрдЧрд▓реЗ рдХрдорд╛рдВрдб рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП 1 рдХреЗ рдмрдЬрд╛рдп 2 рд╕реЗ рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рддрд╛ рд╣реИред


  always @ (posedge clk) begin if (reset) begin reg_pc <= 0; end else begin reg_reg <= data_w; if (addr_w == PC) begin reg_pc <= data_w; end else begin reg_pc <= reg_pc + (((addr_w == TST) && data_w[0]) ? 2 : 1); case (addr_w) PORT: reg_port <= data_w; endcase end end end endmodule 

cpu.v
 module rom1r(addr_r, data_r); parameter ADDR_WIDTH = 8; parameter DATA_WIDTH = 8; input [ADDR_WIDTH - 1 : 0] addr_r; output [DATA_WIDTH - 1 : 0] data_r; reg [DATA_WIDTH - 1 : 0] mem [0 : (1<<ADDR_WIDTH) - 1]; initial $readmemh("rom.txt", mem, 0, (1<<ADDR_WIDTH) - 1); assign data_r = mem[addr_r]; endmodule module ram1r1w(write, addr_w, data_w, addr_r, data_r); parameter ADDR_WIDTH = 8; parameter DATA_WIDTH = 8; input write; input [ADDR_WIDTH - 1 : 0] addr_r, addr_w; output [DATA_WIDTH - 1 : 0] data_r; input [DATA_WIDTH - 1 : 0] data_w; reg [DATA_WIDTH - 1 : 0] mem [0 : (1<<ADDR_WIDTH) - 1]; assign data_r = mem[addr_r]; always @ (posedge write) mem[addr_w] <= data_w; endmodule module cpu(clk, reset, port); parameter WIDTH = 8; parameter RAM_SIZE = 8; parameter ROM_SIZE = 8; parameter PC = 0; parameter CG = 1; parameter TST = 2; parameter ADD = 3; parameter SUB = 4; parameter PORT = 5; input clk, reset; output [WIDTH-1 : 0] port; wire [WIDTH-1 : 0] addr_r, addr_w, data_r, data_w, data; reg [WIDTH-1 : 0] reg_pc; reg [WIDTH-1 : 0] reg_reg; reg [WIDTH-1 : 0] reg_port; assign port = reg_port; rom1r rom(reg_pc, {addr_w, addr_r}); defparam rom.ADDR_WIDTH = ROM_SIZE; defparam rom.DATA_WIDTH = RAM_SIZE * 2; ram1r1w ram (clk, addr_w, data_w, addr_r, data_r); defparam ram.ADDR_WIDTH = RAM_SIZE; defparam ram.DATA_WIDTH = WIDTH; assign data = (addr_r == PC) ? reg_pc : (addr_r == PORT) ? reg_port : data_r; assign data_w = (addr_w == CG) ? addr_r : (addr_w == TST) ? |data : (addr_w == ADD) ? data + reg_reg : (addr_w == SUB) ? data - reg_reg : data; always @ (posedge clk) begin if (reset) begin reg_pc <= 0; end else begin reg_reg <= data_w; if (addr_w == PC) begin reg_pc <= data_w; end else begin reg_pc <= reg_pc + (((addr_w == TST) && data_w[0]) ? 2 : 1); case (addr_w) PORT: reg_port <= data_w; endcase end end end endmodule 

рд╡рд╣ рдкреВрд░рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред


рдХреЛрдбрд╛рдВрддрд░рдХ


рдЕрдм рд╣рдо рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдкреЛрд░реНрдЯ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ 5 рдкрд░ рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ (рд╕рдВрдкреВрд░реНрдг рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдП = рдмреА), рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд▓реБрдЖ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИ, рдЙрд╕реА рд╕рдордп рд╣рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реБрдЖ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИред ред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рд╢реЗрд╖ рдкрддреЛрдВ рдХреА рдШреЛрд╖рдгрд╛, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдЪрд░ 7 рдкрддреЗ рдкрд░ рдмрджрд▓рддрд╛ рд╣реИ


 require ("asm") PC = mem(0) CG = mem(1) TST = mem(2) ADD = mem(3) SUB = mem(4) PORT = mem(5) cnt = mem(7) 

рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд▓реБрдЖ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдЯрд╛-рдЯреЗрдмрд▓ _G рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯреНрд╕ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ) рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдЙрд╕реА рд╕рдордп рдЧрд┐рд░ рдЧрдП рдереЗ: рдиреЙрди-рдлреЛрдХрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ some_variable = 0xAA рд╣рдорд╛рд░рд╛ рдЕрд╕реЗрдВрдмрд▓рд░ рдЦреБрдж рдХреЛ рдорд╛рдирддрд╛ рд╣реИ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░реЙрд╕реЗрдЯ (_G, some_variable, 0xAA) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдореЗрдЯрд╛рдореЗрдереЛрдб рдХреЛ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


 function jmp(l) CG = l PC = CG end 

рд▓реЗрдмрд▓ рд╢рдмреНрдж рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, Lua рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрд░реНрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрд╖реНрдардХ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 label "start" 

рдкреЛрд░реНрдЯ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:


 CG = 0 cnt = CG PORT = CG 

рд▓реВрдк рдореЗрдВ, рд╕реНрдерд┐рд░ 1 рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреЛрд░реНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдПрдВ:


 label "loop" CG = 1 ADD = cnt -- add = cnt + 1 cnt = ADD PORT = ADD 

0 рдкрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд▓рд╛рдкрддрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░, рдпрджрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рд╢реБрд░реБрдЖрдд рдкрд░ рдЬрд╛рдПрдВ, рд╕реАрдЬреА = "рдирд┐рдХрд╛рд╕" рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдПрдХ рдЕрдирдВрдд рд▓реВрдк "рдирд┐рдХрд╛рд╕" рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред


 CG = -5 ADD = ADD --add = add + 251 CG = "loop" TST = ADD --skip "exit" if not 0 CG = "exit" PC = CG label "exit" jmp "exit" 

test.lua
 require ("asm") PC = mem(0) CG = mem(1) TST = mem(2) ADD = mem(3) SUB = mem(4) PORT = mem(5) cnt = mem(7) function jmp(l) CG = l PC = CG end label "start" CG = 0 cnt = CG PORT = CG label "loop" CG = 1 ADD = cnt -- add = cnt + 1 cnt = ADD PORT = ADD CG = -5 ADD = ADD --add = add + 256 - 5 CG = "loop" TST = ADD --skip "exit" if not 0 CG = "exit" PC = CG label "exit" jmp "exit" 

рдФрд░ рдЕрдм рдХреЛрдбрд╛рдВрддрд░рдХ asm.lua рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 20 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


рдореЗрдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ (рд╡рд┐рд╢реЗрд╖ рдкрддреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░, рдЕрдЧрд▓реЗ рдореБрдлреНрдд рдкрддреЗ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рднреА рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдФрд░ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдЯреИрдЧ рдХреЛ рдкреБрдирдГ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛


 local output = {} local labels = {} function mem(addr) return addr end function label(name) labels[name] = #output end 

рд▓реБрдЖ рдХреЗ рдкрд╛рд╕ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдЯрд╛рдореЗрдереЛрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдФрд░ _G рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░реНрдпрд╛рд╡рд░рдг рддрд╛рд▓рд┐рдХрд╛ рд╕рд╣рд┐рдд рдирдП рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдореЗрдереЛрдб рд╣реИрдВред
рдЪреВрдВрдХрд┐ __newindex рдХреЗрд╡рд▓ рдЙрди рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдирдП рддрддреНрд╡реЛрдВ рдХреЛ _G рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ _G рдореЗрдВ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рдЫреБрдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдЙрдиреНрд╣реЗрдВ __index рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджреЗрдВред


рдпрджрд┐ рдирд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред


 local g = {} setmetatable(_G, { __index = function(t, k, v) return g[k] end, __newindex = function(t, k, v) if g[k] then table.insert(output, {g[k], v}) else g[k]=v end end }) 

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


 setmetatable(output, { __gc = function(o) for i,v in ipairs(o) do if type(v[2]) == "string" then v[2] = labels[v[2]] or print("error: ", v[2]) end print(string.format("%02X%02X", v[1] & 0xFF, v[2] & 0xFF)) end end }) 

asm.lua
 local output = {} local labels = {} function mem(addr) return addr end function label(name) labels[name] = #output end local g = {} setmetatable(_G, { __index = function(t, k, v) return g[k] end, __newindex = function(t, k, v) if g[k] then table.insert(output, {g[k], v}) else g[k]=v end end }) setmetatable(output, { __gc = function(o) for i,v in ipairs(o) do if type(v[2]) == "string" then v[2] = labels[v[2]] or print("error: ", v[2]) end print(string.format("%02X%02X", v[1] & 0xFF, v[2] & 0xFF)) --FIX for WIDTH > 8 end end }) 

Lua53 test.lua> rom.txt ( рдпрд╛ рдСрдирд▓рд╛рдЗрди ) рдЪрд▓рд╛рдХрд░ рд╣рдореЗрдВ рдорд╢реАрди рдХреЛрдбреНрд╕ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред


rom.txt
 0100 0701 0501 0101 0307 0703 0503 01FB 0303 0103 0203 010D 0001 010D 0001 

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


test.v
 `include "cpu.v" module test(); reg clk; reg reset; wire [7:0] port; cpu c(clk, reset, port); initial begin $dumpfile("test.vcd"); reset <= 1; clk <= 0; #4 reset <= 0; #150 $finish; end always #1 clk <= !clk; endmodule 

Iverilog -o test.vvp test.v рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдХрд▓реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, GTKWave рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА test.vcd рдЦреЛрд▓реЗрдВ:

рдкреЛрд░реНрдЯ рдкрд╛рдВрдЪ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реВрдк рдХрд░рддрд╛ рд╣реИред


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

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


All Articles