add uart to fpga_top test
diff --git a/verilog/rtl/fpga/Makefile b/verilog/rtl/fpga/Makefile
index 555204e..03bfe8a 100644
--- a/verilog/rtl/fpga/Makefile
+++ b/verilog/rtl/fpga/Makefile
@@ -16,15 +16,18 @@
../usb_cdc/usb_cdc/usb_cdc.v \
../usb_cdc/examples/common/hdl/prescaler.v \
../usb_cdc/examples/common/hdl/fifo_if.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
PIN_DEF = fpga_pins.pcf
# TinyFPGA-BX
FPGA_SIZE = 8k
-FPGA_TYPE = hx
+FPGA_TYPE = lp
FPGA_PACK = cm81
-all: sint
+all: sint time
sim: $(NAME)_tb.vcd
gtkwave $< $(<:.vcd=.gtkw) &
@@ -52,7 +55,7 @@
./$(@:.vcd=.out)
.v.json:
- yosys -p "synth_ice40 -json $@" $^
+ yosys -p "$(foreach file,$^,read_verilog $(file);)" -p "synth_ice40 -json $@" $^
.json.asc:
nextpnr-ice40 --$(FPGA_TYPE)$(FPGA_SIZE) --package $(FPGA_PACK) --pcf-allow-unconstrained --pcf $(PIN_DEF) --json $< --asc $@
diff --git a/verilog/rtl/fpga/README.md b/verilog/rtl/fpga/README.md
index a3bb582..3fc86c5 100644
--- a/verilog/rtl/fpga/README.md
+++ b/verilog/rtl/fpga/README.md
@@ -4,11 +4,28 @@
## USB
+See echo of slightly modified input.
+
```sh
cd ../usb_cdc/examples/TinyFPGA-BX/OSS_CAD_Suite/
tinyprog -l
-make all PROJ=soc
-make prog PROJ=soc
+make PROJ=soc clean all
+make PROJ=soc prog
+tinyprog -b
+
minicom -D /dev/ttyACM0
```
+## USB2TTL
+
+Attach another USB2TTL to pins 4,5 and see characters being passed between.
+
+```sh
+tinyprog -l
+make clean all
+make prog
+tinyprog -b
+
+minicom -D /dev/ttyACM0
+minicom -D /dev/ttyUSB0
+```
diff --git a/verilog/rtl/fpga/fpga_pins.pcf b/verilog/rtl/fpga/fpga_pins.pcf
index 3674bae..afa9d4d 100644
--- a/verilog/rtl/fpga/fpga_pins.pcf
+++ b/verilog/rtl/fpga/fpga_pins.pcf
@@ -5,5 +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 led B3
set_io clk B2
diff --git a/verilog/rtl/fpga/fpga_top.v b/verilog/rtl/fpga/fpga_top.v
index 67da9e0..d704edd 100644
--- a/verilog/rtl/fpga/fpga_top.v
+++ b/verilog/rtl/fpga/fpga_top.v
@@ -1,8 +1,9 @@
-module soc
- (
+module fpga_top (
input clk, // 16MHz Clock
output led, // User LED ON=1, OFF=0
+ 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
@@ -32,37 +33,40 @@
// 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));
+ 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));
- 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));
+ 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));
reg [1:0] rstn_sync;
@@ -97,80 +101,108 @@
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),
+ .rst(~rstn),
+ .s_axis_tdata(out_data),
+ .s_axis_tvalid(out_valid),
+ .s_axis_tready(out_ready),
+ .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
+ );
+//*/
+ 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),
+ .rstn_i(rstn),
+ .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),
+ .dp_pu_o(dp_pu),
+ .tx_en_o(tx_en),
+ .dp_tx_o(dp_tx),
+ .dn_tx_o(dn_tx));
- 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));
+ SB_IO #(
+ .PIN_TYPE(6'b101001),
+ .PULLUP(1'b0))
+ u_usb_p (
+ .PACKAGE_PIN(usb_p),
+ .OUTPUT_ENABLE(tx_en),
+ .D_OUT_0(dp_tx),
+ .D_IN_0(dp_rx),
+ .D_OUT_1(1'b0),
+ .D_IN_1(),
+ .CLOCK_ENABLE(1'b0),
+ .LATCH_INPUT_VALUE(1'b0),
+ .INPUT_CLK(1'b0),
+ .OUTPUT_CLK(1'b0));
- 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),
- .rstn_i(rstn),
- .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),
- .dp_pu_o(dp_pu),
- .tx_en_o(tx_en),
- .dp_tx_o(dp_tx),
- .dn_tx_o(dn_tx));
-
- SB_IO #(.PIN_TYPE(6'b101001),
- .PULLUP(1'b0))
- u_usb_p (.PACKAGE_PIN(usb_p),
- .OUTPUT_ENABLE(tx_en),
- .D_OUT_0(dp_tx),
- .D_IN_0(dp_rx),
- .D_OUT_1(1'b0),
- .D_IN_1(),
- .CLOCK_ENABLE(1'b0),
- .LATCH_INPUT_VALUE(1'b0),
- .INPUT_CLK(1'b0),
- .OUTPUT_CLK(1'b0));
-
- SB_IO #(.PIN_TYPE(6'b101001),
- .PULLUP(1'b0))
- u_usb_n (.PACKAGE_PIN(usb_n),
- .OUTPUT_ENABLE(tx_en),
- .D_OUT_0(dn_tx),
- .D_IN_0(dn_rx),
- .D_OUT_1(1'b0),
- .D_IN_1(),
- .CLOCK_ENABLE(1'b0),
- .LATCH_INPUT_VALUE(1'b0),
- .INPUT_CLK(1'b0),
- .OUTPUT_CLK(1'b0));
+ SB_IO #(
+ .PIN_TYPE(6'b101001),
+ .PULLUP(1'b0))
+ u_usb_n (
+ .PACKAGE_PIN(usb_n),
+ .OUTPUT_ENABLE(tx_en),
+ .D_OUT_0(dn_tx),
+ .D_IN_0(dn_rx),
+ .D_OUT_1(1'b0),
+ .D_IN_1(),
+ .CLOCK_ENABLE(1'b0),
+ .LATCH_INPUT_VALUE(1'b0),
+ .INPUT_CLK(1'b0),
+ .OUTPUT_CLK(1'b0));
// drive usb_pu to 3.3V or to high impedance
- SB_IO #(.PIN_TYPE(6'b101001),
- .PULLUP(1'b0))
- u_usb_pu (.PACKAGE_PIN(usb_pu),
- .OUTPUT_ENABLE(dp_pu),
- .D_OUT_0(1'b1),
- .D_IN_0(),
- .D_OUT_1(1'b0),
- .D_IN_1(),
- .CLOCK_ENABLE(1'b0),
- .LATCH_INPUT_VALUE(1'b0),
- .INPUT_CLK(1'b0),
- .OUTPUT_CLK(1'b0));
+ SB_IO #(
+ .PIN_TYPE(6'b101001),
+ .PULLUP(1'b0))
+ u_usb_pu (
+ .PACKAGE_PIN(usb_pu),
+ .OUTPUT_ENABLE(dp_pu),
+ .D_OUT_0(1'b1),
+ .D_IN_0(),
+ .D_OUT_1(1'b0),
+ .D_IN_1(),
+ .CLOCK_ENABLE(1'b0),
+ .LATCH_INPUT_VALUE(1'b0),
+ .INPUT_CLK(1'b0),
+ .OUTPUT_CLK(1'b0));
endmodule