last changes to adding the PMU
diff --git a/openlane/user_proj_example/config.json b/openlane/user_proj_example/config.json
index c3de8af..c0ac816 100644
--- a/openlane/user_proj_example/config.json
+++ b/openlane/user_proj_example/config.json
@@ -2,20 +2,20 @@
     "PDK"                      : "sky130A",
     "STD_CELL_LIBRARY"         : "sky130_fd_sc_hd",
     "CARAVEL_ROOT"             : "../../caravel",
-    "CLOCK_NET"                : "counter.clk",
+    "CLOCK_NET"                : "main_module.clk",
     "CLOCK_PERIOD"             : "10",
     "CLOCK_PORT"               : "wb_clk_i",
     "DESIGN_IS_CORE"           : "0",
     "DESIGN_NAME"              : "user_proj_example",
-    "DIE_AREA"                 : "0 0 900 600",
+    "DIE_AREA"                 : "0 0 900 900",
     "DIODE_INSERTION_STRATEGY" : "4",
     "FP_PIN_ORDER_CFG"         : "pin_order.cfg",
     "FP_SIZING"                : "absolute",
     "GLB_RT_MAXLAYER"          : "5",
     "GND_NETS"                 : "vssd1",
     "PL_BASIC_PLACEMENT"       : "1",
-    "PL_TARGET_DENSITY"        : "0.05",
+    "PL_TARGET_DENSITY"        : "0.45",
     "RUN_CVC"                  : "1",
     "VDD_NETS"                 : "vccd1",
-    "VERILOG_FILES"            : ["../../caravel/verilog/rtl/defines.v", "../../verilog/rtl/user_proj_example.v"]
+    "VERILOG_FILES"            : ["../../caravel/verilog/rtl/defines.v", "../../verilog/rtl/user_proj_example.v", "../../verilog/rtl/controller/main_module.v", "../../verilog/rtl/controller/control_module.v", "../../verilog/rtl/controller/io_module.v",  "../../verilog/rtl/controller/logic_control.v",  "../../verilog/rtl/controller/status_sender_data.v","../../verilog/rtl/controller/pmu.v",  "../../verilog/rtl/controller/UART_SERVER/uart.v", "../../verilog/rtl/controller/UART_SERVER/uart_rx.v", "../../verilog/rtl/UART_SERVER/uart_tx.v"]
 }
diff --git a/openlane/user_proj_example/config.tcl b/openlane/user_proj_example/config.tcl
index 94af8ba..b835ad6 100755
--- a/openlane/user_proj_example/config.tcl
+++ b/openlane/user_proj_example/config.tcl
@@ -22,21 +22,30 @@
 
 set ::env(VERILOG_FILES) "\
 	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
-	$script_dir/../../verilog/rtl/user_proj_example.v"
+	$script_dir/../../verilog/rtl/user_proj_example.v\
+	$script_dir/../../verilog/rtl/controller/main_module.v\
+	$script_dir/../../verilog/rtl/controller/control_module.v\
+	$script_dir/../../verilog/rtl/controller/io_module.v\
+	$script_dir/../../verilog/rtl/controller/logic_control.v\
+	$script_dir/../../verilog/rtl/controller/status_sender_data.v\
+	$script_dir/../../verilog/rtl/controller/pmu.v\
+	$script_dir/../../verilog/rtl/controller/UART_SERVER/uart.v\
+	$script_dir/../../verilog/rtl/controller/UART_SERVER/uart_rx.v\
+	$script_dir/../../verilog/rtl/controller/UART_SERVER/uart_tx.v"
 
 set ::env(DESIGN_IS_CORE) 0
 
 set ::env(CLOCK_PORT) "wb_clk_i"
-set ::env(CLOCK_NET) "counter.clk"
+set ::env(CLOCK_NET) "main_module.clk"
 set ::env(CLOCK_PERIOD) "10"
 
 set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 900 600"
+set ::env(DIE_AREA) "0 0 900 900"
 
 set ::env(FP_PIN_ORDER_CFG) $script_dir/pin_order.cfg
 
 set ::env(PL_BASIC_PLACEMENT) 1
-set ::env(PL_TARGET_DENSITY) 0.05
+set ::env(PL_TARGET_DENSITY) 0.45
 
 # Maximum layer used for routing is metal 4.
 # This is because this macro will be inserted in a top level (user_project_wrapper) 
diff --git a/verilog/rtl/UART_SERVER/COPYING b/verilog/rtl/controller/UART_SERVER/COPYING
similarity index 100%
rename from verilog/rtl/UART_SERVER/COPYING
rename to verilog/rtl/controller/UART_SERVER/COPYING
diff --git a/verilog/rtl/UART_SERVER/uart.v b/verilog/rtl/controller/UART_SERVER/uart.v
similarity index 100%
rename from verilog/rtl/UART_SERVER/uart.v
rename to verilog/rtl/controller/UART_SERVER/uart.v
diff --git a/verilog/rtl/UART_SERVER/uart_rx.v b/verilog/rtl/controller/UART_SERVER/uart_rx.v
similarity index 100%
rename from verilog/rtl/UART_SERVER/uart_rx.v
rename to verilog/rtl/controller/UART_SERVER/uart_rx.v
diff --git a/verilog/rtl/UART_SERVER/uart_tx.v b/verilog/rtl/controller/UART_SERVER/uart_tx.v
similarity index 100%
rename from verilog/rtl/UART_SERVER/uart_tx.v
rename to verilog/rtl/controller/UART_SERVER/uart_tx.v
diff --git a/verilog/rtl/control_module.v b/verilog/rtl/controller/control_module.v
similarity index 81%
rename from verilog/rtl/control_module.v
rename to verilog/rtl/controller/control_module.v
index ed8723a..67ded59 100644
--- a/verilog/rtl/control_module.v
+++ b/verilog/rtl/controller/control_module.v
@@ -1,4 +1,5 @@
 `timescale 1ns / 1ps
+`default_nettype none
 //////////////////////////////////////////////////////////////////////////////////
 // Company: 
 // Engineer: 
@@ -51,19 +52,19 @@
     
    
     // connection wires
-    (* mark_debug = "true" *) wire busy_io_module;
-    (* mark_debug = "true" *) wire busy_sender_data;
-    (* mark_debug = "true" *) wire [INSTRUCTION_SIZE-1:0] instrucction;
-    (* mark_debug = "true" *) wire [SIZE_WORD_REGISTER-1:0] register;
-    (* mark_debug = "true" *) wire [AUXILIAR_SIZE-1:0] auxiliar_register;
-    (* mark_debug = "true" *) wire valid_instrucction;
-    (* mark_debug = "true" *) wire valid_control_value;
+    wire busy_io_module;
+    wire busy_sender_data;
+    wire [INSTRUCTION_SIZE-1:0] instrucction;
+    wire [SIZE_WORD_REGISTER-1:0] register;
+    wire [AUXILIAR_SIZE-1:0] auxiliar_register;
+    wire valid_instrucction;
+    wire valid_control_value;
     // control value
-    (* mark_debug = "true" *) wire [INPUT_DATA_SIZE-1:0] control_value;
-    (* mark_debug = "true" *) wire [WORD_SIZE-1:0] send_data_register;
-    (* mark_debug = "true" *) wire valid_data;
-    (* mark_debug = "true" *) wire [SIZE_WORD-1:0] size_line;
-    (* mark_debug = "true" *) wire [IO_OUTPUT_SIZE-1:0] result_input_io;
+    wire [INPUT_DATA_SIZE-1:0] control_value;
+    wire [WORD_SIZE-1:0] send_data_register;
+    wire valid_data;
+    wire [SIZE_WORD-1:0] size_line;
+    wire [IO_OUTPUT_SIZE-1:0] result_input_io;
  
     // assigments 
     assign staus_control_module[4] = busy_io_module;
@@ -139,3 +140,4 @@
     );
  
 endmodule
+`default_nettype wire
\ No newline at end of file
diff --git a/verilog/rtl/io_module.v b/verilog/rtl/controller/io_module.v
similarity index 94%
rename from verilog/rtl/io_module.v
rename to verilog/rtl/controller/io_module.v
index c6d9875..95654d6 100644
--- a/verilog/rtl/io_module.v
+++ b/verilog/rtl/controller/io_module.v
@@ -22,7 +22,7 @@
 
 module io_module #
 (
-    parameter SIZE_WORD = 5,
+    parameter SIZE_WORD = 3,
     parameter WORD_SIZE = 32,
     parameter INSTRUCTION_SIZE = 3,
     parameter IO_OUTPUT_SIZE = 8,
@@ -34,9 +34,9 @@
 (
     input clk,
     input rst,
-    (* mark_debug = "true" *)input [INSTRUCTION_SIZE-1:0] instrucction,
-    (* mark_debug = "true" *)input [SIZE_WORD-1:0] register,
-    (* mark_debug = "true" *)input [AUXILIAR_SIZE-1:0] auxiliar_register,
+    input [INSTRUCTION_SIZE-1:0] instrucction,
+    input [SIZE_WORD-1:0] register,
+    input [AUXILIAR_SIZE-1:0] auxiliar_register,
     input valid_instrucction,
     input [INPUTS-1:0] input_io,
     output busy,
@@ -45,14 +45,14 @@
     output [OUTPUTS-1:0] output_io
 );
         reg busy;
-        (* mark_debug = "true" *) reg [IO_OUTPUT_SIZE-1:0] result_input_io;
-        (* mark_debug = "true" *) reg [OUTPUTS-1:0]output_io;
-        (* mark_debug = "true" *) reg valid_io;
-        (* mark_debug = "true" *) reg [AUXILIAR_SIZE-1:0] curent_clock;
-        (* mark_debug = "true" *) reg delay_maintained;
+        reg [IO_OUTPUT_SIZE-1:0] result_input_io;
+        reg [OUTPUTS-1:0]output_io;
+        reg valid_io;
+        reg [AUXILIAR_SIZE-1:0] curent_clock;
+        reg delay_maintained;
 
 
-    always @(posedge clk or posedge rst) begin
+    always @(posedge clk) begin
 
         if (rst) begin
             busy <= 0;
diff --git a/verilog/rtl/logic_control.v b/verilog/rtl/controller/logic_control.v
similarity index 96%
rename from verilog/rtl/logic_control.v
rename to verilog/rtl/controller/logic_control.v
index ea820a0..fe6a5a9 100644
--- a/verilog/rtl/logic_control.v
+++ b/verilog/rtl/controller/logic_control.v
@@ -63,22 +63,22 @@
     reg [WORD_SIZE-1:0] data_4 = {8'h0D, 8'h0A, 8'h20, 8'h31};
 
     // status of the value to send
-    (* mark_debug = "true" *) reg valid_data;
+    reg valid_data;
     // fix size for now
     reg [SIZE_WORD-1:0] size_line = 3'h4; 
 
     // send_data_register
-    (* mark_debug = "true" *) reg [WORD_SIZE-1:0] send_data_register;
+    reg [WORD_SIZE-1:0] send_data_register;
 
     // status of the IO module
-    (* mark_debug = "true" *) reg [1:0]send_petition_to_io;
+    reg [1:0]send_petition_to_io;
     reg valid_instrucction;
     reg [INSTRUCTION_SIZE-1:0] instrucction;
     reg [SIZE_WORD_REGISTER-1:0] register;
     reg [AUXILIAR_SIZE-1:0] auxiliar_register;
     
     
-    always @(posedge clk or posedge rst) begin
+    always @(posedge clk) begin
          if (rst) begin
             size_line <= 3'h4;
             send_data_register <= 0;
diff --git a/verilog/rtl/top_module.v b/verilog/rtl/controller/main_module.v
similarity index 71%
rename from verilog/rtl/top_module.v
rename to verilog/rtl/controller/main_module.v
index 0b3dbac..9f18648 100644
--- a/verilog/rtl/top_module.v
+++ b/verilog/rtl/controller/main_module.v
@@ -1,4 +1,5 @@
 `timescale 1ns / 1ps
+`default_nettype none
 //////////////////////////////////////////////////////////////////////////////////
 // Company: 
 // Engineer: 
@@ -7,38 +8,40 @@
 // Design Name: 
 // Module Name: top_module
 // Project Name: 
-// Target Devices: 
-// Tool Versions: 
-// Description: 
-// 
-// Dependencies: 
-// 
-// Revision:
+// Target Devices: (* mark_debug = "true" *) 
 // Revision 0.01 - File Created
 // Additional Comments:
 // 
 //////////////////////////////////////////////////////////////////////////////////
 
 
-module top_module #
+module main_module #
 (
     parameter WORD_SIZE = 32,
     parameter SIZE_WORD = 3,
     parameter INPUT_DATA_SIZE = 52,
+    parameter integer WHISBONE_ADR = 32,
     parameter STATUS_SIGNALS = 6,
     parameter DATA_WIDTH = 8,
     parameter BAUD_RATE = 115200,
-    parameter CLOCK_SPEED = 125000000,
+    parameter CLOCK_SPEED = 100000000,
     parameter OUTPUTS = 32,
     parameter INPUTS = 32
 )
 (
     input clk,
-    input jc_1,
-    input btn,
-    input [3:0]sw,
-    output [3:0]led,
-    output jc_2
+    input rtx,
+    input rst,
+    input [INPUTS-1:0] input_io_ports,
+    input  wire [3 : 0] wstrb_i,
+    input  wire [WORD_SIZE -1 : 0] wdata_i,
+    input  wire [WHISBONE_ADR - 1 : 0] wbs_adr_i,
+    input  wire valid_i,
+    input  wire wbs_we_i,
+    output wire ready_o,
+    output wire [WORD_SIZE - 1 : 0] rdata_o,
+    output [OUTPUTS-1:0] output_io_ports,
+    output trx
     );
     // prescalar reister fix for now
     reg [15:0] preescalar_data_rate = CLOCK_SPEED/(BAUD_RATE*DATA_WIDTH);
@@ -46,7 +49,7 @@
     // input IO
     wire [OUTPUTS - 1 : 0]input_io;
     // TMP assigment TODO change
-    assign sw = input_io[3:0];
+    assign input_io_ports = input_io;
 
     // TRX triple redundancy
     // uart transtransmision wires
@@ -55,7 +58,7 @@
     wire uart_output_signal_inst_2;
     wire uart_output_signal_inst_3;
     // asignations
-    assign jc_2 = uart_output_signal;
+    assign trx = uart_output_signal;
     // auxiliar wires
     wire nand_1_trx;
     wire nand_2_trx;
@@ -67,10 +70,10 @@
     wire xor_reduce_2_trx;
     wire xor_reduce_3_trx;
     // uart transtransmision wires triple redundant
-    (* mark_debug = "true" *) assign nand_1_trx  = ~(uart_output_signal_inst_1 & uart_output_signal_inst_2);
-    (* mark_debug = "true" *) assign nand_2_trx  = ~(uart_output_signal_inst_2 & uart_output_signal_inst_3);
-    (* mark_debug = "true" *) assign nand_3_trx  = ~(uart_output_signal_inst_1 & uart_output_signal_inst_3);
-    (* mark_debug = "true" *) assign uart_output_signal = ~(nand_1_trx & nand_2_trx & nand_3_trx);
+    assign nand_1_trx  = ~(uart_output_signal_inst_1 & uart_output_signal_inst_2);
+    assign nand_2_trx  = ~(uart_output_signal_inst_2 & uart_output_signal_inst_3);
+    assign nand_3_trx  = ~(uart_output_signal_inst_1 & uart_output_signal_inst_3);
+    assign uart_output_signal = ~(nand_1_trx & nand_2_trx & nand_3_trx);
     // uart transtransmision wires triple redundant detection
     assign xor_1_trx  = uart_output_signal_inst_1 ^ uart_output_signal_inst_2;
     assign xor_2_trx  = uart_output_signal_inst_2 ^ uart_output_signal_inst_3;
@@ -79,7 +82,9 @@
     assign xor_reduce_2_trx = |xor_2_trx;
     assign xor_reduce_3_trx = |xor_3_trx;
     //end TRX
-    
+
+   
+
     // output_io triple redundancy
     wire [OUTPUTS - 1 : 0] output_io_signal;
     wire [OUTPUTS - 1 : 0] output_io_signal_inst_1;
@@ -87,7 +92,7 @@
     wire [OUTPUTS - 1 : 0] output_io_signal_inst_3;
     // asignations
     // TMP assigment TODO change
-    assign led = output_io_signal[3:0];
+    assign output_io_ports = output_io_signal;
     // auxiliar wires
     wire [OUTPUTS - 1 : 0] nand_1_out_io;
     wire [OUTPUTS - 1 : 0] nand_2_out_io;
@@ -100,10 +105,10 @@
     wire xor_reduce_3_out_io;
 
     // Output IO  wires triple redundant
-    (* mark_debug = "true" *) assign nand_1_out_io  = ~(output_io_signal_inst_1 & output_io_signal_inst_2);
-    (* mark_debug = "true" *) assign nand_2_out_io  = ~(output_io_signal_inst_2 & output_io_signal_inst_3);
-    (* mark_debug = "true" *) assign nand_3_out_io  = ~(output_io_signal_inst_1 & output_io_signal_inst_3);
-    (* mark_debug = "true" *) assign output_io_signal = ~(nand_1_out_io & nand_2_out_io & nand_3_out_io);
+    assign nand_1_out_io  = ~(output_io_signal_inst_1 & output_io_signal_inst_2);
+    assign nand_2_out_io  = ~(output_io_signal_inst_2 & output_io_signal_inst_3);
+    assign nand_3_out_io  = ~(output_io_signal_inst_1 & output_io_signal_inst_3);
+    assign output_io_signal = ~(nand_1_out_io & nand_2_out_io & nand_3_out_io);
     // Output IO wires triple redundant detection
     assign xor_1_out_io  = output_io_signal_inst_1 ^ output_io_signal_inst_2;
     assign xor_2_out_io  = output_io_signal_inst_2 ^ output_io_signal_inst_3;
@@ -113,12 +118,6 @@
     assign xor_reduce_3_out_io = |xor_3_out_io;
     // end output_io
     
-
-
-    //redundat_validation_o[0] <= (xor_reduce_1 ^ xor_reduce_2) | (xor_reduce_2 ^ xor_reduce_3);
-    //redundat_validation_o[1] <= xor_reduce_1 & xor_reduce_2 & xor_reduce_3 ;
-    //store_data_o <= ~(nand_1 & nand_2 & nand_3)};
-
     control_module #(
         .WORD_SIZE(WORD_SIZE),
         .SIZE_WORD(SIZE_WORD),
@@ -130,8 +129,8 @@
     )
     control_module_inst_1(
         .clk(clk),
-        .rtx(jc_1),
-        .rst(btn),
+        .rtx(rtx),
+        .rst(rst),
         .preescalar_data_rate(preescalar_data_rate),
         .input_io(input_io),
         .staus_control_module(),
@@ -151,8 +150,8 @@
     )
     control_module_inst_2(
         .clk(clk),
-        .rtx(jc_1),
-        .rst(btn),
+        .rtx(rtx),
+        .rst(rst),
         .preescalar_data_rate(preescalar_data_rate),
         .input_io(input_io),
         .staus_control_module(),
@@ -172,8 +171,8 @@
     )
     control_module_inst_3(
         .clk(clk),
-        .rtx(jc_1),
-        .rst(btn),
+        .rtx(rtx),
+        .rst(rst),
         .preescalar_data_rate(preescalar_data_rate),
         .input_io(input_io),
         .staus_control_module(),
@@ -182,4 +181,22 @@
         .output_io(output_io_signal_inst_3)
     );
 
+    PMU#(
+        .WORD_SIZE(WORD_SIZE),
+        .OUTPUTS(OUTPUTS),
+        .INPUTS(INPUTS)
+    )
+    PMU_inst_1(
+        .clk(clk),
+        .rst(rst),
+        .wstrb_i(wstrb_i),
+        .wdata_i(wdata_i),
+        .wbs_adr_i(wbs_adr_i),
+        .valid_i(valid_i),
+        .wbs_we_i(wbs_we_i),
+        .ready_o(ready_o),
+        .rdata_o(rdata_o)
+    );
+
 endmodule
+`default_nettype wire
\ No newline at end of file
diff --git a/verilog/rtl/controller/pmu.v b/verilog/rtl/controller/pmu.v
new file mode 100644
index 0000000..47060b1
--- /dev/null
+++ b/verilog/rtl/controller/pmu.v
@@ -0,0 +1,56 @@
+`timescale 1ns / 1ps
+`default_nettype none
+
+
+module PMU#
+(
+    parameter WORD_SIZE = 32,
+    parameter OUTPUTS = 32,
+    parameter integer WHISBONE_ADR = 32,
+    parameter INPUTS = 32,
+    parameter integer COUNTERSIZE = 32,
+    parameter [19:0]  ADDRBASE     = 20'h3000_0
+
+)
+(
+    input  wire clk,
+    input  wire rst,
+    input  wire [3 : 0] wstrb_i,
+    input  wire [WORD_SIZE -1 : 0] wdata_i,
+    input  wire [WHISBONE_ADR - 1 : 0] wbs_adr_i,
+    input  wire valid_i,
+    input  wire wbs_we_i,
+    output reg ready_o,
+    output reg [WORD_SIZE - 1 : 0] rdata_o
+
+
+);
+
+reg [COUNTERSIZE-1:0] total_clk_pass;
+
+always @(posedge clk) begin
+    if(rst) begin
+        total_clk_pass    <= {WORD_SIZE {1'b0}};
+    end
+    else begin
+        total_clk_pass <= total_clk_pass + 1;
+        if (valid_i && wbs_adr_i[31:12] == ADDRBASE) begin
+            ready_o <= 1'b1;
+            if (wbs_we_i) begin
+                if (wstrb_i[0]) total_clk_pass[7:0]   <= wdata_i[7:0];
+                if (wstrb_i[1]) total_clk_pass[15:8]  <= wdata_i[15:8];
+                if (wstrb_i[2]) total_clk_pass[23:16] <= wdata_i[23:16];
+                if (wstrb_i[3]) total_clk_pass[31:24] <= wdata_i[31:24];
+            end
+            else begin
+                rdata_o <= {total_clk_pass};
+            end
+        end
+        else begin
+            ready_o <= 1'b0;
+        end
+    end
+end
+
+endmodule
+`default_nettype wire
\ No newline at end of file
diff --git a/verilog/rtl/status_sender_data.v b/verilog/rtl/controller/status_sender_data.v
similarity index 91%
rename from verilog/rtl/status_sender_data.v
rename to verilog/rtl/controller/status_sender_data.v
index adaed8a..b71b62f 100644
--- a/verilog/rtl/status_sender_data.v
+++ b/verilog/rtl/controller/status_sender_data.v
@@ -52,21 +52,21 @@
     //reg [15:0] preescalar_data_rate = CLOCK_SPEED/(BAUD_RATE*DATA_WIDTH);
 
     // create register for the input and output of the data
-    (* mark_debug = "true" *) reg [DATA_WIDTH-1:0] uart_tx_axis_tdata;
-    (* mark_debug = "true" *) reg uart_tx_axis_tvalid;
-    (* mark_debug = "true" *) wire uart_tx_axis_tready;
+    reg [DATA_WIDTH-1:0] uart_tx_axis_tdata;
+    reg uart_tx_axis_tvalid;
+    wire uart_tx_axis_tready;
 
-    //(* mark_debug = "true" *) 
-    (* mark_debug = "true" *) wire [DATA_WIDTH-1:0] uart_rx_axis_tdata;
-    (* mark_debug = "true" *) wire uart_rx_axis_tvalid;
-    (* mark_debug = "true" *) reg uart_rx_axis_tready;
+    //
+    wire [DATA_WIDTH-1:0] uart_rx_axis_tdata;
+    wire uart_rx_axis_tvalid;
+    reg uart_rx_axis_tready;
 
     // create the register for control to remember last value send
-    (* mark_debug = "true" *) reg [INPUT_DATA_SIZE-1:0] output_value;
+    reg [INPUT_DATA_SIZE-1:0] output_value;
     // create the register for store the data to be send
     reg [WORD_SIZE-1:0] send_data_register;
     // register to now if is sending data
-    (* mark_debug = "true" *) reg sending_data;
+    reg sending_data;
     // regsiter to store the actual size
     reg [SIZE_WORD-1:0] data_size_actual;
 
@@ -99,7 +99,7 @@
     );
 
 
-    always @(posedge clk or posedge rst) begin
+    always @(posedge clk) begin
         if (rst) begin
             uart_tx_axis_tdata <= 0;
             uart_rx_axis_tready <= 0;
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index 3537de8..1065d78 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -25,4 +25,13 @@
 `else
     `include "user_project_wrapper.v"
     `include "user_proj_example.v"
+    `include "controller/top_module.v"
+    `include "controller/status_sender_data.v"
+    `include "controller/logic_control.v"
+    `include "controller/control_module.v"
+    `include "controller/io_module.v"
+    `include "controller/UART_SERVER/uart.v"
+    `include "controller/UART_SERVER/uart_rx.v"
+    `include "controller/UART_SERVER/uart_tx.v"
+    `include "controller/pmu.v"
 `endif
\ No newline at end of file
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index 26081e9..671ff2b 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -36,7 +36,15 @@
  */
 
 module user_proj_example #(
-    parameter BITS = 32
+        parameter WORD_SIZE = 32,
+        parameter SIZE_WORD = 3,
+        parameter INPUT_DATA_SIZE = 52,
+        parameter STATUS_SIGNALS = 6,
+        parameter DATA_WIDTH = 8,
+        parameter BAUD_RATE = 115200,
+        parameter CLOCK_SPEED = 100000000,
+        parameter OUTPUTS = 32,
+        parameter INPUTS = 32
 )(
 `ifdef USE_POWER_PINS
     inout vccd1,	// User area 1 1.8V supply
@@ -70,14 +78,15 @@
 );
     wire clk;
     wire rst;
-
+    wire [15:0] io_port;
+    wire rtx;
+    wire trx;
     wire [`MPRJ_IO_PADS-1:0] io_in;
     wire [`MPRJ_IO_PADS-1:0] io_out;
     wire [`MPRJ_IO_PADS-1:0] io_oeb;
 
     wire [31:0] rdata; 
     wire [31:0] wdata;
-    wire [BITS-1:0] count;
 
     wire valid;
     wire [3:0] wstrb;
@@ -90,76 +99,48 @@
     assign wdata = wbs_dat_i;
 
     // IO
-    assign io_out = count;
+    assign io_out = {io_port,rtx,trx,20'b0};
     assign io_oeb = {(`MPRJ_IO_PADS-1){rst}};
 
     // IRQ
-    assign irq = 3'b000;	// Unused
+    //assign irq = 3'b000;	// Unused
 
     // LA
-    assign la_data_out = {{(127-BITS){1'b0}}, count};
+    //assign la_data_out = {{(127-BITS){1'b0}}, count};
     // Assuming LA probes [63:32] are for controlling the count register  
-    assign la_write = ~la_oenb[63:32] & ~{BITS{valid}};
+    //assign la_write = ~la_oenb[63:32] & ~{BITS{valid}};
     // Assuming LA probes [65:64] are for controlling the count clk & reset  
-    assign clk = (~la_oenb[64]) ? la_data_in[64]: wb_clk_i;
-    assign rst = (~la_oenb[65]) ? la_data_in[65]: wb_rst_i;
+    assign clk = wb_clk_i;
+    assign rst = wb_rst_i;
+    //assign clk = (~la_oenb[64]) ? la_data_in[64]: wb_clk_i;
+    //assign rst = (~la_oenb[65]) ? la_data_in[65]: wb_rst_i;
 
-    counter #(
-        .BITS(BITS)
-    ) counter(
-        .clk(clk),
-        .reset(rst),
-        .ready(wbs_ack_o),
-        .valid(valid),
-        .rdata(rdata),
-        .wdata(wbs_dat_i),
-        .wstrb(wstrb),
-        .la_write(la_write),
-        .la_input(la_data_in[63:32]),
-        .count(count)
-    );
-
-endmodule
-
-module counter #(
-    parameter BITS = 32
-)(
-    input clk,
-    input reset,
-    input valid,
-    input [3:0] wstrb,
-    input [BITS-1:0] wdata,
-    input [BITS-1:0] la_write,
-    input [BITS-1:0] la_input,
-    output ready,
-    output [BITS-1:0] rdata,
-    output [BITS-1:0] count
-);
-    reg ready;
-    reg [BITS-1:0] count;
-    reg [BITS-1:0] rdata;
-
-    always @(posedge clk) begin
-        if (reset) begin
-            count <= 0;
-            ready <= 0;
-        end else begin
-            ready <= 1'b0;
-            if (~|la_write) begin
-                count <= count + 1;
-            end
-            if (valid && !ready) begin
-                ready <= 1'b1;
-                rdata <= count;
-                if (wstrb[0]) count[7:0]   <= wdata[7:0];
-                if (wstrb[1]) count[15:8]  <= wdata[15:8];
-                if (wstrb[2]) count[23:16] <= wdata[23:16];
-                if (wstrb[3]) count[31:24] <= wdata[31:24];
-            end else if (|la_write) begin
-                count <= la_write & la_input;
-            end
-        end
-    end
+   main_module #(
+        .WORD_SIZE (WORD_SIZE),
+        .SIZE_WORD (SIZE_WORD),
+        .INPUT_DATA_SIZE (INPUT_DATA_SIZE),
+        .STATUS_SIGNALS (STATUS_SIGNALS),
+        .DATA_WIDTH (DATA_WIDTH),
+        .BAUD_RATE (BAUD_RATE),
+        .CLOCK_SPEED (CLOCK_SPEED),
+        .OUTPUTS (OUTPUTS),
+        .INPUTS (INPUTS)
+   )
+   main_module(
+       .clk(clk),
+       .rtx(rtx),
+       .rst(rst),
+       .input_io_ports({la_data_in[15:0],io_port}),
+       .output_io_ports({la_data_out[15:0],io_port}),
+       .trx(trx),
+       .wstrb_i(wstrb),
+       .wdata_i(wdata),
+       .wbs_adr_i(wbs_adr_i),
+       .valid_i(valid),
+       .wbs_we_i(wbs_we_i),
+       .ready_o(wbs_ack_o),
+       .rdata_o(rdata)
+   );
 
 endmodule
 `default_nettype wire