summaryrefslogtreecommitdiff
path: root/top.sv
diff options
context:
space:
mode:
Diffstat (limited to 'top.sv')
-rw-r--r--top.sv152
1 files changed, 0 insertions, 152 deletions
diff --git a/top.sv b/top.sv
deleted file mode 100644
index 0244020..0000000
--- a/top.sv
+++ /dev/null
@@ -1,152 +0,0 @@
1`include "utils.svh"
2
3module top
4 #( FIB_BITS = 16
5 , FIB_BASE = 10
6 , FIB_DIGITS = 5
7
8 , ROM_BITS = 8
9 )
10 ( input bit clk // verilator public
11 , input bit reset_n // verilator public
12 );
13
14bit reset;
15assign reset = !reset_n;
16
17bit [7:0] rom [0:(1<<ROM_BITS)-1];
18initial $readmemh("rom.hex", rom);
19
20bit [ROM_BITS-1:0] addr;
21
22bit rx_ready;
23bit rx_valid;
24bit [7:0] rx_data;
25
26bit tx_ready;
27bit tx_valid;
28bit [7:0] tx_data;
29
30jtag_uart
31 #( .INSTANCE(0)
32 ) uart0
33 ( .clk(clk)
34 , .reset(reset)
35
36 , .rx_ready(rx_ready)
37 , .rx_valid(rx_valid) `define rx_valid `past(rx_valid)
38 , .rx_data(rx_data) `define rx_data `past(rx_data)
39
40 , .tx_ready(tx_ready) `define tx_ready `past(tx_ready)
41 , .tx_valid(tx_valid)
42 , .tx_data(tx_data)
43 );
44
45bit fib_ready;
46bit fib_valid;
47bit [FIB_BITS-1:0] fib_data;
48
49fibseq
50 #( .BITS(FIB_BITS)
51 ) fib
52 ( .clk(clk)
53 , .reset(reset)
54
55 , .ready(fib_ready)
56 , .valid(fib_valid)
57 , .data(fib_data)
58 );
59
60bit fib_a_ready;
61bit fib_a_valid;
62bit [7:0] fib_a_data;
63
64ntoa
65 #( .BITS(FIB_BITS)
66 , .BASE(FIB_BASE)
67 , .DIGITS(FIB_DIGITS)
68 ) fib_ntoa
69 ( .clk(clk)
70 , .reset(reset)
71
72 , .n_ready(fib_ready)
73 , .n_valid(fib_valid)
74 , .n_data(fib_data)
75
76 , .a_ready(fib_a_ready)
77 , .a_valid(fib_a_valid) `define fib_a_valid `past(fib_a_valid)
78 , .a_data(fib_a_data) `define fib_a_data `past(fib_a_data)
79 );
80
81enum
82 { INTRO_ECHO
83 , ECHO
84 , INTRO_FIB
85 , FIB
86 } state;
87
88bit tmp_valid;
89bit [7:0] tmp_data;
90
91always_ff @(posedge clk) begin
92 if (reset) begin
93 addr = 0;
94 rx_ready = 0;
95 tx_valid = 0;
96 fib_a_ready = 0;
97 state = state.first;
98 tmp_valid = 0;
99 end else case (state)
100
101 INTRO_ECHO, INTRO_FIB: begin
102 automatic bit [7:0] data = rom[addr];
103 if (`tx_ready) tx_valid = 0;
104 if (!tx_valid && (data != 0)) begin
105 tx_valid = 1;
106 tx_data = data;
107 ++addr;
108 end else if (data == 0) begin
109 ++addr;
110 state = state.next;
111 end
112 end
113
114 ECHO: begin
115 if (`tx_ready && tx_valid && tx_data == "\n") begin
116 // FIXME race; we aren't going to consume input this cycle, but we might have tmp_valid or rx_ready asserted
117 rx_ready = 0;
118 tx_valid = 0;
119 state = INTRO_FIB;
120 end else begin
121 if (`tx_ready) tx_valid = 0;
122 if (rx_ready && `rx_valid) begin
123 tmp_valid = 1;
124 tmp_data = `rx_data;
125 end
126 if (!tx_valid && tmp_valid) begin
127 tx_valid = 1;
128 tx_data = tmp_data;
129 tmp_valid = 0;
130 end
131 rx_ready = !tmp_valid;
132 end
133 end
134
135 FIB: begin
136 if (`tx_ready) tx_valid = 0;
137 if (fib_a_ready && `fib_a_valid) begin
138 tmp_valid = 1;
139 tmp_data = `fib_a_data;
140 end
141 if (!tx_valid && tmp_valid) begin
142 tx_valid = 1;
143 tx_data = tmp_data;
144 tmp_valid = 0;
145 end
146 fib_a_ready = !tmp_valid;
147 end
148
149 endcase
150end
151
152endmodule