summaryrefslogtreecommitdiff
path: root/jtag_uart.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--jtag_uart.sv82
1 files changed, 82 insertions, 0 deletions
diff --git a/jtag_uart.sv b/jtag_uart.sv
new file mode 100644
index 0000000..ddb5ecb
--- /dev/null
+++ b/jtag_uart.sv
@@ -0,0 +1,82 @@
1module jtag_uart
2 #( INSTANCE = 0
3
4 , RX_FIFO_BITS = 6
5 , TX_FIFO_BITS = 6
6 )
7 ( input bit clk
8 , input bit reset
9
10 , input bit rx_ready `define rx_ready $past(rx_ready)
11 , output bit rx_valid
12 , output bit [7:0] rx_data
13
14 , output bit tx_ready
15 , input bit tx_valid `define tx_valid $past(tx_valid)
16 , input bit [7:0] tx_data `define tx_data $past(tx_data)
17 );
18
19`ifdef SYNTHESIS
20
21alt_jtag_atlantic
22 #( .INSTANCE_ID(INSTANCE)
23 , .LOG2_RXFIFO_DEPTH(RX_FIFO_BITS)
24 , .LOG2_TXFIFO_DEPTH(TX_FIFO_BITS)
25 , .SLD_AUTO_INSTANCE_INDEX("NO")
26 ) real_jtag
27 ( .clk(clk)
28 , .rst_n(!reset)
29 , .r_dat(tx_data)
30 , .r_val(tx_valid)
31 , .r_ena(tx_ready)
32 , .t_dat(rx_data)
33 , .t_dav(rx_ready)
34 , .t_ena(rx_valid)
35 );
36
37`else
38
39bit [7:0] sim_rx_rom [0:(1<<16)-1];
40initial $readmemh("jtag_uart.hex", sim_rx_rom);
41
42bit [15:0] sim_rx_addr;
43
44bit tx_b_valid;
45bit [7:0] tx_b_data;
46
47always_ff @(posedge clk) begin
48 if (reset) begin
49 rx_valid = 0;
50 tx_ready = 0;
51 sim_rx_addr = 0;
52 tx_b_valid = 0;
53 end else begin
54 automatic bit [7:0] sim_rx_data = sim_rx_rom[sim_rx_addr];
55
56 // RX logic
57 if (`rx_ready) rx_valid = 0;
58 if (!rx_valid && (sim_rx_data != 0)) begin
59`ifdef JTAG_UART_LOCAL_ECHO
60 $write("%s", sim_rx_data);
61`endif
62 rx_valid = 1;
63 rx_data = sim_rx_data;
64 sim_rx_addr = sim_rx_addr + 1;
65 end
66
67 // TX logic
68 if (tx_ready && `tx_valid) begin
69 tx_b_valid = 1;
70 tx_b_data = `tx_data;
71 end
72 if (tx_b_valid) begin
73 $write("%s", tx_b_data);
74 tx_b_valid = 0;
75 end
76 tx_ready = !tx_b_valid;
77 end
78end
79
80`endif
81
82endmodule