Stefan Schuermans commited on 2012-03-24 16:42:53
Showing 12 changed files, with 82 additions and 85 deletions.
| ... | ... |
@@ -30,24 +30,24 @@ struct arp_table |
| 30 | 30 |
*/ |
| 31 | 31 |
static void arp_send_request(unsigned char ip[4]) |
| 32 | 32 |
{
|
| 33 |
- struct arp_packet_pad arp_request; |
|
| 33 |
+ struct arp_packet arp_request; |
|
| 34 | 34 |
|
| 35 | 35 |
// build ARP request |
| 36 |
- arp_request.p.arp_hdr.hw_type = htons(0x0001); // ethernet |
|
| 37 |
- arp_request.p.arp_hdr.proto_type = htons(0x0800); // IP |
|
| 38 |
- arp_request.p.arp_hdr.hw_len = 0x06; // length of a MAC address |
|
| 39 |
- arp_request.p.arp_hdr.proto_len = 0x04; // length of an IP address |
|
| 40 |
- arp_request.p.arp_hdr.op = htons(0x0001); // ARP request |
|
| 41 |
- mac_cpy(arp_request.p.arp_hdr.src_mac, config_mac.mac); // own MAC |
|
| 42 |
- ip_cpy(arp_request.p.arp_hdr.src_ip, config_ip.ip); // own IP |
|
| 43 |
- mac_cpy(arp_request.p.arp_hdr.dest_mac, |
|
| 36 |
+ arp_request.arp_hdr.hw_type = htons(0x0001); // ethernet |
|
| 37 |
+ arp_request.arp_hdr.proto_type = htons(0x0800); // IP |
|
| 38 |
+ arp_request.arp_hdr.hw_len = 0x06; // length of a MAC address |
|
| 39 |
+ arp_request.arp_hdr.proto_len = 0x04; // length of an IP address |
|
| 40 |
+ arp_request.arp_hdr.op = htons(0x0001); // ARP request |
|
| 41 |
+ mac_cpy(arp_request.arp_hdr.src_mac, config_mac.mac); // own MAC |
|
| 42 |
+ ip_cpy(arp_request.arp_hdr.src_ip, config_ip.ip); // own IP |
|
| 43 |
+ mac_cpy(arp_request.arp_hdr.dest_mac, |
|
| 44 | 44 |
"\xFF\xFF\xFF\xFF\xFF\xFF"); // broadcast MAC |
| 45 |
- ip_cpy(arp_request.p.arp_hdr.dest_ip, ip); // requested IP |
|
| 45 |
+ ip_cpy(arp_request.arp_hdr.dest_ip, ip); // requested IP |
|
| 46 | 46 |
|
| 47 | 47 |
// send ARP request |
| 48 |
- mac_cpy(arp_request.p.eth_hdr.dest, arp_request.p.arp_hdr.dest_mac); |
|
| 49 |
- arp_request.p.eth_hdr.type = htons(0x0806); // ethernet packet type: ARP |
|
| 50 |
- ethernet_send(&arp_request.p, sizeof(arp_request.p)); |
|
| 48 |
+ mac_cpy(arp_request.eth_hdr.dest, arp_request.arp_hdr.dest_mac); |
|
| 49 |
+ arp_request.eth_hdr.type = htons(0x0806); // ethernet packet type: ARP |
|
| 50 |
+ ethernet_send(&arp_request, sizeof(arp_request)); |
|
| 51 | 51 |
} |
| 52 | 52 |
|
| 53 | 53 |
/// initialize |
| ... | ... |
@@ -116,26 +116,26 @@ void arp_recv(void *ptr, unsigned int sz) |
| 116 | 116 |
// ARP request for own IP address |
| 117 | 117 |
if (arp_pack->arp_hdr.op == htons(0x0001) && // ARP request |
| 118 | 118 |
ip_eq(arp_pack->arp_hdr.dest_ip, config_ip.ip)) { // own IP address
|
| 119 |
- struct arp_packet_pad arp_reply; |
|
| 119 |
+ struct arp_packet arp_reply; |
|
| 120 | 120 |
|
| 121 | 121 |
// build ARP reply |
| 122 |
- arp_reply.p.arp_hdr.hw_type = htons(0x0001); // ethernet |
|
| 123 |
- arp_reply.p.arp_hdr.proto_type = htons(0x0800); // IP |
|
| 124 |
- arp_reply.p.arp_hdr.hw_len = 0x06; // length of a MAC address |
|
| 125 |
- arp_reply.p.arp_hdr.proto_len = 0x04; // length of an IP address |
|
| 126 |
- arp_reply.p.arp_hdr.op = htons(0x0002); // ARP reply |
|
| 127 |
- mac_cpy(arp_reply.p.arp_hdr.src_mac, config_mac.mac); // own MAC |
|
| 128 |
- ip_cpy(arp_reply.p.arp_hdr.src_ip, config_ip.ip); // own IP |
|
| 129 |
- mac_cpy(arp_reply.p.arp_hdr.dest_mac, |
|
| 122 |
+ arp_reply.arp_hdr.hw_type = htons(0x0001); // ethernet |
|
| 123 |
+ arp_reply.arp_hdr.proto_type = htons(0x0800); // IP |
|
| 124 |
+ arp_reply.arp_hdr.hw_len = 0x06; // length of a MAC address |
|
| 125 |
+ arp_reply.arp_hdr.proto_len = 0x04; // length of an IP address |
|
| 126 |
+ arp_reply.arp_hdr.op = htons(0x0002); // ARP reply |
|
| 127 |
+ mac_cpy(arp_reply.arp_hdr.src_mac, config_mac.mac); // own MAC |
|
| 128 |
+ ip_cpy(arp_reply.arp_hdr.src_ip, config_ip.ip); // own IP |
|
| 129 |
+ mac_cpy(arp_reply.arp_hdr.dest_mac, |
|
| 130 | 130 |
arp_pack->arp_hdr.src_mac); // requestor's MAC |
| 131 |
- ip_cpy(arp_reply.p.arp_hdr.dest_ip, |
|
| 131 |
+ ip_cpy(arp_reply.arp_hdr.dest_ip, |
|
| 132 | 132 |
arp_pack->arp_hdr.src_ip); // requestor's IP |
| 133 | 133 |
|
| 134 | 134 |
// send ARP reply |
| 135 |
- mac_cpy(arp_reply.p.eth_hdr.dest, |
|
| 136 |
- arp_reply.p.arp_hdr.dest_mac); // ethernet destination address |
|
| 137 |
- arp_reply.p.eth_hdr.type = htons(0x0806); // ethernet packet type: ARP |
|
| 138 |
- ethernet_send(&arp_reply.p, sizeof(arp_reply.p)); |
|
| 135 |
+ mac_cpy(arp_reply.eth_hdr.dest, |
|
| 136 |
+ arp_reply.arp_hdr.dest_mac); // ethernet destination address |
|
| 137 |
+ arp_reply.eth_hdr.type = htons(0x0806); // ethernet packet type: ARP |
|
| 138 |
+ ethernet_send(&arp_reply, sizeof(arp_reply)); |
|
| 139 | 139 |
|
| 140 | 140 |
return; |
| 141 | 141 |
} |
| ... | ... |
@@ -116,7 +116,7 @@ int eth_rx(void **pptr, unsigned int *psz) |
| 116 | 116 |
*/ |
| 117 | 117 |
void eth_tx(const void *ptr, unsigned int sz) |
| 118 | 118 |
{
|
| 119 |
- while(sz < 60 || sz & 3) /* pad with zeros */ |
|
| 119 |
+ while(sz & 3) /* pad with zeros */ |
|
| 120 | 120 |
((unsigned char *)ptr)[sz++] = 0; |
| 121 | 121 |
eth_ptr[8] = (unsigned int)ptr; /* start */ |
| 122 | 122 |
eth_ptr[9] = (unsigned int)ptr + sz; /* end */ |
| ... | ... |
@@ -46,7 +46,7 @@ void ethernet_recv(void *ptr, unsigned int sz) |
| 46 | 46 |
* @param[in] ptr pointer to data of packet |
| 47 | 47 |
* @param[in] sz size of packet |
| 48 | 48 |
* |
| 49 |
- * ptr must point to a ethernet_packet of sufficient size (ethernet padding) |
|
| 49 |
+ * ptr must point to a ethernet_packet |
|
| 50 | 50 |
* with eth_hdr.dest and eth_hdr.type already initialized |
| 51 | 51 |
*/ |
| 52 | 52 |
void ethernet_send(void *ptr, unsigned int sz) |
| ... | ... |
@@ -1,19 +1,6 @@ |
| 1 | 1 |
#ifndef ETHERNET_H |
| 2 | 2 |
#define ETHERNET_H |
| 3 | 3 |
|
| 4 |
-/** padding at end of packet |
|
| 5 |
- to reach next size divisible by 4 and at least 60 bytes */ |
|
| 6 |
-#define ETHERNET_PADDING_SIZE(packet) \ |
|
| 7 |
- (sizeof(struct packet) >= 60 ? 0 : 60 - sizeof(struct packet)) |
|
| 8 |
-#define ETHERNET_PADDING(packet) \ |
|
| 9 |
- unsigned char padding[ETHERNET_PADDING_SIZE(packet)] |
|
| 10 |
-#define ETHERNET_PAD(packet) \ |
|
| 11 |
- struct packet ## _pad \ |
|
| 12 |
- { \
|
|
| 13 |
- struct packet p; \ |
|
| 14 |
- ETHERNET_PADDING(packet); \ |
|
| 15 |
- } __attribute__((packed)) |
|
| 16 |
- |
|
| 17 | 4 |
/// header of ethernet packet |
| 18 | 5 |
struct ethernet_header |
| 19 | 6 |
{
|
| ... | ... |
@@ -28,9 +15,6 @@ struct ethernet_packet |
| 28 | 15 |
struct ethernet_header eth_hdr; |
| 29 | 16 |
} __attribute__((packed)); |
| 30 | 17 |
|
| 31 |
-/// ethernet packet with padding |
|
| 32 |
-ETHERNET_PAD(ethernet_packet); |
|
| 33 |
- |
|
| 34 | 18 |
/** |
| 35 | 19 |
* @brief process a received ethernet packet |
| 36 | 20 |
* @param[in] ptr pointer to data of packet |
| ... | ... |
@@ -43,7 +27,7 @@ void ethernet_recv(void *ptr, unsigned int sz); |
| 43 | 27 |
* @param[in] ptr pointer to data of packet |
| 44 | 28 |
* @param[in] sz size of packet |
| 45 | 29 |
* |
| 46 |
- * ptr must point to a ethernet_packet of sufficient size (ethernet padding) |
|
| 30 |
+ * ptr must point to a ethernet_packet |
|
| 47 | 31 |
* with eth_hdr.dest and eth_hdr.type already initialized |
| 48 | 32 |
*/ |
| 49 | 33 |
void ethernet_send(void *ptr, unsigned int sz); |
| ... | ... |
@@ -10,7 +10,7 @@ |
| 10 | 10 |
* @param[in] ptr pointer to data of packet |
| 11 | 11 |
* @param[in] sz size of packet |
| 12 | 12 |
* |
| 13 |
- * ptr must point to a icmp_packet of sufficient size (ethernet padding) |
|
| 13 |
+ * ptr must point to a icmp_packet |
|
| 14 | 14 |
* with icmp_hdr.type, icmp_hdr.code and ip_hdr.sest already initialized |
| 15 | 15 |
*/ |
| 16 | 16 |
static void icmp_send(void *ptr, unsigned int sz) |
| ... | ... |
@@ -20,9 +20,6 @@ struct icmp_packet |
| 20 | 20 |
struct icmp_header icmp_hdr; |
| 21 | 21 |
} __attribute__((packed)); |
| 22 | 22 |
|
| 23 |
-/// ICMP packet with padding |
|
| 24 |
-ETHERNET_PAD(icmp_packet); |
|
| 25 |
- |
|
| 26 | 23 |
// header of ICMP echo request/reply packet |
| 27 | 24 |
struct icmp_echo_header |
| 28 | 25 |
{
|
| ... | ... |
@@ -39,9 +36,6 @@ struct icmp_echo_packet |
| 39 | 36 |
struct icmp_echo_header echo_hdr; |
| 40 | 37 |
} __attribute__((packed)); |
| 41 | 38 |
|
| 42 |
-/// ICMP echo request/reply packet with padding |
|
| 43 |
-ETHERNET_PAD(icmp_echo_packet); |
|
| 44 |
- |
|
| 45 | 39 |
/** |
| 46 | 40 |
* @brief process a received ICMP packet |
| 47 | 41 |
* @param[in] ptr pointer to data of packet |
| ... | ... |
@@ -17,7 +17,6 @@ |
| 17 | 17 |
* - used if MAC is unknown when packet shall be transmitted |
| 18 | 18 |
* - packet is sent when MAC becomes known |
| 19 | 19 |
* - some buffers with different length (packets have different lengths) |
| 20 |
- * - all buffers must be larger than min ethernet frame size (eth padding) |
|
| 21 | 20 |
*/ |
| 22 | 21 |
//@{
|
| 23 | 22 |
unsigned int ip_buffer0[20]; |
| ... | ... |
@@ -185,7 +184,7 @@ void ip_recv(void *ptr, unsigned int sz) |
| 185 | 184 |
* @param[in] ptr pointer to data of packet |
| 186 | 185 |
* @param[in] sz size of packet |
| 187 | 186 |
* |
| 188 |
- * ptr must point to a ip_packet of sufficient size (ethernet padding) |
|
| 187 |
+ * ptr must point to a ip_packet |
|
| 189 | 188 |
* with ip_hdr.proto and ip_hdr.dest already initialized |
| 190 | 189 |
*/ |
| 191 | 190 |
void ip_send(void *ptr, unsigned int sz) |
| ... | ... |
@@ -25,9 +25,6 @@ struct ip_packet |
| 25 | 25 |
struct ip_header ip_hdr; |
| 26 | 26 |
} __attribute__((packed)); |
| 27 | 27 |
|
| 28 |
-/// IP packet with padding |
|
| 29 |
-ETHERNET_PAD(ip_packet); |
|
| 30 |
- |
|
| 31 | 28 |
/// initialize |
| 32 | 29 |
void ip_init(void); |
| 33 | 30 |
|
| ... | ... |
@@ -46,7 +43,7 @@ void ip_recv(void *ptr, unsigned int sz); |
| 46 | 43 |
* @param[in] ptr pointer to data of packet |
| 47 | 44 |
* @param[in] sz size of packet |
| 48 | 45 |
* |
| 49 |
- * ptr must point to a ip_packet of sufficient size (ethernet padding) |
|
| 46 |
+ * ptr must point to a ip_packet |
|
| 50 | 47 |
* with ip_hdr.proto and ip_hdr.dest already initialized |
| 51 | 48 |
*/ |
| 52 | 49 |
void ip_send(void *ptr, unsigned int sz); |
| ... | ... |
@@ -29,7 +29,7 @@ void udp_recv(void *ptr, unsigned int sz) |
| 29 | 29 |
* @param[in] ptr pointer to data of packet |
| 30 | 30 |
* @param[in] sz size of packet |
| 31 | 31 |
* |
| 32 |
- * ptr must point to a udp_packet of sufficient size (ethernet padding) |
|
| 32 |
+ * ptr must point to a udp_packet |
|
| 33 | 33 |
* with ip_hdr.proto and udp_hdr.src_port, udp_hdr.dest_port, ip_hdr.dest |
| 34 | 34 |
* already initialized |
| 35 | 35 |
*/ |
| ... | ... |
@@ -21,9 +21,6 @@ struct udp_packet |
| 21 | 21 |
struct udp_header udp_hdr; |
| 22 | 22 |
} __attribute__((packed)); |
| 23 | 23 |
|
| 24 |
-/// UDP packet with padding |
|
| 25 |
-ETHERNET_PAD(udp_packet); |
|
| 26 |
- |
|
| 27 | 24 |
/// tick procedure - call every 200ms |
| 28 | 25 |
void udp_tick200(void); |
| 29 | 26 |
|
| ... | ... |
@@ -39,7 +36,7 @@ void udp_recv(void *ptr, unsigned int sz); |
| 39 | 36 |
* @param[in] ptr pointer to data of packet |
| 40 | 37 |
* @param[in] sz size of packet |
| 41 | 38 |
* |
| 42 |
- * ptr must point to a udp_packet of sufficient size (ethernet padding) |
|
| 39 |
+ * ptr must point to a udp_packet |
|
| 43 | 40 |
* with ip_hdr.proto and udp_hdr.src_port, udp_hdr.dest_port, ip_hdr.dest |
| 44 | 41 |
* already initialized |
| 45 | 42 |
*/ |
| ... | ... |
@@ -19,9 +19,11 @@ END ENTITY e_io_eth_txframe; |
| 19 | 19 |
|
| 20 | 20 |
ARCHITECTURE a_io_eth_txframe OF e_io_eth_txframe IS |
| 21 | 21 |
|
| 22 |
- TYPE t_state IS (st_idle, st_sync, st_start, st_data, st_crc, st_gap); |
|
| 22 |
+ TYPE t_state IS (st_idle, st_sync, st_start, st_data, |
|
| 23 |
+ st_pad, st_crc, st_gap); |
|
| 23 | 24 |
|
| 24 |
- SUBTYPE t_data_cnt IS natural RANGE 0 TO 255; |
|
| 25 |
+ SUBTYPE t_data_cnt IS natural RANGE 0 TO 3; |
|
| 26 |
+ SUBTYPE t_byte_cnt IS natural RANGE 0 TO 255; |
|
| 25 | 27 |
|
| 26 | 28 |
SIGNAL r_state: t_state := st_idle; |
| 27 | 29 |
SIGNAL n_state: t_state; |
| ... | ... |
@@ -29,6 +31,8 @@ ARCHITECTURE a_io_eth_txframe OF e_io_eth_txframe IS |
| 29 | 31 |
SIGNAL n_data_cnt: t_data_cnt; |
| 30 | 32 |
SIGNAL r_data: std_logic_vector(31 DOWNTO 0) := (OTHERS => '0'); |
| 31 | 33 |
SIGNAL n_data: std_logic_vector(31 DOWNTO 0); |
| 34 |
+ SIGNAL r_byte_cnt: t_byte_cnt := 0; |
|
| 35 |
+ SIGNAL n_byte_cnt: t_byte_cnt; |
|
| 32 | 36 |
SIGNAL r_crc_start: std_logic := '0'; |
| 33 | 37 |
SIGNAL n_crc_start: std_logic; |
| 34 | 38 |
|
| ... | ... |
@@ -60,7 +64,7 @@ BEGIN |
| 60 | 64 |
o_crc => s_crc_crc |
| 61 | 65 |
); |
| 62 | 66 |
|
| 63 |
- p_next: PROCESS(r_state, r_data_cnt, r_data, r_crc_start, |
|
| 67 |
+ p_next: PROCESS(r_state, r_data_cnt, r_data, r_byte_cnt, r_crc_start, |
|
| 64 | 68 |
i_if_data_ack, |
| 65 | 69 |
i_frame_en, i_frame_data, i_frame_data_en, |
| 66 | 70 |
s_crc_crc) |
| ... | ... |
@@ -69,6 +73,7 @@ BEGIN |
| 69 | 73 |
n_state <= r_state; |
| 70 | 74 |
n_data_cnt <= r_data_cnt; |
| 71 | 75 |
n_data <= r_data; |
| 76 |
+ n_byte_cnt <= r_byte_cnt; |
|
| 72 | 77 |
n_crc_start <= '0'; |
| 73 | 78 |
o_if_data <= X"00"; |
| 74 | 79 |
o_if_data_en <= '0'; |
| ... | ... |
@@ -81,14 +86,14 @@ BEGIN |
| 81 | 86 |
WHEN st_idle => |
| 82 | 87 |
IF i_frame_en = '1' THEN |
| 83 | 88 |
n_state <= st_sync; |
| 84 |
- n_data_cnt <= 7; |
|
| 89 |
+ n_byte_cnt <= 0; |
|
| 85 | 90 |
END IF; |
| 86 | 91 |
WHEN st_sync => |
| 87 | 92 |
IF i_if_data_ack = '1' THEN |
| 88 |
- IF r_data_cnt = 1 THEN |
|
| 93 |
+ IF r_byte_cnt = 6 THEN |
|
| 89 | 94 |
n_state <= st_start; |
| 90 | 95 |
ELSE |
| 91 |
- n_data_cnt <= r_data_cnt - 1; |
|
| 96 |
+ n_byte_cnt <= r_byte_cnt + 1; |
|
| 92 | 97 |
END IF; |
| 93 | 98 |
END IF; |
| 94 | 99 |
o_if_data <= X"55"; |
| ... | ... |
@@ -97,62 +102,84 @@ BEGIN |
| 97 | 102 |
IF i_if_data_ack = '1' THEN |
| 98 | 103 |
IF i_frame_data_en = '1' THEN |
| 99 | 104 |
n_state <= st_data; |
| 100 |
- n_data_cnt <= 4; |
|
| 105 |
+ n_data_cnt <= 0; |
|
| 101 | 106 |
n_data <= i_frame_data; |
| 107 |
+ n_byte_cnt <= 0; |
|
| 102 | 108 |
n_crc_start <= '1'; |
| 103 | 109 |
o_frame_data_ack <= '1'; |
| 104 | 110 |
ELSE |
| 105 | 111 |
n_state <= st_gap; |
| 106 |
- n_data_cnt <= 12 * 8 * 2; -- 12 octets, x2 because of clk |
|
| 112 |
+ n_byte_cnt <= 0; |
|
| 107 | 113 |
END IF; |
| 108 | 114 |
END IF; |
| 109 | 115 |
o_if_data <= X"D5"; |
| 110 | 116 |
o_if_data_en <= '1'; |
| 111 | 117 |
WHEN st_data => |
| 112 | 118 |
IF i_if_data_ack = '1' THEN |
| 113 |
- IF r_data_cnt = 1 THEN |
|
| 119 |
+ IF r_data_cnt = 3 THEN |
|
| 114 | 120 |
IF i_frame_data_en = '1' THEN |
| 115 | 121 |
n_state <= st_data; |
| 116 |
- n_data_cnt <= 4; |
|
| 122 |
+ n_data_cnt <= 0; |
|
| 117 | 123 |
n_data <= i_frame_data; |
| 118 | 124 |
o_frame_data_ack <= '1'; |
| 119 | 125 |
ELSE |
| 126 |
+ IF r_byte_cnt = 59 THEN |
|
| 120 | 127 |
n_state <= st_crc; |
| 121 |
- n_data_cnt <= 4; |
|
| 128 |
+ n_data_cnt <= 0; |
|
| 129 |
+ ELSE |
|
| 130 |
+ n_state <= st_pad; |
|
| 131 |
+ END IF; |
|
| 122 | 132 |
END IF; |
| 123 | 133 |
ELSE |
| 124 |
- n_data_cnt <= r_data_cnt - 1; |
|
| 134 |
+ n_data_cnt <= r_data_cnt + 1; |
|
| 125 | 135 |
n_data(23 DOWNTO 0) <= r_data(31 DOWNTO 8); |
| 126 | 136 |
END IF; |
| 137 |
+ IF r_byte_cnt /= 59 THEN |
|
| 138 |
+ n_byte_cnt <= r_byte_cnt + 1; |
|
| 139 |
+ END IF; |
|
| 127 | 140 |
s_crc_en <= '1'; |
| 128 | 141 |
s_crc_start <= r_crc_start; |
| 129 | 142 |
s_crc_data <= r_data(7 DOWNTO 0); |
| 130 | 143 |
END IF; |
| 131 | 144 |
o_if_data <= r_data(7 DOWNTO 0); |
| 132 | 145 |
o_if_data_en <= '1'; |
| 146 |
+ WHEN st_pad => |
|
| 147 |
+ IF i_if_data_ack = '1' THEN |
|
| 148 |
+ IF r_byte_cnt = 59 THEN |
|
| 149 |
+ n_state <= st_crc; |
|
| 150 |
+ n_data_cnt <= 0; |
|
| 151 |
+ ELSE |
|
| 152 |
+ n_byte_cnt <= r_byte_cnt + 1; |
|
| 153 |
+ END IF; |
|
| 154 |
+ s_crc_en <= '1'; |
|
| 155 |
+ s_crc_data <= (OTHERS => '0'); |
|
| 156 |
+ END IF; |
|
| 157 |
+ o_if_data <= (OTHERS => '0'); |
|
| 158 |
+ o_if_data_en <= '1'; |
|
| 133 | 159 |
WHEN st_crc => |
| 134 |
- IF r_data_cnt = 4 THEN |
|
| 160 |
+ IF r_data_cnt = 0 THEN |
|
| 135 | 161 |
v_data := s_crc_crc; -- get CRC value on first CRC byte |
| 136 | 162 |
ELSE |
| 137 | 163 |
v_data := r_data; |
| 138 | 164 |
END IF; |
| 139 | 165 |
IF i_if_data_ack = '1' THEN |
| 140 |
- IF r_data_cnt = 1 THEN |
|
| 166 |
+ IF r_data_cnt = 3 THEN |
|
| 141 | 167 |
n_state <= st_gap; |
| 142 |
- n_data_cnt <= 12 * 8 * 2; -- 12 octets, x2 because of clk |
|
| 168 |
+ n_byte_cnt <= 0; |
|
| 143 | 169 |
ELSE |
| 144 |
- n_data_cnt <= r_data_cnt - 1; |
|
| 170 |
+ n_data_cnt <= r_data_cnt + 1; |
|
| 145 | 171 |
n_data(23 DOWNTO 0) <= v_data(31 DOWNTO 8); |
| 146 | 172 |
END IF; |
| 147 | 173 |
END IF; |
| 148 | 174 |
o_if_data <= v_data(7 DOWNTO 0); |
| 149 | 175 |
o_if_data_en <= '1'; |
| 150 | 176 |
WHEN st_gap => |
| 151 |
- IF r_data_cnt = 1 THEN |
|
| 177 |
+ -- 12 octets, *2 because of clk, plus async FIFO len |
|
| 178 |
+ IF r_byte_cnt = 12 * 8 * 2 + 16 THEN |
|
| 152 | 179 |
n_state <= st_idle; |
| 153 | 180 |
o_frame_done <= '1'; |
| 154 | 181 |
ELSE |
| 155 |
- n_data_cnt <= r_data_cnt - 1; |
|
| 182 |
+ n_byte_cnt <= r_byte_cnt + 1; |
|
| 156 | 183 |
END IF; |
| 157 | 184 |
WHEN OTHERS => NULL; |
| 158 | 185 |
END CASE; |
| ... | ... |
@@ -164,11 +191,13 @@ BEGIN |
| 164 | 191 |
r_state <= st_idle; |
| 165 | 192 |
r_data_cnt <= 0; |
| 166 | 193 |
r_data <= (OTHERS => '0'); |
| 194 |
+ r_byte_cnt <= 0; |
|
| 167 | 195 |
r_crc_start <= '0'; |
| 168 | 196 |
ELSIF rising_edge(clk) THEN |
| 169 | 197 |
r_state <= n_state; |
| 170 | 198 |
r_data_cnt <= n_data_cnt; |
| 171 | 199 |
r_data <= n_data; |
| 200 |
+ r_byte_cnt <= n_byte_cnt; |
|
| 172 | 201 |
r_crc_start <= n_crc_start; |
| 173 | 202 |
END IF; |
| 174 | 203 |
END PROCESS p_sync; |
| 175 | 204 |