summaryrefslogtreecommitdiff
path: root/hdl/top.sv
diff options
context:
space:
mode:
Diffstat (limited to 'hdl/top.sv')
-rw-r--r--hdl/top.sv193
1 files changed, 193 insertions, 0 deletions
diff --git a/hdl/top.sv b/hdl/top.sv
new file mode 100644
index 0000000..babdc95
--- /dev/null
+++ b/hdl/top.sv
@@ -0,0 +1,193 @@
1module top
2 ( input bit clock
3 , input bit resetn
4
5 , output bit ramresetn
6 , output bit [1:0] ramcsn
7 , output bit ramclkp
8 , output bit ramclkn
9 , input bit ramrwds
10 , inout bit [7:0] ramdata
11 );
12
13assign ramresetn = resetn;
14assign ramclkn = !ramclkp;
15
16bit ram_data_oe;
17bit [7:0] ram_send_data;
18
19assign ramdata = ram_data_oe ? ram_send_data : 8'bZ;
20
21bit rx_ready;
22bit rx_valid;
23bit [7:0] rx_data;
24
25bit tx_ready;
26bit tx_valid;
27bit [7:0] tx_data;
28
29alt_jtag_atlantic
30 #( .INSTANCE_ID(0)
31 , .LOG2_RXFIFO_DEPTH(6)
32 , .LOG2_TXFIFO_DEPTH(6)
33 , .SLD_AUTO_INSTANCE_INDEX("NO")
34 ) jtag
35 ( .clk(clock)
36 , .rst_n(resetn)
37 , .r_dat(tx_data)
38 , .r_val(tx_valid)
39 , .r_ena(tx_ready)
40 , .t_dat(rx_data)
41 , .t_dav(rx_ready)
42 , .t_ena(rx_valid)
43 );
44
45bit input_byte_valid;
46bit [7:0] input_byte;
47
48bit [22:0] address;
49bit [7:0] data;
50bit write;
51
52bit [47:0] command;
53
54enum
55 { UART_READ_ADDRESS_OR_COMMAND
56 , UART_READ_DATA_1
57 , UART_READ_DATA_0
58 , RAM_WAIT_READY
59 , RAM_SEND_COMMAND_5
60 , RAM_SEND_COMMAND_4
61 , RAM_SEND_COMMAND_3
62 , RAM_SEND_COMMAND_2
63 , RAM_SEND_COMMAND_1
64 , RAM_SEND_COMMAND_0
65 , RAM_INIT_WAIT_DATA
66 , RAM_WAIT_DATA
67 , RAM_SENDRECV_DATA
68 , UART_WRITE_DATA_1
69 , UART_WRITE_DATA_0
70 } state;
71
72always @(posedge clock) begin
73 if (!resetn) begin
74 ramcsn[0] = 1;
75 ramcsn[1] = 1;
76 ramclkp = 0;
77 ram_data_oe = 0;
78 rx_ready = 0;
79 tx_valid = 0;
80 input_byte_valid = 0;
81 address = 0;
82 state = state.first;
83 end else begin
84 if (tx_ready) tx_valid = 0;
85 if (rx_valid && !input_byte_valid && !tx_valid) begin
86 tx_valid = 1;
87 tx_data = rx_data;
88 input_byte_valid = 1;
89 input_byte = rx_data;
90 end
91 case (state)
92 UART_READ_ADDRESS_OR_COMMAND:
93 if (input_byte_valid) begin
94 if (input_byte >= "0" && input_byte <= "9") begin
95 address = address << 4;
96 address[3:0] = input_byte - "0";
97 end else if (input_byte >= "a" && input_byte <= "f") begin
98 address = address << 4;
99 address[3:0] = input_byte - "a" + 10;
100 end else if (input_byte >= "A" && input_byte <= "F") begin
101 address = address << 4;
102 address[3:0] = input_byte - "A" + 10;
103 end else if (input_byte == "?") begin
104 write = 0;
105 command = {12'b100000000000, address[22:3], 13'b0, address[2:0]};
106 address = 0;
107 data = 0;
108 state = RAM_SEND_COMMAND_5;
109 end else if (input_byte == "=") begin
110 write = 1;
111 command = {12'b000000000000, address[22:3], 13'b0, address[2:0]};
112 address = 0;
113 data = 0;
114 state = UART_READ_DATA_1;
115 end
116 input_byte_valid = 0;
117 end
118 UART_READ_DATA_1, UART_READ_DATA_0:
119 if (input_byte_valid) begin
120 if (input_byte >= "0" && input_byte <= "9") begin
121 data = data << 4;
122 data[3:0] = input_byte - "0";
123 state = state.next;
124 end else if (input_byte >= "a" && input_byte <= "f") begin
125 data = data << 4;
126 data[3:0] = input_byte - "a" + 10;
127 state = state.next;
128 end else if (input_byte >= "A" && input_byte <= "F") begin
129 data = data << 4;
130 data[3:0] = input_byte - "A" + 10;
131 state = state.next;
132 end
133 input_byte_valid = 0;
134 end
135 RAM_WAIT_READY:
136 begin
137 ramcsn[0] = 0;
138 if (ramrwds) state = state.next;
139 end
140 RAM_SEND_COMMAND_5, RAM_SEND_COMMAND_4, RAM_SEND_COMMAND_3, RAM_SEND_COMMAND_2, RAM_SEND_COMMAND_1, RAM_SEND_COMMAND_0:
141 begin
142 ramclkp = ~ramclkp;
143 ram_data_oe = 1;
144 ram_send_data = command[47:40];
145 command = command << 8;
146 state = state.next;
147 end
148 RAM_INIT_WAIT_DATA:
149 begin
150 ramclkp = ~ramclkp;
151 ram_data_oe = 0;
152 state = state.next;
153 end
154 RAM_WAIT_DATA:
155 begin
156 ramclkp = ~ramclkp;
157 if (ramrwds) begin
158 if (write) begin
159 ram_data_oe = 1;
160 ram_send_data = data;
161 end
162 state = state.next;
163 end
164 end
165 RAM_SENDRECV_DATA:
166 begin
167 ramclkp = ~ramclkp;
168 ramcsn[0] = 1;
169 ram_data_oe = 0;
170 if (write) begin
171 state = state.first;
172 end else begin
173 data = ramdata;
174 state = UART_WRITE_DATA_1;
175 end
176 end
177 UART_WRITE_DATA_1, UART_WRITE_DATA_0:
178 if (!tx_valid) begin
179 tx_valid = 1;
180 if (data[7:4] < 10) begin
181 tx_data = data[7:4] + "0";
182 end else begin
183 tx_data = data[7:4] + "A" - 10;
184 end
185 data = data << 4;
186 state = state.next;
187 end
188 endcase
189 rx_ready = !input_byte_valid && !tx_valid;
190 end
191end
192
193endmodule