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