add usb2uart to user_proj_example
diff --git a/README.md b/README.md
index f251249..4dc1b9b 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # MPW shuttle (WIP)
-## USB2TTL
+## USB2UART
 
 ```sh
 mkdir -p dependencies
@@ -9,10 +9,10 @@
 make setup
 
 make user_proj_example
-klayout -l dependencies/pdks/gf180mcuC/libs.tech/klayout/tech/gf180mcu.lyp gds/user_proj_example.gds
+klayout -l dependencies/pdks/sky130A/libs.tech/klayout/tech/sky130A.lyp gds/user_proj_example.gds
 
 make user_project_wrapper
-klayout -l dependencies/pdks/gf180mcuC/libs.tech/klayout/tech/gf180mcu.lyp gds/user_project_wrapper.gds
+klayout -l dependencies/pdks/sky130A/libs.tech/klayout/tech/sky130A.lyp gds/user_project_wrapper.gds
 
 make verify
 #make extract-parasitics
diff --git a/openlane/user_proj_example/config.json b/openlane/user_proj_example/config.json
index 370d74c..9f05696 100644
--- a/openlane/user_proj_example/config.json
+++ b/openlane/user_proj_example/config.json
@@ -1,10 +1,27 @@
 {
     "DESIGN_NAME": "user_proj_example",
     "DESIGN_IS_CORE": 0,
-    "VERILOG_FILES": ["dir::../../verilog/rtl/defines.v", "dir::../../verilog/rtl/user_proj_example.v"],
+    "VERILOG_FILES": [
+        "dir::../../verilog/rtl/defines.v",
+        "dir::../../verilog/rtl/user_proj_example.v",
+        "dir::../../verilog/rtl/usb2uart.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/phy_tx.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/phy_rx.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/sie.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/ctrl_endp.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/in_fifo.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/out_fifo.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/bulk_endp.v",
+        "dir::../../verilog/rtl/usb_cdc/usb_cdc/usb_cdc.v",
+        "dir::../../verilog/rtl/usb_cdc/examples/common/hdl/prescaler.v",
+        "dir::../../verilog/rtl/usb_cdc/examples/common/hdl/fifo_if.v",
+        "dir::../../verilog/rtl/verilog-uart/rtl/uart_rx.v",
+        "dir::../../verilog/rtl/verilog-uart/rtl/uart_tx.v",
+        "dir::../../verilog/rtl/verilog-uart/rtl/uart.v"
+    ],
     "CLOCK_PERIOD": 10,
-    "CLOCK_PORT": "wb_clk_i",
-    "CLOCK_NET": "counter.clk",
+    "CLOCK_PORT": "wb_clk_i,user_clock2",
+    "CLOCK_NET": "counter.clk,uart2ttl.clk48",
     "FP_SIZING": "absolute",
     "DIE_AREA": "0 0 900 600",
     "FP_PIN_ORDER_CFG": "dir::pin_order.cfg",
diff --git a/openlane/user_proj_example/pin_order.cfg b/openlane/user_proj_example/pin_order.cfg
index 2fda806..35255bf 100644
--- a/openlane/user_proj_example/pin_order.cfg
+++ b/openlane/user_proj_example/pin_order.cfg
@@ -4,6 +4,7 @@
 wb_.*
 wbs_.*
 la_.*
+user_clock2
 irq.*
 
 #N
diff --git a/verilog/rtl/0001-fix-make-targets.patch b/verilog/rtl/0001-usb_cdc-fix-make-targets.patch
similarity index 100%
rename from verilog/rtl/0001-fix-make-targets.patch
rename to verilog/rtl/0001-usb_cdc-fix-make-targets.patch
diff --git a/verilog/rtl/fpga/Makefile b/verilog/rtl/fpga/Makefile
index 7946b02..d3028e5 100644
--- a/verilog/rtl/fpga/Makefile
+++ b/verilog/rtl/fpga/Makefile
@@ -6,6 +6,7 @@
 
 NAME = fpga_top
 DEPS = \
+../usb2uart.v \
 ../usb_cdc/usb_cdc/phy_tx.v \
 ../usb_cdc/usb_cdc/phy_rx.v \
 ../usb_cdc/usb_cdc/sie.v \
diff --git a/verilog/rtl/fpga/README.md b/verilog/rtl/fpga/README.md
index 58964bb..e3fbd79 100644
--- a/verilog/rtl/fpga/README.md
+++ b/verilog/rtl/fpga/README.md
@@ -13,7 +13,7 @@
 
 ```sh
 cd ../usb_cdc/
-git apply ../0001-fix-make-targets.patch
+git apply ../0001-usb_cdc-fix-make-targets.patch
 
 cd examples/TinyFPGA-BX/OSS_CAD_Suite/
 make PROJ=soc clean sim
diff --git a/verilog/rtl/fpga/fpga_top.v b/verilog/rtl/fpga/fpga_top.v
index df4e986..72de9c9 100644
--- a/verilog/rtl/fpga/fpga_top.v
+++ b/verilog/rtl/fpga/fpga_top.v
@@ -7,11 +7,6 @@
    output usb_pu  // USB 1.5kOhm Pullup EN
 );
 
-   localparam BIT_SAMPLES       = 4;
-   localparam c_CLOCK_MHZ       = BIT_SAMPLES*12;
-   localparam c_UART_SPEED      = 115200;
-   localparam c_CLKS_PER_BYTE   = (c_CLOCK_MHZ*1000000+c_UART_SPEED*8-1)/(c_UART_SPEED*8);
-
    wire clk_pll;
    pll pll48( .clock_in(clk), .clock_out(clk_pll) );
 
@@ -19,73 +14,15 @@
    wire rstn = &reset_cnt;
    always @(posedge clk_pll) reset_cnt <= reset_cnt + !rstn;
 
-   wire             in_ready;
-   wire [7:0]       in_data;
-   wire             in_valid;
-   wire             out_ready;
-   wire [7:0]       out_data;
-   wire             out_valid;
-
-   uart # (
-      .DATA_WIDTH(8)
-   ) u_uart (
-      .clk(clk_pll),
+   usb2uart usb2uart (
+      .clk48(clk_pll),
       .rst(~rstn),
-
-      //data input to uart tx
-      .s_axis_tdata(out_data),
-      .s_axis_tvalid(out_valid),
-      .s_axis_tready(out_ready),
-      .txd(uart_tx),
-
-      //data output from uart rx
-      .m_axis_tdata(in_data),
-      .m_axis_tvalid(in_valid),
-      .m_axis_tready(in_ready),
-      .rxd(uart_rx),
-
-      .prescale(c_CLKS_PER_BYTE)
-   );
-
-   wire             dp_pu;
-   wire             dp_rx;
-   wire             dn_rx;
-   wire             dp_tx;
-   wire             dn_tx;
-   wire             tx_en;
-
-   assign usb_p = tx_en ? dp_tx : 1'bz;
-   assign dp_rx = usb_p;
-
-   assign usb_n = tx_en ? dn_tx : 1'bz;
-   assign dn_rx = usb_n;
-
-   assign usb_pu = dp_pu;
-
-   usb_cdc #(
-      .VENDORID(16'h1D50),
-      .PRODUCTID(16'h6130)
-   ) u_usb_cdc (
-      .clk_i(clk_pll),
-      .rstn_i(rstn),
-      .app_clk_i(1'b0),
-
-      //data output from usb rx
-      .out_data_o(out_data),
-      .out_valid_o(out_valid),
-      .out_ready_i(out_ready),
-
-      //data input to usb tx
-      .in_data_i(in_data),
-      .in_valid_i(in_valid),
-      .in_ready_o(in_ready),
-
-      .dp_pu_o(dp_pu),
-      .tx_en_o(tx_en),
-      .dp_tx_o(dp_tx),
-      .dn_tx_o(dn_tx),
-      .dp_rx_i(dp_rx),
-      .dn_rx_i(dn_rx)
+      .uart_rx(uart_rx),
+      .uart_tx(uart_tx),
+      .usb_p(usb_p),
+      .usb_n(usb_n),
+      .usb_pu(usb_pu),
+      .usb_tx_en()
    );
 
 endmodule
diff --git a/verilog/rtl/usb2uart.v b/verilog/rtl/usb2uart.v
new file mode 100644
index 0000000..6acd066
--- /dev/null
+++ b/verilog/rtl/usb2uart.v
@@ -0,0 +1,87 @@
+`default_nettype none
+
+module usb2uart (
+    input  clk48, // 48MHz Clock
+    input  rst, // reset
+    input  uart_rx, // uart in
+    output uart_tx, // uart out
+    inout  usb_p, // USB+
+    inout  usb_n, // USB-
+    output usb_pu,  // USB 1.5kOhm Pullup EN
+    output usb_tx_en  // USB tx enabled
+);
+
+    wire             in_ready;
+    wire [7:0]       in_data;
+    wire             in_valid;
+    wire             out_ready;
+    wire [7:0]       out_data;
+    wire             out_valid;
+
+    uart # (
+        .DATA_WIDTH(8)
+    ) u_uart (
+        .clk(clk48),
+        .rst(rst),
+
+        //data input to uart tx
+        .s_axis_tdata(out_data),
+        .s_axis_tvalid(out_valid),
+        .s_axis_tready(out_ready),
+        .txd(uart_tx),
+
+        //data output from uart rx
+        .m_axis_tdata(in_data),
+        .m_axis_tvalid(in_valid),
+        .m_axis_tready(in_ready),
+        .rxd(uart_rx),
+        
+        //115200 bauds from 48MHz clock
+        .prescale(((48*1000000)+(115200*8)-1)/(115200*8))
+    );
+
+    wire             dp_pu;
+    wire             dp_rx;
+    wire             dn_rx;
+    wire             dp_tx;
+    wire             dn_tx;
+    wire             tx_en;
+
+    assign usb_p = tx_en ? dp_tx : 1'bz;
+    assign dp_rx = usb_p;
+
+    assign usb_n = tx_en ? dn_tx : 1'bz;
+    assign dn_rx = usb_n;
+
+    assign usb_pu = dp_pu;
+    assign usb_tx_en = tx_en;
+
+    usb_cdc #(
+        .VENDORID(16'h1D50),
+        .PRODUCTID(16'h6130)
+    ) u_usb_cdc (
+        .clk_i(clk48),
+        .rstn_i(~rst),
+        .app_clk_i(1'b0),
+
+        //data output from usb rx
+        .out_data_o(out_data),
+        .out_valid_o(out_valid),
+        .out_ready_i(out_ready),
+
+        //data input to usb tx
+        .in_data_i(in_data),
+        .in_valid_i(in_valid),
+        .in_ready_o(in_ready),
+
+        .dp_pu_o(dp_pu),
+        .tx_en_o(tx_en),
+        .dp_tx_o(dp_tx),
+        .dn_tx_o(dn_tx),
+        .dp_rx_i(dp_rx),
+        .dn_rx_i(dn_rx)
+    );
+
+endmodule
+
+`default_nettype wire
\ No newline at end of file
diff --git a/verilog/rtl/user_defines.v b/verilog/rtl/user_defines.v
index 8533e2f..74f5459 100644
--- a/verilog/rtl/user_defines.v
+++ b/verilog/rtl/user_defines.v
@@ -83,10 +83,12 @@
 `define USER_CONFIG_GPIO_30_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
 `define USER_CONFIG_GPIO_31_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
 `define USER_CONFIG_GPIO_32_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
-`define USER_CONFIG_GPIO_33_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
-`define USER_CONFIG_GPIO_34_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
-`define USER_CONFIG_GPIO_35_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
-`define USER_CONFIG_GPIO_36_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
-`define USER_CONFIG_GPIO_37_INIT `GPIO_MODE_MGMT_STD_INPUT_NOPULL
+
+// User GPIO 33 to 37
+`define USER_CONFIG_GPIO_33_INIT `GPIO_MODE_USER_STD_INPUT_NOPULL
+`define USER_CONFIG_GPIO_34_INIT `GPIO_MODE_USER_STD_OUTPUT
+`define USER_CONFIG_GPIO_35_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_36_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_37_INIT `GPIO_MODE_USER_STD_OUTPUT
 
 `endif // __USER_DEFINES_H
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index 26081e9..efd4938 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -65,6 +65,9 @@
     output [`MPRJ_IO_PADS-1:0] io_out,
     output [`MPRJ_IO_PADS-1:0] io_oeb,
 
+    // User clock
+    input user_clock2,
+
     // IRQ
     output [2:0] irq
 );
@@ -90,8 +93,8 @@
     assign wdata = wbs_dat_i;
 
     // IO
-    assign io_out = count;
-    assign io_oeb = {(`MPRJ_IO_PADS-1){rst}};
+    assign io_out[`MPRJ_IO_PADS-6:0] = {1'b0, count};
+    assign io_oeb[`MPRJ_IO_PADS-6:0] = {(`MPRJ_IO_PADS-5){rst}};
 
     // IRQ
     assign irq = 3'b000;	// Unused
@@ -106,7 +109,7 @@
 
     counter #(
         .BITS(BITS)
-    ) counter(
+    ) counter (
         .clk(clk),
         .reset(rst),
         .ready(wbs_ack_o),
@@ -119,6 +122,42 @@
         .count(count)
     );
 
+    wire uart_rx;
+    wire uart_tx;
+    wire usb_p;
+    wire usb_n;
+    wire usb_pu;
+    wire usb_tx_en;
+
+    // io_out[33] input uart_rx
+    assign io_oeb[`MPRJ_IO_PADS-5] = 1'b0;
+    assign uart_rx = io_out[`MPRJ_IO_PADS-5];
+    // io_out[34] output uart_tx
+    assign io_oeb[`MPRJ_IO_PADS-4] = 1'b1;
+    assign io_out[`MPRJ_IO_PADS-4] = uart_tx;
+    // io_out[35] inout usb_p
+    assign io_oeb[`MPRJ_IO_PADS-3] = usb_tx_en;
+    assign io_out[`MPRJ_IO_PADS-3] = /* usb_tx_en ? */ usb_p;
+    assign usb_p = io_out[`MPRJ_IO_PADS-3];
+    // io_out[36] inout usb_n
+    assign io_oeb[`MPRJ_IO_PADS-2] = usb_tx_en;
+    assign io_out[`MPRJ_IO_PADS-2] = /* usb_tx_en ? */ usb_n;
+    assign usb_n = io_out[`MPRJ_IO_PADS-2];
+    // io_out[37] output usb_pu
+    assign io_oeb[`MPRJ_IO_PADS-1] = 1'b1;
+    assign io_out[`MPRJ_IO_PADS-1] = usb_pu;
+
+    usb2uart usb2uart (
+        .clk48(user_clk),
+        .rst(wb_rst_i),
+        .uart_rx(uart_rx),
+        .uart_tx(uart_tx),
+        .usb_p(usb_p),
+        .usb_n(usb_n),
+        .usb_pu(usb_pu),
+        .usb_tx_en(usb_tx_en)
+    );
+
 endmodule
 
 module counter #(
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index 5ee1cee..2bbb1e2 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -114,6 +114,9 @@
     .io_out(io_out),
     .io_oeb(io_oeb),
 
+    // User clock
+    .user_clock2(user_clock2),
+
     // IRQ
     .irq(user_irq)
 );