diff options
author | Martin Stensgård <mastensg@mastensg.net> | 2025-04-17 21:29:40 +0200 |
---|---|---|
committer | Martin Stensgård <mastensg@mastensg.net> | 2025-04-17 21:29:40 +0200 |
commit | 044e0b10a345f85ae3d8a94dc29956511f3e12bf (patch) | |
tree | 07321bcfaa3b4ec99d7e4a440c4b3f4720e7ca24 | |
parent | e37b995f54bc922346bc9779558af732047b41d6 (diff) |
uart_benchmark_3_megabaud: transmit U at pi's fastest rate
-rw-r--r-- | uart_benchmark_3_megabaud/Makefile | 23 | ||||
-rw-r--r-- | uart_benchmark_3_megabaud/README | 3 | ||||
-rw-r--r-- | uart_benchmark_3_megabaud/top.pcf | 28 | ||||
-rw-r--r-- | uart_benchmark_3_megabaud/top.v | 87 |
4 files changed, 141 insertions, 0 deletions
diff --git a/uart_benchmark_3_megabaud/Makefile b/uart_benchmark_3_megabaud/Makefile new file mode 100644 index 0000000..1afafb7 --- /dev/null +++ b/uart_benchmark_3_megabaud/Makefile @@ -0,0 +1,23 @@ +TOP = top + +all: check top.bin + +check: + verilator --lint-only --top $(TOP) top.v + +clean: + rm -f top.asc top.bin top.json + +load: all + iceprog top.bin + +.PHONY: all check clean load + +top.asc: top.json top.pcf + nextpnr-ice40 --hx1k --package tq144 --json top.json --pcf top.pcf --asc top.asc --top $(TOP) + +top.bin: top.asc + icepack top.asc top.bin + +top.json: top.v + yosys -q -p "synth_ice40 -json top.json -top $(TOP)" top.v diff --git a/uart_benchmark_3_megabaud/README b/uart_benchmark_3_megabaud/README new file mode 100644 index 0000000..9f57d71 --- /dev/null +++ b/uart_benchmark_3_megabaud/README @@ -0,0 +1,3 @@ +12 MHz clk / 4 => 3 MBd UART + +picocom -b 3000000 /dev/ttyUSB1 | pv > U.txt diff --git a/uart_benchmark_3_megabaud/top.pcf b/uart_benchmark_3_megabaud/top.pcf new file mode 100644 index 0000000..b5ce785 --- /dev/null +++ b/uart_benchmark_3_megabaud/top.pcf @@ -0,0 +1,28 @@ +set_io ftdi_tx 8 +set_io ftdi_rx 9 + +set_io clk 21 + +set_io p44 44 +set_io p45 45 +set_io p47 47 +set_io p48 48 +set_io p56 56 +set_io p60 60 +set_io p61 61 +set_io p62 62 + +set_io p112 112 +set_io p113 113 +set_io p114 114 +set_io p115 115 +set_io p116 116 +set_io p117 117 +set_io p118 118 +set_io p119 119 + +set_io D5 95 +set_io D1 96 +set_io D2 97 +set_io D3 98 +set_io D4 99 diff --git a/uart_benchmark_3_megabaud/top.v b/uart_benchmark_3_megabaud/top.v new file mode 100644 index 0000000..6d79c53 --- /dev/null +++ b/uart_benchmark_3_megabaud/top.v @@ -0,0 +1,87 @@ +module top( + input clk, + output ftdi_tx +); + wire clk_uart; + reg [7:0] char = 8'h55; + reg uart_go = 0; + wire uart_ready; + clk_div_uart clk_div_uart_1(clk, clk_uart); + uart_tx uart_tx_1(clk_uart, char, uart_go, ftdi_tx, uart_ready); + + always @(posedge clk) begin + uart_go <= uart_ready; + end +endmodule + +module clk_div_uart(input clk, output reg clk_uart); + reg [3:0] t = 0; + always @(posedge clk) begin + t <= t<4-1 ? t+1 : 0; + clk_uart <= t<2; + end +endmodule + +module uart_tx(input clk, input [7:0] char, input go, output reg tx, output reg ready); + parameter s_ready = 0; + parameter s_start = 1; + parameter s_data0 = 2; + parameter s_data1 = 3; + parameter s_data2 = 4; + parameter s_data3 = 5; + parameter s_data4 = 6; + parameter s_data5 = 7; + parameter s_data6 = 8; + parameter s_data7 = 9; + parameter s_stop1 = 10; + parameter s_stop2 = 11; + parameter s_stop3 = 12; + parameter s_stop4 = 13; + + reg [3:0] state = s_ready; + reg [7:0] data = 8'h41; + + always @(posedge clk) begin + ready <= state == s_ready; + case (state) + s_ready: begin + if (go) begin + data <= char; + state <= s_start; + end + end + s_start: state <= s_data0; + s_data0: state <= s_data1; + s_data1: state <= s_data2; + s_data2: state <= s_data3; + s_data3: state <= s_data4; + s_data4: state <= s_data5; + s_data5: state <= s_data6; + s_data6: state <= s_data7; + s_data7: state <= s_stop1; + s_stop1: state <= s_stop2; + s_stop2: state <= s_stop3; + s_stop3: state <= s_stop4; + s_stop4: begin + if (!go) + state <= s_ready; + end + endcase + case (state) + s_ready: tx <= 1; + s_start: tx <= 0; + s_data0: tx <= data[0]; + s_data1: tx <= data[1]; + s_data2: tx <= data[2]; + s_data3: tx <= data[3]; + s_data4: tx <= data[4]; + s_data5: tx <= data[5]; + s_data6: tx <= data[6]; + s_data7: tx <= data[7]; + s_stop1: tx <= 1; + s_stop2: tx <= 1; + s_stop3: tx <= 1; + s_stop4: tx <= 1; + endcase + end +endmodule |