рднрд╛рдЧ Iрднрд╛рдЧ IIрднрд╛рдЧ IIIрднрд╛рдЧ ivрднрд╛рдЧ vрдпрд╣ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЗрд╕реНрдЯрдмреЗрдВрдЪ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред
рд╣рдо рд╡реЗрд░рд┐рд▓реЙрдЧ рдореЗрдВ
рд▓рд┐рдЯрд┐рд▓ рдореИрди рдХрдВрдкреНрдпреВрдЯрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред
LMC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд▓реЗрдЦ Habr├й рдкрд░ рдерд╛ред
рдЗрд╕ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдСрдирд▓рд╛рдЗрди рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░
рдпрд╣рд╛рдБ рд╣реИ ред
рдПрдХ рд░реИрдо рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рд░ (ADDR_WIDTH = 2) рдЪрд╛рд░-рдмрд┐рдЯ (DATA_WIDTH = 4) рд╢рдмреНрдж рд╣реЛрддреЗ рд╣реИрдВред рдХреНрд▓реЙрдХ рд╕рд┐рдЧреНрдирд▓ рдХреНрд▓рдХ рдЖрдиреЗ рдкрд░ adr рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдбрд╛рдЯрд╛_рдЗрди рд╕реЗ рд░реИрдо рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
module R0 #(parameter ADDR_WIDTH = 2, DATA_WIDTH = 4) ( input clk, // input [ADDR_WIDTH-1:0] adr, // input [DATA_WIDTH-1:0] data_in, // output [DATA_WIDTH-1:0] RAM_out // ); reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; // mem always @(posedge clk) // clk mem [adr] <= data_in; // data_in assign RAM_out = mem[adr]; // RAM_out endmodule
Testbench рдореЗрдВ, 0001 рдкрд░ 00, 01 рдореЗрдВ 0010, 10 рдореЗрдВ 1000, 11 рдкрд░ 1000:
рдПрдХ рдЯреЗрд╕реНрдЯрдмреЗрдВрдЪ рдмрдирд╛рдПрдВрдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ, R0.v рдФрд░ tR0.v рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ (рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрдиреЗ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рдПрдВрдЧреА)ред
рджреЛрдиреЛрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред
рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓ tR0.v рдХрд╛ рд╕рд┐рдореБрд▓реЗрд╢рди рдЪрд▓рд╛рдПрдВ
module tR0; reg clk; reg [1:0] adr; reg [3:0] data_in; wire [3:0] RAM_out; R0 test_R0 (clk, adr, data_in,RAM_out); initial begin clk = 0; adr[0] = 0; adr[1] = 0; data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; #5 data_in[0] = 1; #5 clk = 1; #5 adr[0] = 1; data_in[0] = 0; data_in[1] = 1; clk = 0; #5 clk = 1; #5 adr[0] = 0; adr[1] = 1; data_in[1] = 0; data_in[2] = 1; clk = 0; #5 clk = 1; #5 adr[0] = 1; adr[1] = 1; data_in[2] = 0; data_in[3] = 1; clk = 0; #5 clk = 1; #5 adr[0] = 0; adr[1] = 0; data_in[3] = 0; clk = 0; #5 adr[0] = 1; adr[1] = 0; #5 adr[0] = 0; adr[1] = 1; #5 adr[0] = 1; adr[1] = 1; #5 adr[0] = 0; adr[1] = 0; #5 adr[0] = 1; adr[1] = 0; #5 adr[0] = 0; adr[1] = 1; #5 adr[0] = 1; adr[1] = 1; #5 adr[0] = 0; adr[1] = 0; #5 adr[0] = 1; adr[1] = 0; #5 adr[0] = 0; adr[1] = 1; #5 adr[0] = 1; adr[1] = 1; end endmodule

рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд░реИрдо рдХреЗ рдПрдбреНрд░реЗрд╕ рдЗрдирдкреБрдЯ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдХрд╛рдЙрдВрдЯрд░ рдЗрдирдкреБрдЯ рд╕реЗ рдШрдбрд╝реА рдЬрдирд░реЗрдЯрд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдпрд╣рд╛рдВ ALTUFM_OSC рдЖрдВрддрд░рд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдПрдХ рдорд╛рдирдХ рдЬрдирд░реЗрдЯрд░ рдХреА рдЖрд╡реГрддреНрддрд┐ 5.5 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ (MAX II EPM240 CPLD рдиреНрдпреВрдирддрдо рд╡рд┐рдХрд╛рд╕ рдмреЛрд░реНрдб)ред
module inner_Clock ( output reg LED); ALTUFM_OSC osc( .oscena(1'b1), .osc(clk)); reg signal; reg [24:0] osc_counter; reg [24:0] const_data = 25'b10110111000110110000000; initial begin signal = 1'b0; osc_counter = 25'b0; end // 6 000 000 osc_counter always @(posedge clk) begin osc_counter <= osc_counter+ 1'b1; if(osc_counter == const_data) begin signal <= ~signal; osc_counter <= 25'b0; end LED = signal; // LED ~1 . end endmodule
рдЖрдк рдПрдХ рдмрд╛рд╣рд░реА рдЬрдирд░реЗрдЯрд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ 555 рд╕реАрдПрдордУрдПрд╕ рдЯрд╛рдЗрдорд░ (3.3 рд╡реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд)ред рд╣рдо 555 рдЯрд╛рдЗрдорд░ рдХреЛ рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд░реИрдо рдХреЗ рдПрдбреНрд░реЗрд╕ рдЗрдирдкреБрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдм рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдПрдХ рдШрдбрд╝реА рдХрд╛ рд╕рд┐рдЧреНрдирд▓ рдЖрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдЧрд▓реЗ рд╕реЗрд▓ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗред рд╣рдо RAM_button рдмрдЯрди рдХреЛ RAM рдШрдбрд╝реА рдЗрдирдкреБрдЯ рд╕реЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗ - рдЬрдм рдпрд╣ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ RAM рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
module R1 (timer555, RAM_button, data_in, RAM_out, counter); parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; input timer555; input RAM_button; //input [ADDR_WIDTH-1:0] adr; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM_out; output reg [1:0] counter; // Counter always @(posedge timer555) counter <= counter + 1; // RAM wire [ADDR_WIDTH-1:0] adr; assign adr = counter; reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; always @(posedge RAM_button) mem [adr] <= data_in; assign RAM_out = mem[adr]; endmodule
рдпрд╣ рд╡рд╣ рд╕рд░реНрдХрд┐рдЯ рд╣реИ рдЬреЛ RTL рд╡реНрдпреВрдЕрд░ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ

рдореЙрдбрд▓рд╕рд┐рдо рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ, рдпрд╣ рдпреЛрдЬрдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХрд╛рдЙрдВрдЯрд░ [1: 0] рдХреЗ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред
рд╕рд░реНрдХрд┐рдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реАрдзреЗ FPGA рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВред Counter_load рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ data_in [1: 0] рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
module R2 (counter, timer555, Counter_load, RAM_button, data_in, RAM_out); parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; output [1:0] counter; input timer555, Counter_load; // input [N-1:0] adr; input RAM_button; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM_out; // Counter reg [1:0] counter; always @ (posedge timer555 or posedge Counter_load) if (Counter_load) counter <= data_in[1:0]; else counter <= counter + 2'b01; // RAM wire [ADDR_WIDTH-1:0] adr; assign adr = counter; reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; always @(posedge RAM_button) mem [adr] <= data_in; assign RAM_out = mem[adr]; endmodule
рдкрд┐рди рдкреНрд▓рд╛рдирд░ рдореЗрдВ рдмрдЯрди рдФрд░ рдПрд▓ рдИ рдбреА рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

00 рдореЗрдВ 0001, 01 рдореЗрдВ 0010, 10 рдореЗрдВ 1000, 11 рдмрдЬреЗ 1000 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
module tR2; parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; reg timer555, Counter_load, RAM_button; wire [1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM_out; R2 test_R2(counter, timer555, Counter_load, RAM_button, data_in, RAM_out); initial // Clock generator begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; Counter_load = 0; RAM_button = 0; #5 data_in[0]=0; data_in[1]=0; Counter_load=1; RAM_button=0; #5 data_in[0]=1; data_in[1]=0; Counter_load=0; RAM_button=1; #5 data_in[0]=0; data_in[1]=0; Counter_load=0; RAM_button=0; #5 data_in[0]=1; data_in[1]=0; Counter_load=1; RAM_button=0; #5 data_in[0]=0; data_in[1]=1; Counter_load=0; RAM_button=1; #5 data_in[0]=0; data_in[1]=0; Counter_load=0; RAM_button=0; #5 data_in[0]=0; data_in[1]=1; Counter_load=1; RAM_button=0; #5 data_in[2]=1; data_in[0]=0; data_in[1]=0; Counter_load=0; RAM_button=1; #5 data_in[2]=0; data_in[0]=0; data_in[1]=0; Counter_load=0; RAM_button=0; #5 data_in[0]=1; data_in[1]=1; Counter_load=1; RAM_button=0; #5 data_in[3]=1; data_in[0]=0; data_in[1]=0; Counter_load=0; RAM_button=1; #5 data_in[3]=0; data_in[0]=0; data_in[1]=0; Counter_load=0; RAM_button=0; end endmodule

рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рдПрдХ 4bit'ny рд░рдЬрд┐рд╕реНрдЯрд░ (рдмреИрдЯрд░реА) рдмрдирд╛рдПрдВред
рдЬрдм рдЖрдк reg_button рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдбреЗрдЯрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
module register4 ( input [3:0] reg_data, input reg_button, output reg [3:0] q ); always @(posedge reg_button) q <= reg_data; endmodule
Acc рд╕рдВрдЪрд╛рдпрдХ, MUX2 рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдпреЛрдЧ рдпреЛрдЬрдХ рдЬреЛрдбрд╝реЗрдВред
рдпреЛрдЬрдХ рдореЗрдореЛрд░реА рд╕реЗ рдмреИрдЯрд░реА Acc рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рдЗрдирдкреБрдЯ рдХреЛ рдирдВрдмрд░ data_in рдФрд░ sum рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
MUX2 рд╕реЗ рд╕рдВрдЦреНрдпрд╛ Acc_button рдмрдЯрди рджрдмрд╛рдХрд░ Acc рдмреИрдЯрд░реА рдореЗрдВ рд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИред
рдЬрдм RAM_button рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ Ass рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдХреЛ RAM рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


module R3 (MUX_switch, Acc_button, Acc, counter, timer555, Counter_load, RAM_button, data_in, RAM_out); parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; input MUX_switch; input Acc_button; output [3:0] Acc; input timer555, Counter_load; output [1:0] counter; // input [N-1:0] adr; input RAM_button; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM_out; // Counter reg [1:0] counter; always @ (posedge timer555 or posedge Counter_load) if (Counter_load) counter <= data_in[1:0]; else counter <= counter + 2'b01; // RAM wire [ADDR_WIDTH-1:0] adr; assign adr = counter; reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; always @(posedge RAM_button) mem [adr] <= Acc; assign RAM_out = mem[adr]; // sum wire [3:0] sum; assign sum = Acc + RAM_out; // MUX2 reg [3:0] MUX2; always @* MUX2 = MUX_switch ? sum : data_in; // Acc_button /* reg Acc_dff; always @(posedge Acc_button or negedge timer555) if (!timer555) Acc_dff <= 1'b0; else Acc_dff <= timer555; */ //Acc register4 Acc_reg( .reg_data(MUX2), //.reg_button(Acc_dff), .reg_button(Acc_button), .q(Acc) ); endmodule
рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЪреИрдЯрд░ рд╕рдкреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рджреА рдЧрдИ рд╕рд░рд▓ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
/ * reg Acc_dff;
рд╣рдореЗрд╢рд╛ @ (posedge Acc_button рдпрд╛ negedge рдЯрд╛рдЗрдорд░ 555)
рдЕрдЧрд░ (рдЯрд╛рдЗрдорд░ 555)
Acc_dff <= 1'b0;
рдЕрдиреНрдпрдерд╛
Acc_dff <= рдЯрд╛рдЗрдорд░555; * /
рдЖрдк рд▓реЗрдЦ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрдЯрди рдмрдХрд╡рд╛рд╕ рджрдорди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ AVR рдлреНрд▓реИрд╢ рдХрд░рддреЗ рд╣реИрдВрдЕрдЧрд▓рд╛, рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2 рдФрд░ 3ред
1. рд░реИрдо рдореЗрдВ рдирдВрдмрд░ рд▓реЛрдб рдХрд░реЗрдВ
2. рдЬреАрд░реЛ рдж рдРрд╕
3. MUX2 рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ
4. рд░реИрдо рд╕реЗ рдЕрд╕ рддрдХ рдХрд╛ рдкрд╣рд▓рд╛ рдирдВрдмрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
5. рдЕрд╕ рдореЗрдВ рд░реИрдо рд╕реЗ рджреВрд╕рд░реЗ рдирдВрдмрд░ рдХреЛ рдирдВрдмрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
6. рд░реИрдо рдХреЛ рд░рд╛рд╢рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
module tR3; parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; reg MUX_switch; reg Acc_button; wire [3:0] Acc; reg timer555, Counter_load, RAM_button; wire [1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM_out; R3 test_R3(MUX_switch, Acc_button, Acc, counter, timer555, Counter_load, RAM_button, data_in, RAM_out); initial begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; Counter_load = 0; Acc_button = 0; RAM_button = 0; MUX_switch = 0; #5 Counter_load = 1; #5 data_in[0]=0; data_in[1]=1; Counter_load = 0; #5 Acc_button = 1; #5 RAM_button = 1; #5 data_in[0]=0; data_in[1] = 0; Acc_button = 0; RAM_button = 0; #5 data_in[0]=1; data_in[1]=1; #15 Acc_button = 1; #5 RAM_button = 1; #5 Acc_button = 0; #5 data_in[0]=0; data_in[1] = 0; RAM_button = 0; #10 Acc_button = 1; #10 Acc_button = 0; #60 MUX_switch = 1; #10 Acc_button = 1; #10 Acc_button = 0; #30 Acc_button = 1; #10 Acc_button = 0; #30 RAM_button = 1; #10 RAM_button = 0; end endmodule

рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдмреИрдЯрд░реА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдШрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рдореЗрдВ рджрд░реНрдЬ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
wire [3:0] subtract; assign subract = Acc - RAM_out ;
рд╣рдо рджреЛ-рдЗрдирдкреБрдЯ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХреЛ рдЪрд╛рд░-рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ
always @* MUX4 = MUX_switch[1] ? (MUX_switch[0] ? RAM_out : subtract) : (MUX_switch[0] ? sum : data_in);
рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмреИрдЯрд░реА (4bit'ny рд░рдЬрд┐рд╕реНрдЯрд░) рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╣рдо рдмреИрдЯрд░реА рдХреЛ 2 рдЭрдВрдбреЗ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
1. рдЭрдВрдбрд╛ "рд╢реВрдиреНрдп" рдПрдХ рд▓реЙрдЧ рд╣реИред рддрддреНрд╡ 4 рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЧрдзрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рд╢реВрдиреНрдп рд╣реИ рддреЛ рдЭрдВрдбрд╛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
2. рдЭрдВрдбрд╛ "рд╢реВрдиреНрдп рдпрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛" рдПрдХ рд▓реЙрдЧ рд╣реИред рддрддреНрд╡ рдЪрд╛рд░ рдЕрдВрдХреЛрдВ рдХреА рдмреИрдЯрд░реА рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЧрдзрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рддреЛ рдЭрдВрдбрд╛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
// "" output Z_flag; assign Z_flag = ~(|Acc); // // " " output PZ_flag; assign PZ_flag = ~Acc[3];

рддреАрди рдЯреАрдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
1. рдбреЗрдЯрд╛_рдЖрдЙрдЯ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдмреИрдЯрд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдирд╛
2. рдкрддрд╛ рдХрд╛рдЙрдВрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдЕрдЧрд░ рдЭрдВрдбрд╛ тАЬрд╢реВрдиреНрдптАЭ рдмрдврд╝рд╛ рд╣реБрдЖ рд╣реИ (JMP рдЕрдЧрд░ Acc = 0)
3. рдкрддрд╛ рдХрд╛рдЙрдВрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдЕрдЧрд░ рдЭрдВрдбрд╛ "рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛" рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЗрдПрдордкреА рдЕрдЧрд░ Acc> = 0)
module R4 (JMP,Z_JMP,PZ_JMP,Z_flag,PZ_flag,Output_button,data_out,MUX_switch,Acc_button,Acc,counter,timer555,RAM_button,data_in,RAM_out); parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; input JMP, Z_JMP, PZ_JMP; output Z_flag, PZ_flag; input Output_button; output [3:0] data_out; input [1:0] MUX_switch; input Acc_button; output [3:0] Acc; input timer555; output [1:0] counter; input RAM_button; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM_out; // flags wire Z,PZ; assign Z = Z_flag & Z_JMP; assign PZ = PZ_flag & PZ_JMP; // Counter reg [1:0] counter; always @ (posedge timer555 or posedge JMP or posedge Z or posedge PZ) if (JMP|Z|PZ) counter <= data_in[1:0]; else counter <= counter + 2'b01; // RAM wire [ADDR_WIDTH-1:0] adr; assign adr = counter; reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; always @(posedge RAM_button) mem [adr] <= Acc; assign RAM_out = mem[adr]; // sum wire [3:0] sum; assign sum = Acc + RAM_out; //subtract wire [3:0] subtract; assign subtract = Acc - RAM_out; // MUX4 reg [3:0] MUX4; always @* MUX4 = MUX_switch[1] ? (MUX_switch[0] ? RAM_out : subtract) : (MUX_switch[0] ? sum : data_in); //Acc register4 Acc_reg( .reg_data(MUX4), .reg_button(Acc_button), .q(Acc) ); //data_out register4 Output_reg( .reg_data(Acc), .reg_button(Output_button), .q(data_out) ); assign Z_flag = ~(|Acc); assign PZ_flag = ~Acc[3]; endmodule

1. рд░реИрдо рдореЗрдВ рдирдВрдмрд░ рд▓реЛрдб рдХрд░реЗрдВ
2. рдЬреАрд░реЛ рдж рдРрд╕
3. MUX2 рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ
4. рдЧрдзреЗ рд╕реЗ рдкрд╣рд▓рд╛ рдирдВрдмрд░ (рд░реИрдо рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реБрдЖ) рдШрдЯрд╛рдПрдВ
5. Ass рд╕реЗ рджреВрд╕рд░реЗ рдирдВрдмрд░ (RAM рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реБрдЖ) рдХреЛ рдШрдЯрд╛рдирд╛
6. рд░реИрдо рдФрд░ data_out рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
module tR4; parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; reg JMP, Z_JMP, PZ_JMP; wire Z_flag, PZ_flag; reg Output_button; wire [3:0] data_out; reg [1:0] MUX_switch; reg Acc_button; wire [3:0] Acc; reg timer555, RAM_button; wire [1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM_out; R4 test_R4 (JMP,Z_JMP,PZ_JMP,Z_flag,PZ_flag,Output_button,data_out,MUX_switch,Acc_button,Acc, counter,timer555,RAM_button,data_in,RAM_out); initial begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; JMP = 0; Z_JMP = 0; PZ_JMP = 0; Acc_button = 0; RAM_button = 0; Output_button = 0; MUX_switch[0] = 0; MUX_switch[1] = 0; #5 JMP = 1; #5 data_in[0]=0; data_in[1]=1; JMP = 0; #5 Acc_button = 1; #5 RAM_button = 1; #5 data_in[0]=0; data_in[1] = 0; Acc_button = 0; RAM_button = 0; #5 data_in[0]=1; data_in[1]=1; #15 Acc_button = 1; #5 RAM_button = 1; #5 Acc_button = 0; #5 data_in[0]=0; data_in[1] = 0; RAM_button = 0; #10 Acc_button = 1; #10 Acc_button = 0; #60 MUX_switch[1] = 1; #10 Acc_button = 1; #10 Acc_button = 0; #30 Acc_button = 1; #10 Acc_button = 0; #30 RAM_button = 1; Output_button = 1; #10 RAM_button = 0; Output_button = 0; end endmodule

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдЬрдм рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╕рдВрдЦреНрдпрд╛ Ass рдореЗрдВ рд╣реЛрддреА рд╣реИ, рддреЛ Z_JMP рд╕рдВрдХреНрд░рдордг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ:
module tR4_jmp; parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 4; reg JMP, Z_JMP, PZ_JMP; wire Z_flag, PZ_flag; reg Output_button; wire [3:0] data_out; reg [1:0] MUX_switch; reg Acc_button; wire [3:0] Acc; reg timer555, RAM_button; wire [1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM_out; R4 test_R4 (JMP,Z_JMP,PZ_JMP,Z_flag,PZ_flag,Output_button,data_out,MUX_switch,Acc_button,Acc, counter,timer555,RAM_button,data_in,RAM_out); initial begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; JMP = 0; Z_JMP = 0; PZ_JMP = 0; Acc_button = 0; RAM_button = 0; Output_button = 0; MUX_switch[0] = 0; MUX_switch[1] = 0; #5 JMP = 1; #5 data_in[0]=0; data_in[1]=1; JMP = 0; #5 Acc_button = 1; #5 data_in[0]=1; data_in[1]=1; Acc_button = 1; #5 data_in[0]=1; data_in[1]=1; Acc_button = 0; #5 Z_JMP = 1; #5 PZ_JMP = 1; Z_JMP = 0; #5 PZ_JMP = 0; end endmodule

рд░реИрдо рдореЗрдВ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдХрдорд╛рдВрдб рдбрд╛рд▓реЗрдВ

рдбрд┐рдЬрд╛рдЗрди рджреЗрдЦреЗрдВ
//wire Counter_load; always @ (posedge timer555) if (Counter_load) counter <= RAM_out[3:0]; else counter <= counter + 2'b01;
ModelSim рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд reset_count рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред
module resCount (reset_count, counter, timer555, RAM_button, data_in, RAM_out); parameter ADDR_WIDTH = 4; parameter DATA_WIDTH = 8; input reset_count; output [ADDR_WIDTH-1:0] counter; input timer555; input RAM_button; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM_out; wire Counter_load; assign Counter_load = RAM_out[7]; reg [ADDR_WIDTH-1:0] counter; always @ (posedge timer555 or posedge reset_count) if (reset_count) counter <= 4'b0000; else if (Counter_load) counter <= RAM_out[3:0]; else counter <= counter + 4'b0001; wire [ADDR_WIDTH-1:0] adr; assign adr = counter; reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; always @(posedge RAM_button) mem [adr] <= data_in; assign RAM_out = mem[adr]; endmodule
рдкрд░реАрдХреНрд╖рдг рдмреЗрдВрдЪ
module tresCount; parameter ADDR_WIDTH = 4; parameter DATA_WIDTH = 8; reg reset_count; reg timer555, RAM_button; wire [ADDR_WIDTH-1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM_out; resCount test_resCount(reset_count, counter, timer555, RAM_button, data_in, RAM_out); initial // Clock generator begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; data_in[4] = 0; data_in[5] = 0; data_in[6] = 0; data_in[7] = 0; RAM_button = 0; reset_count =1; #5 reset_count =0; #1500 data_in[7] =1; #5 RAM_button = 1; #5 data_in[7] =0; RAM_button = 0; end endmodule

рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ MUX2 рдФрд░ Assред рд╣рдо RAM_out рдХрдорд╛рдВрдб [6] рдХреЗ рд╕рд╛рде Ass рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВрдЧреЗред
assign Acc_button = RAM_out[6];
рд╣рдо рдПрдХ рд▓реЙрдЧ рдХреЛ рдХреНрд▓реЙрдХ рдЗрдирдкреБрдЯ рдЕрд╕ рд╕реЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рддрддреНрд╡ рдФрд░
// regiser4 (posedge reg_button) (negedge reg_button) .reg_button(Acc_button & timer555),
рд▓реЙрдЧ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрдеред рддрддреНрд╡ рдФрд░ рдШрдбрд╝реА рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЕрдм рдЯрд╛рдЗрдорд░ 555 рдХреЗ рдореЛрд░реНрдЪреЗ рдкрд░ рдЖрдк рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмреИрдЯрд░реА рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рд░рд╛рд╡рдЯ рдкрд░ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдордиреЗ рджреЛ рдЯреАрдореЛрдВ рдХреЛ рдПрдХ рд╣рд░рд╛ рджрд┐рдпрд╛ред
рд╣рдо MUX2 рдХреЛ RAM_out рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВрдЧреЗ [5]
assign MUX_switch = RAM_out[5];

module register4 ( input [3:0] reg_data, input reg_button, output reg [3:0] q ); always @(negedge reg_button) // "posedge" "negedge" q <= reg_data; endmodule module R50 (reset_count, counter, timer555, RAM_button, data_in, RAM_out, mux_switch_out, mux_out,Acc_out); parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 8; input reset_count; output [ADDR_WIDTH-1:0] counter; input timer555; input RAM_button; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM_out; output [3:0] Acc_out; output mux_switch_out; output [3:0] mux_out; wire Counter_load; assign Counter_load = RAM_out[7]; //Counter reg [ADDR_WIDTH-1:0] counter; always @ (posedge timer555 or posedge reset_count) if (reset_count) counter <= 2'b00; else if (Counter_load) counter <= RAM_out[1:0]; else counter <= counter + 2'b01; wire [ADDR_WIDTH-1:0] adr; assign adr = counter; //RAM reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; always @(posedge RAM_button) mem [adr] <= data_in; assign RAM_out = mem[adr]; // MUX2 wire MUX_switch; assign MUX_switch = RAM_out[5]; reg [3:0] MUX2; always @* MUX2 = MUX_switch ? RAM_out : data_in[3:0]; // 4 data_in assign mux_out = MUX2; assign mux_switch_out = MUX_switch; wire Acc_button; assign Acc_button = RAM_out[6]; //Acc register4 Acc_reg( .reg_data(mux_out), .reg_button(Acc_button & timer555), .q(Acc_out) ); endmodule
рдЯреЗрд╕реНрдЯрдмреЗрдВрдЪ рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛ 0101 рд╕реЗ рд╕реЗрд▓ 00, рдФрд░ рдирдВрдмрд░ 1010 рд╕реЗ рд╕реЗрд▓ 01 рд▓рд┐рдЦреЗрдВ; рдЗрди рдирдВрдмрд░реЛрдВ рдХреЛ рдмреИрдЯрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ
module tR50; parameter ADDR_WIDTH = 2; parameter DATA_WIDTH = 8; reg reset_count; reg timer555, RAM_button; wire [ADDR_WIDTH-1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM_out; wire mux_switch_out; wire [3:0] mux_out; wire [3:0] Acc_out; R50 test_R50(reset_count, counter, timer555, RAM_button, data_in, RAM_out, mux_switch_out, mux_out,Acc_out); initial // Clock generator begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 1; data_in[1] = 0; data_in[2] = 1; data_in[3] = 0; data_in[4] = 0; data_in[5] = 1; data_in[6] = 1; data_in[7] = 0; RAM_button = 0; reset_count =1; #5 RAM_button = 1; reset_count = 0; #5 data_in[0]=0; data_in[2]=0; data_in[5]=0; data_in[6]=0; RAM_button=0; #15 data_in[1]=1; data_in[3]=1; data_in[5]=1;data_in[6]=1; #5 RAM_button=1; #5 data_in[1]=0; data_in[3]=0; data_in[5]=0; data_in[6]=0; RAM_button=0; end endmodule

рд╣рдо рджреВрд╕рд░реА рд░реИрдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ RAM рдХреЛ RAM1_out рдХрдорд╛рдВрдб [4] рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрддреЗ рд╣реИрдВред
assign RAM2_button = RAM1_out[4];

module register4 ( input [3:0] reg_data, input reg_button, output reg [3:0] q ); always @(negedge reg_button) q <= reg_data; endmodule module R51 (reset_count, counter, timer555, RAM1_button, data_in, RAM1_out, RAM2_out, mux_switch_out, mux_out,Acc_out); parameter ADDR_WIDTH = 3; parameter DATA_WIDTH = 8; input reset_count; output [ADDR_WIDTH-1:0] counter; input timer555; input RAM1_button; input [DATA_WIDTH-1:0] data_in; output [DATA_WIDTH-1:0] RAM1_out; output [3:0] RAM2_out; output [3:0] Acc_out; output mux_switch_out; output [3:0] mux_out; wire Counter_load; assign Counter_load = RAM1_out[7]; //Counter reg [ADDR_WIDTH-1:0] counter; always @ (posedge timer555 or posedge reset_count) if (reset_count) counter <= 2'b00; else if (Counter_load) counter <= RAM1_out[1:0]; else counter <= counter + 2'b01; wire [ADDR_WIDTH-1:0] adr1; assign adr1 = counter; //RAM1 reg [DATA_WIDTH-1:0] mem1 [2**ADDR_WIDTH-1:0]; always @(posedge RAM1_button ) mem1 [adr1] <= data_in; assign RAM1_out = mem1[adr1]; wire [ADDR_WIDTH-1:0] adr2; assign adr2 = RAM1_out[3:0]; wire RAM2_button; assign RAM2_button = RAM1_out[4]; //RAM2 reg [3:0] mem2 [2**ADDR_WIDTH-1:0]; always @(posedge RAM2_button) mem2 [adr2] <= Acc_out; assign RAM2_out = mem2[adr2]; // MUX2 wire MUX_switch; assign MUX_switch = RAM1_out[5]; reg [3:0] MUX2; always @* MUX2 = MUX_switch ? RAM2_out : data_in[3:0]; assign mux_out = MUX2; assign mux_switch_out = MUX_switch; wire Acc_button; assign Acc_button = RAM1_out[6]; //Acc register4 Acc_reg( .reg_data(mux_out), .reg_button(Acc_button & timer555), .q(Acc_out) ); endmodule
Testbench рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛ 0100 рдФрд░ 1000 рдХреЛ Ass рд╕реЗ рд╢реВрдиреНрдп 0000 рдФрд░ RAM рдореЗрдо 2 рдХреА рдкрд╣рд▓реА 0001 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ (рдлрд┐рд░ рд░реИрдо рдореЗрдо 2 рд╕реЗ рдЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ Ass рдкрд░ рд▓реЛрдб рдХрд░реЗрдВ)
module tR51; parameter ADDR_WIDTH = 3; parameter DATA_WIDTH = 8; reg reset_count; reg timer555, RAM1_button; wire [ADDR_WIDTH-1:0] counter; reg [DATA_WIDTH-1:0] data_in; wire [DATA_WIDTH-1:0] RAM1_out; wire [3:0] RAM2_out; wire mux_switch_out; wire [3:0] mux_out; wire [3:0] Acc_out; R51 test_R51(reset_count, counter, timer555, RAM1_button, data_in, RAM1_out, RAM2_out, mux_switch_out, mux_out,Acc_out); initial // Clock generator begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; data_in[4] = 0; data_in[5] = 0; data_in[6] = 1; data_in[7] = 0; RAM1_button = 0; reset_count =1; #5 RAM1_button = 1; reset_count = 0; #5 RAM1_button = 0; data_in[6] = 0; #10 data_in[4] = 1; #5 RAM1_button = 1; #5 data_in[4] = 0; RAM1_button = 0; #30 data_in[6] = 1; #5 RAM1_button = 1; #5 data_in[6] = 0; RAM1_button = 0; #30 data_in[4] = 1; data_in[0] = 1; #5 RAM1_button = 1; #5 data_in[4] = 0; data_in[0] = 0; RAM1_button = 0; #30 data_in[6] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[6] = 0; #30 data_in[5] = 1; data_in[6] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[5] = 0; data_in[6] = 0; #30 data_in[5] = 1; data_in[6] = 1; data_in[0] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[0] = 0; data_in[5] = 0; data_in[6] = 0; #70 data_in[2] = 1; #80 data_in[2] = 0; data_in[3] = 1; #40 data_in[3] = 0; end endmodule

рдореИрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рд╕реНрдХреАрдо c рд▓реЙрдЧред рдФрд░ рдмреИрдЯрд░реА рдХреЗ рдШрдбрд╝реА рдЗрдирдкреБрдЯ рдкрд░ рддрддреНрд╡ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдмреЛрд░реНрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)ред рд▓реЙрдЧ рдмрджрд▓реЗрдВред рддрддреНрд╡ рдФрд░ Acc_dff рдЯреНрд░рд┐рдЧрд░ рдкрд░, рд╣рдо рдЯрд╛рдЗрдорд░ 555 рдШрдбрд╝реА рд╕рдВрдХреЗрдд рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдХрд┐рдирд╛рд░реЗ (рдЧрд┐рд░рд╛рд╡рдЯ рдкрд░) рдореЗрдВ рдЯреНрд░рд┐рдЧрд░ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рд╣рдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдмреИрдЯрд░реА рдкрд░ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ
// Acc_dff reg Acc_dff; always @(negedge timer555) Acc_dff <= Acc_button;
рдЗрд╕рд▓рд┐рдП, рд╢реЗрд╖ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░, R52 рдореЙрдбреНрдпреВрд▓ (LMC) рдмрдирд╛рдПрдВ

module register4 ( input [3:0] reg_data, input reg_button, output reg [3:0] q ); always @(posedge reg_button) // negedge -> posedge q <= reg_data; endmodule module R52 (Z_flag, PZ_flag, reset_count, counter, timer555, RAM1_button, data_in, RAM1_out, RAM2_out, mux_switch_out, mux_out, Acc_out, data_out, Acc_dff); parameter ADDR_WIDTH = 4; parameter DATA_WIDTH = 12; input reset_count; input timer555; input RAM1_button; input [DATA_WIDTH-1:0] data_in; output [ADDR_WIDTH-1:0] counter; output [1:0] mux_switch_out; output [3:0] mux_out; output [3:0] Acc_out; output [3:0] data_out; output [DATA_WIDTH-1:0] RAM1_out; output [3:0] RAM2_out; output Z_flag, PZ_flag; output Acc_dff; wire JMP_button, Z_JMP_button,PZ_JMP_button; assign JMP_button = RAM1_out[6]; assign Z_JMP_button = RAM1_out[5]; assign PZ_JMP_button = RAM1_out[4]; wire Z_JMP,PZ_JMP; assign Z_JMP = Z_flag & Z_JMP_button; assign PZ_JMP = PZ_flag & PZ_JMP_button; //Counter reg [ADDR_WIDTH-1:0] counter; always @ (posedge timer555 or posedge reset_count) if (reset_count) counter <= 4'b0000; else if (JMP_button|Z_JMP|PZ_JMP) counter <= RAM1_out[3:0]; else counter <= counter + 4'b0001; wire [ADDR_WIDTH-1:0] adr1; assign adr1 = counter; //RAM1 reg [DATA_WIDTH-1:0] mem1 [2**ADDR_WIDTH-1:0]; always @(posedge RAM1_button ) mem1 [adr1] <= data_in; assign RAM1_out = mem1[adr1]; //RAM2_adr wire [ADDR_WIDTH-1:0] adr2; assign adr2 = RAM1_out[2:0]; //RAM2_button wire RAM2_button; assign RAM2_button = RAM1_out[11]; //RAM2 reg [3:0] mem2 [2**ADDR_WIDTH-1:0]; always @(posedge RAM2_button) mem2 [adr2] <= Acc_out; assign RAM2_out = mem2[adr2]; // sum wire [3:0] sum; assign sum = Acc_out + RAM2_out; //subtract wire [3:0] subtract; assign subtract = Acc_out - RAM2_out; // MUX4 wire [1:0] mux_switch; assign mux_switch[0] = RAM1_out[7]; assign mux_switch[1] = RAM1_out[8]; reg [3:0] MUX4; always @* MUX4 = mux_switch[1] ? (mux_switch[0] ? RAM2_out : subtract) : (mux_switch[0] ? sum : data_in[3:0]); assign mux_out = MUX4; assign mux_switch_out[0] = mux_switch[0]; assign mux_switch_out[1] = mux_switch[1]; //Acc_button wire Acc_button; assign Acc_button = RAM1_out[10]; // Acc_dff reg Acc_dff; always @(negedge timer555) Acc_dff <= Acc_button; //Acc register4 Acc_reg( .reg_data(mux_out), //.reg_button(Acc_button & timer555), .reg_button(Acc_dff), .q(Acc_out) ); //data_out wire Output_button; assign Output_button = RAM1_out[9]; register4 Output_reg( .reg_data(Acc_out), .reg_button(Output_button), .q(data_out) ); // flags assign Z_flag = ~(|Acc_out); assign PZ_flag = ~Acc_out[3]; endmodule
Testbench рдореЗрдВ рд╣рдо рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
RAM рдореЗрдВ рд▓реЛрдбрд┐рдВрдЧ рдХрдорд╛рдВрдбреНрд╕ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдХрдорд╛рдВрдб рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ (340ns) рд╕реЗрд▓ 8 рдкрд░ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрдорд╛рдВрдб рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛
module tR52; parameter ADDR_WIDTH = 4; parameter DATA_WIDTH = 12; reg reset_count; reg timer555; reg RAM1_button; reg [DATA_WIDTH-1:0] data_in; wire [ADDR_WIDTH-1:0] counter; wire [1:0]mux_switch_out; wire [3:0] mux_out; wire [3:0] Acc_out; wire [3:0] data_out; wire [DATA_WIDTH-1:0] RAM1_out; wire [3:0] RAM2_out; wire Z_flag, PZ_flag; wire Acc_dff; R52 test_R52(Z_flag, PZ_flag, reset_count, counter, timer555, RAM1_button, data_in, RAM1_out, RAM2_out, mux_switch_out, mux_out,Acc_out, data_out, Acc_dff); initial // Clock generator begin timer555 = 0; forever #20 timer555 = ~timer555; end initial begin data_in[0] = 0; data_in[1] = 0; data_in[2] = 0; data_in[3] = 0; data_in[4] = 0; data_in[5] = 0; data_in[6] = 0; data_in[7] = 0; data_in[8] = 0; data_in[9] = 0; data_in[10] = 1; data_in[11] = 0; RAM1_button = 0; reset_count =1; // 1- #5 RAM1_button = 1; reset_count = 0; #5 RAM1_button = 0; data_in[10] = 0; data_in[0] = 0; // 1- 0 #10 data_in[11] = 1; #5 RAM1_button = 1; #5 data_in[11] = 0; RAM1_button = 0; // 2- #30 data_in[10] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[10] = 0; // 2- 0 #30 data_in[11] = 1;data_in[0] = 1; #5 RAM1_button = 1; #5 data_in[11] = 0;data_in[0] = 0; RAM1_button = 0; // 1- #30 data_in[8]=1; data_in[10] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[8]=0; data_in[10] = 0; // Acc>=0, 8 #30 data_in[4]=1; data_in[3]=1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[4]=0; data_in[3]=0; // 1- #30 data_in[7] = 1; data_in[8] = 1; data_in[10] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[7] = 0; data_in[8] = 0; data_in[10] = 0; // 9 #30 data_in[6] = 1; data_in[3]=1; data_in[0]=1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[6] = 0; data_in[3]=0; data_in[0]=0; // data_out #30 data_in[9] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[9] = 0; // 8 #30 data_in[6] = 1; data_in[3]=1; data_in[0]=0; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[6] = 0; data_in[3]=0; data_in[0]=0; // 2- #30 data_in[7] = 1; data_in[8] = 1; data_in[10] = 1; data_in[0] = 1; #5 RAM1_button = 1; #5 RAM1_button = 0; data_in[7] = 0; data_in[8] = 0; data_in[10] = 0; data_in[0] = 0; #75 RAM1_button = 1; #5 RAM1_button = 0; #230 data_in[2]=1; data_in[0]=0; // #80 data_in[2]=0; data_in[0]=1; // end endmodule
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬреАрдердм рд╕реЗ
рд▓рд┐рдВрдХ рдХрд░реЗрдВ ред
рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП
рдореЙрдбрд▓рд╕рд┐рдо рдХрд╛ рдореБрдлреНрдд рдЫрд╛рддреНрд░ рд╕рдВрд╕реНрдХрд░рдг
www.model.com рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ (рдлрд╝реЙрд░реНрдо рдХреЛ рднрд░рдХрд░) рдЫрд╛рддреНрд░_рдЖрд▓реЗрдВрд╕ .рдбреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореЙрдбрд▓рд╕рд┐рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдВ рд▓рд┐рдирдХреНрд╕ (рдЙрдмрдВрдЯреВ) рдХреЗ рд▓рд┐рдП
рдореЙрдбрд▓рд╕рд┐рдо рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдВрдХ
рдХрд░реЗрдВрдпрд╣рд╛рдВ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд┐рд░реНрджреЗрд╢ред