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)
);