diff --git a/main_cttrl.vhd b/main_cttrl.vhd
index 8864af6d2eb503cbff53331b0bec58788e1fdc36..c5e6a953465cdbf44564388cd34de0b485c602ae 100644
--- a/main_cttrl.vhd
+++ b/main_cttrl.vhd
@@ -24,8 +24,8 @@ use ieee.numeric_std.all;
 
 entity main_processor is
 	port(
-		clk :										in 				std_logic;
-		reset :									in 				std_logic
+		clk :	in 	std_logic;
+		reset :	in 	std_logic
 	);
 end main_processor;
 
@@ -33,32 +33,32 @@ architecture arc_main_processor of main_processor is
 
 	component add_pc is
 		port(
-			in_a :			in 		std_logic_vector(31 downto 0);
-			out_a :			out		std_logic_vector(31 downto 0)
+			in_a :	in 	std_logic_vector(31 downto 0);
+			out_a :	out	std_logic_vector(31 downto 0)
 		);
 	end component;
 
 	component add is
 		port(
-			in_a :			in 		std_logic_vector(31 downto 0);
-			in_b :			in			std_logic_vector(31 downto 0);
-			out_a :			out 		std_logic_vector(31 downto 0)
+			in_a :	in 	std_logic_vector(31 downto 0);
+			in_b :	in	std_logic_vector(31 downto 0);
+			out_a :	out	std_logic_vector(31 downto 0)
 		);
 	end component;
 	
 	component and_1 is
 		port(
-			branch :		 	in  		std_logic;
-			in_a :			in			std_logic;
-			out_a  :			out		std_logic
+			branch :	in 	std_logic;
+			in_a :		in	std_logic;
+			out_a  :	out	std_logic
 		);
 	end component;	
 
 	component concat is
 		port(
-			in_a :			in 		std_logic_vector(31 downto 0);
-			in_b :			in			std_logic_vector(31 downto 0);
-			out_a :			out 		std_logic_vector(31 downto 0)
+			in_a :	in 	std_logic_vector(31 downto 0);
+			in_b :	in	std_logic_vector(31 downto 0);
+			out_a :	out	std_logic_vector(31 downto 0)
 		);
 	end component;
 
@@ -72,69 +72,69 @@ architecture arc_main_processor of main_processor is
 	
 	component ctrl is
 		port(
-			opcode : 		in			std_logic_vector(5 downto 0);
-			regdst :			out		std_logic;
-			jump :			out		std_logic;
-			branch :			out		std_logic;
-			memread :		out		std_logic;
-			memtoreg :		out		std_logic;
-			aluop :			out		std_logic_vector(1 downto 0);
-			memwrite :		out		std_logic;
-			alusrc :			out		std_logic;
-			regwrite :		out		std_logic
+			opcode : 	in	std_logic_vector(5 downto 0);
+			regdst :	out	std_logic;
+			jump :		out	std_logic;
+			branch :	out	std_logic;
+			memread :	out	std_logic;
+			memtoreg :	out	std_logic;
+			aluop :		out	std_logic_vector(1 downto 0);
+			memwrite :	out	std_logic;
+			alusrc :	out	std_logic;
+			regwrite :	out	std_logic
 		);
 	end component;
 	
 	component extend_signal is
 		port(
-			in_a :			in			std_logic_vector (15 downto 0);
-			out_a : 			out  		std_logic_vector (31 downto 0)
+			in_a :	in	std_logic_vector (15 downto 0);
+			out_a :	out	std_logic_vector (31 downto 0)
 		);
 	end component;
 	
 	component inst is
 		port(
-			in_a :			in 		std_logic_vector(31 downto 0);
-			out_a :			out		std_logic_vector(31 downto 0)
+			in_a :	in 	std_logic_vector(31 downto 0);
+			out_a :	out	std_logic_vector(31 downto 0)
 		);
 	end component;
 	
 	component mem is
 		port(
-			clk :				in 		std_logic;
-			reset :			in 		std_logic;
-			memwrite :		in 		std_logic;
-			memread :		in 		std_logic;
-			in_a :			in 		std_logic_vector(31 downto 0); 
-			in_b :			in 		std_logic_vector(31 downto 0);
-			out_a :			out 		std_logic_vector(31 downto 0)
+			clk :		in std_logic;
+			reset :		in std_logic;
+			memwrite :	in std_logic;
+			memread :	in std_logic;
+			in_a :		in std_logic_vector(31 downto 0); 
+			in_b :		in std_logic_vector(31 downto 0);
+			out_a :		out	std_logic_vector(31 downto 0)
 		);
 	end component;
 	
 	component mx_1 is
 		port(
-			regdst :			in			std_logic;	
-			in_a :			in 		std_logic_vector(4 downto 0);
-			in_b :			in			std_logic_vector(4 downto 0);
-			out_a :			out 		std_logic_vector(4 downto 0)
+			regdst :	in	std_logic;	
+			in_a :		in 	std_logic_vector(4 downto 0);
+			in_b :		in	std_logic_vector(4 downto 0);
+			out_a :		out	std_logic_vector(4 downto 0)
 		);
 	end component;
 	
 	component mx_2 is
 		port(
-			alusrc :			in			std_logic;
-			in_a :			in 		std_logic_vector(31 downto 0);
-			in_b : 			in  		std_logic_vector(31 downto 0);
-			out_a :			out		std_logic_vector(31 downto 0)			
+			alusrc :	in	std_logic;
+			in_a :		in 	std_logic_vector(31 downto 0);
+			in_b : 		in 	std_logic_vector(31 downto 0);
+			out_a :		out	std_logic_vector(31 downto 0)			
 		);
 	end component;
 	
 	component mx_3 is
 		port(
-			in_a :			in 		std_logic_vector(31 downto 0);
-			in_b :			in 		std_logic_vector(31 downto 0);
-			in_c :			in 		std_logic;
-			out_a :			out 		std_logic_vector(31 downto 0)
+			in_a :	in std_logic_vector(31 downto 0);
+			in_b :	in std_logic_vector(31 downto 0);
+			in_c :	in std_logic;
+			out_a :	out	std_logic_vector(31 downto 0)
 		);
 	end component;
 	
@@ -178,6 +178,24 @@ architecture arc_main_processor of main_processor is
 			out_b :			out 		std_logic_vector(31 downto 0)
 		);
 	end component;
+
+    component reg128 is
+        port(
+            clk:    in std_logic;
+            rst:  in std_logic;
+            inp:    in std_logic_vector(127 downto 0);
+            outp:   out std_logic_vector(127 downto 0)
+        );
+    end component; 
+
+    component reg64 is
+        port(
+            clk:    in std_logic;
+            rst:  in std_logic;
+            inp:    in std_logic_vector(63 downto 0);
+            outp:   out std_logic_vector(63 downto 0)
+        );
+    end component;
 	
 	component sl_1 is
 		port(
@@ -225,7 +243,7 @@ architecture arc_main_processor of main_processor is
 	
 	--ctrl
 	signal s_ctrl_regdst :			std_logic;	
-	signal s_ctrl_jump :				std_logic;	
+	signal s_ctrl_jump :			std_logic;	
 	signal s_ctrl_branch :			std_logic;
 	signal s_ctrl_memread :			std_logic;
 	signal s_ctrl_memtoreg :		std_logic;
@@ -233,6 +251,9 @@ architecture arc_main_processor of main_processor is
 	signal s_ctrl_memwrite :		std_logic;
 	signal s_ctrl_alusrc :			std_logic;
 	signal s_ctrl_regwrite :		std_logic;
+
+    -- cmp
+	signal s_cmp_zero :  			std_logic;
 	
 	--inst
 	signal s_inst_out_a :			std_logic_vector(31 downto 0);
@@ -265,6 +286,16 @@ architecture arc_main_processor of main_processor is
 	signal s_reg_out_a :		 		std_logic_vector(31 downto 0);
 	signal s_reg_out_b :				std_logic_vector(31 downto 0);
 	
+    -- pipeline registers
+    signal s_if_id_in  :            std_logic_vector(63 downto 0);
+    signal s_if_id_out :            std_logic_vector(63 downto 0);
+    signal s_id_ex_in  :            std_logic_vector(127 downto 0);
+    signal s_id_ex_out :            std_logic_vector(127 downto 0);
+    signal s_ex_mm_in  :            std_logic_vector(127 downto 0);
+    signal s_ex_mm_out :            std_logic_vector(127 downto 0);
+    signal s_mm_wb_in  :            std_logic_vector(127 downto 0);
+    signal s_mm_wb_out :            std_logic_vector(127 downto 0);
+
 	--sl_1
 	signal s_sl_1_out_a	  :		std_logic_vector (31 downto 0);
 	
@@ -276,8 +307,7 @@ architecture arc_main_processor of main_processor is
 	
 	--ula
 	signal s_ula_out_a :				std_logic_vector (31 downto 0);
-	signal s_ula_zero :  			std_logic;
-	
+
 	--demais sinais
 	signal s_geral_opcode :			std_logic_vector(5 downto 0);
 	signal s_geral_rs : 				std_logic_vector(4 downto 0);	
@@ -289,35 +319,65 @@ architecture arc_main_processor of main_processor is
 	signal s_geral_pc_4 :			std_logic_vector(31 downto 0);
 
 begin
-	s_geral_opcode 	<= s_inst_out_a(31 downto 26);
-	s_geral_rs 			<= s_inst_out_a(25 downto 21);
-	s_geral_rt			<= s_inst_out_a(20 downto 16);
-	s_geral_rd 			<= s_inst_out_a(15 downto 11);
-	s_geral_i_type 	<= s_inst_out_a(15 downto 0);
-	s_geral_funct		<= s_inst_out_a(5 downto 0);
-	s_geral_jump		<= s_inst_out_a(31 downto 0);
-	s_geral_pc_4		<= s_add_pc_out_a(31 downto 0);
 
 	c_pc :					pc port map(clk, reset, s_mx_4_out_a, s_pc_out_a);
 	c_add_pc :				add_pc port map(s_pc_out_a, s_add_pc_out_a);
-	c_inst :					inst port map(s_pc_out_a, s_inst_out_a);
-	c_sl_1 :					sl_1 port map(s_geral_jump, s_sl_1_out_a);
-	c_ctrl :					ctrl port map(s_geral_opcode, s_ctrl_regdst, s_ctrl_jump, s_ctrl_branch, s_ctrl_memread, s_ctrl_memtoreg, s_ctrl_aluop, s_ctrl_memwrite, s_ctrl_alusrc, s_ctrl_regwrite);
+	c_inst :				inst port map(s_pc_out_a, s_inst_out_a);
+    
+    -- IF/ID
+    s_if_id_in          <=  s_add_pc_out_a(31 downto 0) & s_inst_out_a(31 downto 0);
+    c_if_id   :             reg64 port map(clk, reset, s_if_id_in, s_if_id_out);
+    -- s_add_pc_out é a parte mais significativa do registrador
+	s_geral_pc_4		<= s_if_id_out(63 downto 32);
+    -- s_inst_out_a é a menos significativa deste registrador
+	s_geral_opcode 	    <= s_if_id_out(31 downto 26);
+	s_geral_rs 			<= s_if_id_out(25 downto 21);
+	s_geral_rt			<= s_if_id_out(20 downto 16);
+	s_geral_rd 			<= s_if_id_out(15 downto 11);
+	s_geral_i_type 	    <= s_if_id_out(15 downto 0);
+	s_geral_funct		<= s_if_id_out(5 downto 0);
+	s_geral_jump		<= s_if_id_out(31 downto 0);
+
+	c_sl_1 :				sl_1 port map(s_geral_jump, s_sl_1_out_a);
+	c_ctrl :				ctrl port map(s_geral_opcode, s_ctrl_regdst, s_ctrl_jump, s_ctrl_branch, s_ctrl_memread, s_ctrl_memtoreg, s_ctrl_aluop,
+                                s_ctrl_memwrite, s_ctrl_alusrc, s_ctrl_regwrite);
 	c_concat :				concat port map(s_sl_1_out_a, s_geral_pc_4, s_concat_out_a);
-	c_mx_1 :					mx_1 port map(s_ctrl_regdst, s_geral_rt, s_geral_rd, s_mx_1_out_a);
-	c_sl_2 :					sl_2 port map(s_extend_signal_out_a, s_sl_2_out_a);
-	c_reg :					reg port map(clk, reset, s_ctrl_regwrite, s_geral_rs, s_geral_rt, s_mx_1_out_a, s_mx_5_out_a, s_reg_out_a, s_reg_out_b);
+	c_sl_2 :				sl_2 port map(s_extend_signal_out_a, s_sl_2_out_a);
+	c_reg :					reg port map(clk, reset, s_mm_wb_out(70), s_geral_rs, s_geral_rt, s_mm_wb_out(4 downto 0), s_mx_5_out_a, s_reg_out_a,
+                                s_reg_out_b);
 	c_extend_signal :		extend_signal port map(s_geral_i_type, s_extend_signal_out_a);
-	c_add :					add port map(s_add_pc_out_a, s_sl_2_out_a, s_add_out_a);
-    c_cmp:                  compare port map (s_reg_out_a, s_reg_out_b, s_ula_zero);
-	c_ula :					ula port map(s_reg_out_a, s_mx_2_out_a, s_ula_ctrl_out_a, s_ula_out_a, open);
-	c_mx_2 :					mx_2 port map(s_ctrl_alusrc, s_reg_out_b, s_extend_signal_out_a, s_mx_2_out_a);
+	c_add :					add port map(s_geral_pc_4, s_sl_2_out_a, s_add_out_a);
+    c_cmp:                  compare port map (s_reg_out_a, s_reg_out_b, s_cmp_zero);
+	c_mx_2 :				mx_2 port map(s_ctrl_alusrc, s_reg_out_b, s_extend_signal_out_a, s_mx_2_out_a);
 	c_ula_ctrl :			ula_ctrl port map(s_ctrl_aluop, s_geral_funct, s_ula_ctrl_out_a);
-	c_mx_3 :					mx_3 port map(s_add_pc_out_a, s_add_out_a, s_and_1_out_a, s_mx_3_out_a);
-	c_and_1 :				and_1 port map(s_ctrl_branch, s_ula_zero, s_and_1_out_a);
-	c_mem :					mem port map(clk, reset, s_ctrl_memwrite, s_ctrl_memread, s_ula_out_a, s_reg_out_b, s_mem_out_a);
-	c_mx_4 :					mx_4 port map(s_ctrl_jump, s_concat_out_a, s_mx_3_out_a, s_mx_4_out_a);
-	c_mx_5 :					mx_5 port map(s_ctrl_memtoreg, s_mem_out_a, s_ula_out_a, s_mx_5_out_a);
+	c_mx_3 :				mx_3 port map(s_geral_pc_4, s_add_out_a, s_and_1_out_a, s_mx_3_out_a);
+	c_and_1 :				and_1 port map(s_ctrl_branch, s_cmp_zero, s_and_1_out_a);
+	c_mx_4 :				mx_4 port map(s_ctrl_jump, s_concat_out_a, s_mx_3_out_a, s_mx_4_out_a);
+
+    -- ID/EX                41 zeros to put the input in the least sign & control & reg_out_a & reg_out_b & inp_alu_b & rs & rt & rd & alu_control
+    --                      |127    119 |       118       |       117       |       116       |      115       |      114      | 113      82
+    s_id_ex_in          <=  x"00" & '0' & s_ctrl_regwrite & s_ctrl_memtoreg & s_ctrl_memwrite & s_ctrl_memread & s_ctrl_regdst & s_reg_out_a
+                            --  | 81       50 | 49        18 | 17      13 | 12       8 | 7        3 | 2              0|
+                                & s_reg_out_b & s_mx_2_out_a & s_geral_rs & s_geral_rt & s_geral_rd & s_ula_ctrl_out_a;
+    c_id_ex :               reg128 port map(clk, reset, s_id_ex_in, s_id_ex_out);
+
+	c_ula :					ula port map(s_id_ex_out(113 downto 82), s_id_ex_out(49 downto 18), s_id_ex_out(2 downto 0), s_ula_out_a, open);
+	c_mx_1 :				mx_1 port map(s_id_ex_out(114), s_id_ex_out(12 downto 8), s_id_ex_out(7 downto 3), s_mx_1_out_a);
+
+    -- EX/MM                56 zeros & control & alu_out & inp_alu_b & reg_dst
+    --                      |127                 73 | 72                       69 | 68       37 | 36                      5 | 4          0|
+    s_ex_mm_in          <=  x"0000000000000"& "000" & s_id_ex_out(118 downto 115) & s_ula_out_a & s_id_ex_out(81 downto 50) & s_mx_1_out_a;
+    c_ex_mm :               reg128 port map(clk, reset, s_ex_mm_in, s_ex_mm_out);
+
+	c_mem :					mem port map(clk, reset, s_ex_mm_out(70), s_ex_mm_out(69), s_ex_mm_out(68 downto 37), s_ex_mm_out(36 downto 5),
+                                s_mem_out_a);
+
+    -- MM/WB
+    --                      |127                 71 | 70                     69 | 68       37 | 36                      5 | 4                     0|
+    s_mm_wb_in          <=  x"00000000000000" & '0' & s_ex_mm_out(72 downto 71) & s_mem_out_a & s_ex_mm_out(68 downto 37) & s_ex_mm_out(4 downto 0);
+    c_mm_wb :               reg128 port map(clk, reset, s_mm_wb_in, s_mm_wb_out);
+
+	c_mx_5 :				mx_5 port map(s_mm_wb_out(69), s_mm_wb_out(68 downto 37), s_mm_wb_out(36 downto 5), s_mx_5_out_a);
 	
 end arc_main_processor;
 
diff --git a/reg128.vhd b/reg128.vhd
index 04e7c25bd3ec061b9dc466d6b4665ffbd37a0dc5..eb8f5b383eeb908a82288d9daafe47356f2f8f7a 100644
--- a/reg128.vhd
+++ b/reg128.vhd
@@ -1,17 +1,17 @@
-library ieee;                                                                       
-use ieee.std_logic_1164.all;                                                        
+library ieee;
+use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
-entity reg64 is
+entity reg128 is
     port(
         clk:    in std_logic;
         rst:  in std_logic;
         inp:    in std_logic_vector(127 downto 0);
         outp:   out std_logic_vector(127 downto 0)
     );
-end reg64;
+end reg128;
 
-architecture arc_reg64 of reg64 is
+architecture arc_reg128 of reg128 is
 begin
     process(clk, rst)
         begin
@@ -21,4 +21,4 @@ begin
                 outp <= inp;
             end if;
     end process;
-end architecture arc_reg64;
+end architecture arc_reg128;
diff --git a/reg64.vhd b/reg64.vhd
index a8602ff3f0ada64ad987cedd84311eec75732617..d0a19200404c03638641121569afdb1721f316a4 100644
--- a/reg64.vhd
+++ b/reg64.vhd
@@ -1,5 +1,5 @@
-library ieee;                                                                       
-use ieee.std_logic_1164.all;                                                        
+library ieee;
+use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
 entity reg64 is
@@ -16,7 +16,7 @@ begin
     process(clk, rst)
         begin
             if rst =  '1' then
-                outp <= x"0000000000000000";
+                outp <= x"0040000000000000";
             elsif clk'event and clk = '1' then
                 outp <= inp;
             end if;
diff --git a/tb_main_processor.vhd b/tb_main_processor.vhd
index 16e7832f87d36e9710792ef13d3b33a833efefd0..2df87700522540a20fcb084bca972e143de42917 100644
--- a/tb_main_processor.vhd
+++ b/tb_main_processor.vhd
@@ -52,7 +52,7 @@ architecture behavior of tb_main_processor is
    signal reset : std_logic := '0';
 
    -- clock period definitions
-   constant clk_period : time := 10 ns;
+   constant clk_period : time := 5 ns;
  
 begin
  
@@ -76,7 +76,7 @@ begin
    stim_proc: process
    begin		
 		reset <= '1';
-      wait for 10 ns;
+      wait for 5 ns;
 		reset <= '0';
 		wait;
    end process;