update fpga test
 - usb->ttl looks ok
 - ttl->usb has some errors
 - timing is not met
 - max clk_pll is 44mhz but needs 48mhz
diff --git a/verilog/rtl/fpga/Makefile b/verilog/rtl/fpga/Makefile
index 03bfe8a..e241c45 100644
--- a/verilog/rtl/fpga/Makefile
+++ b/verilog/rtl/fpga/Makefile
@@ -16,10 +16,10 @@
 ../usb_cdc/usb_cdc/usb_cdc.v \
 ../usb_cdc/examples/common/hdl/prescaler.v \
 ../usb_cdc/examples/common/hdl/fifo_if.v \
+pll.v \
 ../verilog-uart/rtl/uart_rx.v \
 ../verilog-uart/rtl/uart_tx.v \
-../verilog-uart/rtl/uart.v \
-../usb_cdc/examples/TinyFPGA-BX/hdl/soc/app.v
+../verilog-uart/rtl/uart.v
 PIN_DEF = fpga_pins.pcf
 
 # TinyFPGA-BX
diff --git a/verilog/rtl/fpga/fpga_pins.pcf b/verilog/rtl/fpga/fpga_pins.pcf
index afa9d4d..5c83f73 100644
--- a/verilog/rtl/fpga/fpga_pins.pcf
+++ b/verilog/rtl/fpga/fpga_pins.pcf
@@ -5,7 +5,7 @@
 set_io usb_pu A3
 set_io usb_n A4
 set_io usb_p B4
-set_io uart_rx C2
-set_io uart_tx D2
+set_io uart_rx A2
+set_io uart_tx A1
 set_io led B3
 set_io clk B2
diff --git a/verilog/rtl/fpga/fpga_top.v b/verilog/rtl/fpga/fpga_top.v
index d704edd..f0aac5e 100644
--- a/verilog/rtl/fpga/fpga_top.v
+++ b/verilog/rtl/fpga/fpga_top.v
@@ -1,4 +1,3 @@
-
 module fpga_top (
    input  clk, // 16MHz Clock
    output led, // User LED ON=1, OFF=0
@@ -7,74 +6,40 @@
    inout  usb_p, // USB+
    inout  usb_n, // USB-
    output usb_pu  // USB 1.5kOhm Pullup EN
-   );
+);
 
-   localparam BIT_SAMPLES = 'd4;
-   localparam [6:0] DIVF = 12*BIT_SAMPLES-1;
+   localparam BIT_SAMPLES       = 4;
+   localparam c_CLOCK_MHZ       = BIT_SAMPLES*12;
+   localparam c_UART_SPEED      = 115200;
+   localparam c_CLKS_PER_BIT    = c_CLOCK_MHZ*1000000/c_UART_SPEED;
+   localparam c_CLKS_PER_BYTE   = (c_CLOCK_MHZ*1000000+c_UART_SPEED*8-1)/(c_UART_SPEED*8);
 
-   wire             clk_pll;
-   wire             clk_1mhz;
-   wire             clk_2mhz;
-   wire             clk_4mhz;
-   wire             clk_8mhz;
+   wire             clk_pll; //48MHz clock
    wire             lock;
+
    wire             dp_pu;
    wire             dp_rx;
    wire             dn_rx;
    wire             dp_tx;
    wire             dn_tx;
    wire             tx_en;
-   wire [7:0]       out_data;
-   wire             out_valid;
-   wire             in_ready;
+
+   reg              in_ready;
    wire [7:0]       in_data;
    wire             in_valid;
    wire             out_ready;
+   reg [7:0]        out_data;
+   reg              out_valid;
 
-   // if FEEDBACK_PATH = SIMPLE:
-   // clk_freq = (ref_freq * (DIVF + 1)) / (2**DIVQ * (DIVR + 1));
-   SB_PLL40_CORE #(
-      .DIVR(4'd0),
-      .DIVF(DIVF),
-      .DIVQ(3'd4),
-      .FILTER_RANGE(3'b001),
-      .FEEDBACK_PATH("SIMPLE"),
-      .DELAY_ADJUSTMENT_MODE_FEEDBACK("FIXED"),
-      .FDA_FEEDBACK(4'b0000),
-      .DELAY_ADJUSTMENT_MODE_RELATIVE("FIXED"),
-      .FDA_RELATIVE(4'b0000),
-      .SHIFTREG_DIV_MODE(2'b00),
-      .PLLOUT_SELECT("GENCLK"),
-      .ENABLE_ICEGATE(1'b0))
-   u_pll (
-      .REFERENCECLK(clk), // 16MHz
-      .PLLOUTCORE(),
-      .PLLOUTGLOBAL(clk_pll), // 48MHz
-      .EXTFEEDBACK(1'b0),
-      .DYNAMICDELAY(8'd0),
-      .LOCK(lock),
-      .BYPASS(1'b0),
-      .RESETB(1'b1),
-      .SDI(1'b0),
-      .SDO(),
-      .SCLK(1'b0),
-      .LATCHINPUTVALUE(1'b1));
+   pll pll48( .clock_in(clk), .clock_out(clk_pll), .locked( lock ) );
 
-   prescaler u_prescaler (
-      .clk_i(clk),
-      .rstn_i(lock),
-      .clk_div16_o(clk_1mhz),
-      .clk_div8_o(clk_2mhz),
-      .clk_div4_o(clk_4mhz),
-      .clk_div2_o(clk_8mhz));
+   assign led = 1'b1;
+   //assign usb_pu = dp_pu;
 
    reg [1:0]        rstn_sync;
-
    wire             rstn;
-
    assign rstn = rstn_sync[0];
-
-   always @(posedge clk_1mhz or negedge lock) begin
+   always @(posedge clk_pll or negedge lock) begin
       if (~lock) begin
          rstn_sync <= 2'd0;
       end else begin
@@ -82,87 +47,57 @@
       end
    end
 
-   reg [20:0]       up_cnt;
-   reg [1:0]        sleep_sq;
-
-   wire             sleep;
-
-   always @(posedge clk_1mhz or negedge rstn) begin
-      if (~rstn) begin
-         up_cnt <= 'd0;
-         sleep_sq <= 2'b00;
-      end else begin
-         sleep_sq <= {sleep, sleep_sq[1]};
-         if (up_cnt[20] == 1'b0)
-           up_cnt <= up_cnt + 1;
-         else if (~sleep_sq[0])
-           up_cnt <= 21'hE0000;
-      end
-   end
-
-   assign led = ~dp_pu | ~up_cnt[20];
-/*
-   app u_app (
-      .clk_i(clk_2mhz),
-      .rstn_i(rstn),
-      .sleep_o(sleep),
-      .out_data_i(out_data),
-      .out_valid_i(out_valid),
-      .in_ready_i(in_ready),
-      .out_ready_o(out_ready),
-      .in_data_o(in_data),
-      .in_valid_o(in_valid));
-//*/
-//*
-   uart u_uart (
-      .clk(clk_2mhz),
+   uart # (
+      .DATA_WIDTH(8)
+   ) u_uart (
+      .clk(clk_pll),
       .rst(~rstn),
+
       .s_axis_tdata(out_data),
       .s_axis_tvalid(out_valid),
       .s_axis_tready(out_ready),
+      .txd(uart_tx),
+
       .m_axis_tdata(in_data),
       .m_axis_tvalid(in_valid),
       .m_axis_tready(in_ready),
       .rxd(uart_rx),
-      .txd(uart_tx),
-      //.tx_busy(),
-      //.rx_busy(),
-      //.rx_overrun_error(),
-      //.rx_frame_error(),
-      .prescale(16'h0002) //2000000÷(115200*8)=2.17
+
+      .prescale(c_CLKS_PER_BYTE)
    );
-//*/
+
    usb_cdc #(
       .VENDORID(16'h1D50),
       .PRODUCTID(16'h6130),
       .IN_BULK_MAXPACKETSIZE('d8),
       .OUT_BULK_MAXPACKETSIZE('d8),
       .BIT_SAMPLES(BIT_SAMPLES),
-      .USE_APP_CLK(1),
-      .APP_CLK_RATIO(BIT_SAMPLES*12/2))  // BIT_SAMPLES * 12MHz / 2MHz
-   u_usb_cdc (
-      .frame_o(),
-      .configured_o(),
-      .app_clk_i(clk_2mhz),
-      .clk_i(clk_pll),
+      .USE_APP_CLK(0),
+      .APP_CLK_RATIO(c_CLKS_PER_BIT)
+   ) u_usb_cdc (
+      .clk_i(clk_pll), // 48MHz
       .rstn_i(rstn),
+      .app_clk_i(),
+      .out_data_o(out_data),
+      .out_valid_o(out_valid),
       .out_ready_i(out_ready),
       .in_data_i(in_data),
       .in_valid_i(in_valid),
-      .dp_rx_i(dp_rx),
-      .dn_rx_i(dn_rx),
-      .out_data_o(out_data),
-      .out_valid_o(out_valid),
       .in_ready_o(in_ready),
+      .frame_o(),
+      .configured_o(),
       .dp_pu_o(dp_pu),
       .tx_en_o(tx_en),
       .dp_tx_o(dp_tx),
-      .dn_tx_o(dn_tx));
+      .dn_tx_o(dn_tx),
+      .dp_rx_i(dp_rx),
+      .dn_rx_i(dn_rx)
+   );
 
    SB_IO #(
       .PIN_TYPE(6'b101001),
-      .PULLUP(1'b0))
-   u_usb_p (
+      .PULLUP(1'b0)
+   ) u_usb_p (
       .PACKAGE_PIN(usb_p),
       .OUTPUT_ENABLE(tx_en),
       .D_OUT_0(dp_tx),
@@ -176,8 +111,8 @@
 
    SB_IO #(
       .PIN_TYPE(6'b101001),
-      .PULLUP(1'b0))
-   u_usb_n (
+      .PULLUP(1'b0)
+   ) u_usb_n (
       .PACKAGE_PIN(usb_n),
       .OUTPUT_ENABLE(tx_en),
       .D_OUT_0(dn_tx),
diff --git a/verilog/rtl/fpga/pll.v b/verilog/rtl/fpga/pll.v
new file mode 100644
index 0000000..cb436f9
--- /dev/null
+++ b/verilog/rtl/fpga/pll.v
@@ -0,0 +1,33 @@
+/**
+ * PLL configuration
+ *
+ * This Verilog module was generated automatically
+ * using the icepll tool from the IceStorm project.
+ * Use at your own risk.
+ *
+ * Given input frequency:        16.000 MHz
+ * Requested output frequency:   48.000 MHz
+ * Achieved output frequency:    48.000 MHz
+ */
+
+module pll(
+	input  clock_in,
+	output clock_out,
+	output locked
+	);
+
+SB_PLL40_CORE #(
+		.FEEDBACK_PATH("SIMPLE"),
+		.DIVR(4'b0000),		// DIVR =  0
+		.DIVF(7'b0101111),	// DIVF = 47
+		.DIVQ(3'b100),		// DIVQ =  4
+		.FILTER_RANGE(3'b001)	// FILTER_RANGE = 1
+	) uut (
+		.LOCK(locked),
+		.RESETB(1'b1),
+		.BYPASS(1'b0),
+		.REFERENCECLK(clock_in),
+		.PLLOUTCORE(clock_out)
+		);
+
+endmodule