2021-09-04 19:33:32 +02:00
-- -------------------------------------------------------------------------- --
-- TRASHERNET - A Trashy Ethernet Stack for FPGAs --
-- -------------------------------------------------------------------------- --
-- trashernet_types.vhd : VHDL types used throughout Trashernet
-- -------------------------------------------------------------------------- --
-- Author : Markus Koch <markus@notsyncing.net>
-- Contributors : None
-- License : Mozilla Public License (MPL) Version 2
-- -------------------------------------------------------------------------- --
2021-08-31 20:35:15 +02:00
library ieee ;
use ieee.std_logic_1164. all ;
2022-05-13 20:37:28 +02:00
use ieee.numeric_std. all ;
2021-08-31 20:35:15 +02:00
2021-09-25 11:07:12 +02:00
package trashernet_pkg is
2021-09-25 16:18:02 +02:00
-- General types
2021-08-31 20:35:15 +02:00
subtype byte is std_logic_vector ( 7 downto 0 ) ;
type byte_vector is array ( natural range < > ) of byte ;
2021-09-25 16:18:02 +02:00
-- MAC specific types
2021-08-31 20:35:15 +02:00
subtype mac_addr_t is byte_vector ( 0 to 5 ) ;
2022-10-28 18:52:17 +02:00
constant MAC_ADDR_BROADCAST : mac_addr_t : = ( others = > x"FF" ) ;
2022-05-15 14:45:06 +02:00
function mac_to_string ( constant mac_address : in mac_addr_t ) return string ;
2021-08-31 20:35:15 +02:00
subtype ethertype_t is byte_vector ( 0 to 1 ) ;
2021-09-25 11:20:26 +02:00
type mac_header_fields is record
2021-09-25 12:28:04 +02:00
mac_destination : mac_addr_t ; -- Destination MAC address
mac_source : mac_addr_t ; -- Source MAC address
mac_ethertype : ethertype_t ; -- Ethertype or length
2021-09-25 11:20:26 +02:00
end record mac_header_fields ;
2021-09-25 12:28:04 +02:00
2021-09-25 16:18:02 +02:00
-- IP specific types
subtype ip_addr_t is byte_vector ( 0 to 3 ) ;
2022-05-15 14:45:06 +02:00
function ip_to_string ( constant ip_address : in ip_addr_t ) return string ;
2021-09-25 16:18:02 +02:00
2022-05-13 20:36:52 +02:00
-- Configuration interface
type configuration_t is record
mac_address : mac_addr_t ; -- MAC address of this node
end record configuration_t ;
2022-10-30 22:32:47 +01:00
type ipv4_configuration_t is record
ip_address : ip_addr_t ; -- IP address of this node
gateway : ip_addr_t ; -- Peer to use when target is outside of subnet
subnet_mask : ip_addr_t ; -- Subnet mask of this node
end record ipv4_configuration_t ;
2022-05-13 20:36:52 +02:00
2021-09-25 12:28:04 +02:00
-- PHY interface
type phy_in_t is record
tx_data : byte ; -- TX Data
tx_data_en : std_logic ; -- Transmitter enable
end record phy_in_t ;
type phy_out_t is record
rx_data : byte ; -- RX Data
rx_data_valid : std_logic ; -- RX Data valid
rx_active : std_logic ; -- RX of packet in progress
tx_data_ack : std_logic ; -- Latched data_tx
tx_active : std_logic ; -- Transmission in progress
carrier_detect : std_logic ; -- Carrier detected
rx_error : std_logic ; -- Receive error
end record phy_out_t ;
2021-09-25 16:18:02 +02:00
-- MAC interface
type mac_in_t is record
tx_header : mac_header_fields ; -- TX MAC Header Data
tx_mac_data : byte ; -- Payload
tx_mac_data_en : std_logic ; -- Start (and keep) transmitting a frame
end record mac_in_t ;
type mac_out_t is record
rx_header : mac_header_fields ; -- RX MAC Header Data
rx_mac_header_rcv : std_logic ; -- `rx_mac` header have been received and are valid
rx_mac_data : byte ; -- Ethernet data (after Ethertype)
rx_mac_valid : std_logic ; -- `rx_mac` values (headers + data) are valid
tx_mac_data_ack : std_logic ; -- The byte on `tx_mac_data` has been latched. Update to next word.
2022-01-16 13:44:33 +01:00
tx_active : std_logic ; -- Transmission in progress
2021-09-25 16:18:02 +02:00
rx_mac_crc_ok : std_logic ; -- End of packet, CRC OK (strobe independent from other rx_mac fields)
rx_mac_crc_error : std_logic ; -- End of packet, CRC invalid
end record mac_out_t ;
2022-05-13 20:37:28 +02:00
-- MAC ETH interface
type ethernet_ii_protocol_t is record
ethertype : ethertype_t ;
end record ;
type ethernet_ii_protocol_vector is array ( natural range < > ) of ethernet_ii_protocol_t ;
2022-10-30 17:29:14 +01:00
constant ETHERNET_II_PROTOCOLS_NONE : ethernet_ii_protocol_vector ( 0 to - 1 ) : = ( others = > ( ethertype = > ( x"00" , x"00" ) ) ) ; -- @suppress "Null range": We want a NULL vector here to remove the logic
2022-10-30 22:32:47 +01:00
constant ETHERNET_II_PROTOCOL_IPV4 : ethernet_ii_protocol_t : = ( ethertype = > ( x"08" , x"00" ) ) ;
2022-05-13 20:37:28 +02:00
constant ETHERNET_II_PROTOCOL_ARP : ethernet_ii_protocol_t : = ( ethertype = > ( x"08" , x"06" ) ) ;
type ethernet_i_out_t is record
rx_mac_address : mac_addr_t ; -- Source MAC address
rx_crc_ok : std_logic ; -- End of packet, CRC OK
rx_crc_error : std_logic ; -- End of packet, CRC invalid
rx_data : byte ; -- RX data
rx_data_valid : std_logic ; -- RX data valid strobe
rx_length : unsigned ( 15 downto 0 ) ; -- RX payload length in bytes
rx_header_rcv : std_logic ; -- Start of reception, `rx_length` is valid
tx_data_ack : std_logic ; -- Give next data byte or disable `tx_en`
end record ;
type ethernet_i_in_t is record
tx_mac_address : mac_addr_t ; -- Destination MAC address
tx_data : byte ; -- TX data
tx_en : std_logic ; -- Start and continue transmitting
tx_length : unsigned ( 15 downto 0 ) ; -- TX payload length in bytes
end record ;
constant ETHERNET_I_IN_UNUSED : ethernet_i_in_t : = ( tx_mac_address = > ( others = > x"00" ) , tx_data = > x"00" , tx_length = > x"0000" , others = > '0' ) ; -- TODO
type ethernet_ii_out_t is record
rx_mac_address : mac_addr_t ; -- Source MAC address
rx_data : byte ; -- RX data
rx_data_valid : std_logic ; -- RX data valid strobe
rx_crc_ok : std_logic ; -- End of packet, CRC OK
rx_crc_error : std_logic ; -- End of packet, CRC invalid
rx_header_rcv : std_logic ; -- Start of reception
tx_data_ack : std_logic ; -- Give next data byte or disable `tx_en`
end record ;
type ethernet_ii_in_t is record
tx_mac_address : mac_addr_t ; -- Destination MAC address
tx_data : byte ; -- TX data
tx_en : std_logic ; -- Start and continue transmitting
end record ;
type ethernet_ii_out_vector is array ( natural range < > ) of ethernet_ii_out_t ;
type ethernet_ii_in_vector is array ( natural range < > ) of ethernet_ii_in_t ;
constant ETHERNET_II_IN_UNUSED : ethernet_ii_in_t : = ( tx_mac_address = > ( others = > x"00" ) , tx_data = > x"00" , others = > '0' ) ;
2022-05-15 14:45:06 +02:00
2022-10-30 22:32:47 +01:00
-- ARP interface
2022-05-15 14:45:06 +02:00
type arp_out_t is record
arp_mac : mac_addr_t ; -- Resulting MAC address for query
arp_ok_stb : std_logic ; -- ARP request successful, `arp_mac` valid
arp_fail_stb : std_logic ; -- ARP request failed, `arp_mac` invalid
end record arp_out_t ;
type arp_in_t is record
arp_ip : ip_addr_t ; -- IP address to query
arp_query_stb : std_logic ; -- Request MAC for IP
end record arp_in_t ;
2022-10-30 22:32:47 +01:00
-- IPv4 interface
subtype ipv4_protocol is byte ;
type ipv4_protocol_vector is array ( natural range < > ) of ipv4_protocol ;
constant IPV4_PROTOCOL_ICMP : ipv4_protocol : = x"01" ;
constant IPV4_PROTOCOL_TCP : ipv4_protocol : = x"06" ;
constant IPV4_PROTOCOL_UDP : ipv4_protocol : = x"11" ;
2022-10-31 23:46:46 +01:00
subtype ipv4_length is unsigned ( 15 downto 0 ) ;
2022-10-30 22:32:47 +01:00
type ipv4_out_t is record
rx_ip_address : ip_addr_t ; -- Source IP address
rx_protocol : ipv4_protocol ; -- Transport Protocol
2022-11-01 16:22:59 +01:00
rx_length : ipv4_length ; -- Telegram length (excluding header)
2022-10-30 22:32:47 +01:00
rx_data : byte ; -- RX data
rx_data_valid : std_logic ; -- RX data valid strobe
rx_ok_stb : std_logic ; -- End of packet, checksum OK
rx_error_stb : std_logic ; -- End of packet, checksum invalid
rx_header_rcv : std_logic ; -- Start of reception (`rx_ip_address` and `rx_protocol` are valid)
tx_data_ack : std_logic ; -- Give next data byte of disable `tx_en`
tx_ok_stb : std_logic ; -- Transmission successful
tx_err_stb : std_logic ; -- Transmission failed
end record ipv4_out_t ;
type ipv4_in_t is record
tx_ip_address : ip_addr_t ; -- Destination IP address
tx_protocol : ipv4_protocol ; -- Transport Protocol
2022-10-31 23:46:46 +01:00
tx_length : ipv4_length ; -- Length of payload
2022-10-30 22:32:47 +01:00
tx_data : byte ; -- TX data
tx_en : std_logic ; -- Start and continue transmitting
end record ipv4_in_t ;
type ipv4_protocol_out_t is record
rx_ip_address : ip_addr_t ; -- Source IP address
2022-11-01 16:22:59 +01:00
rx_length : ipv4_length ; -- Telegram length (excluding header)
2022-10-30 22:32:47 +01:00
rx_data : byte ; -- RX data
rx_data_valid : std_logic ; -- RX data valid strobe
2022-10-31 16:57:54 +01:00
rx_ok_stb : std_logic ; -- End of packet, checksum OK
2022-10-30 22:32:47 +01:00
rx_error_stb : std_logic ; -- End of packet, checksum invalid
2022-10-31 16:57:54 +01:00
rx_header_rcv : std_logic ; -- Start of reception
2022-10-30 22:32:47 +01:00
tx_data_ack : std_logic ; -- Give next data byte of disable `tx_en`
tx_ok_stb : std_logic ; -- Transmission successful
tx_err_stb : std_logic ; -- Transmission failed
end record ipv4_protocol_out_t ;
type ipv4_protocol_in_t is record
tx_ip_address : ip_addr_t ; -- Destination IP address
2022-10-31 23:46:46 +01:00
tx_length : ipv4_length ; -- Length of payload
2022-10-30 22:32:47 +01:00
tx_data : byte ; -- TX data
tx_en : std_logic ; -- Start and continue transmitting
end record ipv4_protocol_in_t ;
type ipv4_protocol_out_vector is array ( natural range < > ) of ipv4_protocol_out_t ;
type ipv4_protocol_in_vector is array ( natural range < > ) of ipv4_protocol_in_t ;
-- General helper functions
function to_std_logic ( constant bool : boolean ) return std_logic ;
2021-09-25 11:07:12 +02:00
end package trashernet_pkg ;
2021-08-31 20:35:15 +02:00
2021-09-25 11:07:12 +02:00
package body trashernet_pkg is
2022-05-15 14:45:06 +02:00
function mac_to_string ( constant mac_address : in mac_addr_t ) return string is
begin
return --
to_hstring ( mac_address ( 0 ) ) & ":" & --
to_hstring ( mac_address ( 1 ) ) & ":" & --
to_hstring ( mac_address ( 2 ) ) & ":" & --
to_hstring ( mac_address ( 3 ) ) & ":" & --
to_hstring ( mac_address ( 4 ) ) & ":" & --
to_hstring ( mac_address ( 5 ) ) --
;
end function mac_to_string ;
function ip_to_string ( constant ip_address : in ip_addr_t ) return string is
begin
return --
to_string ( to_integer ( unsigned ( ip_address ( 0 ) ) ) ) & "." & --
to_string ( to_integer ( unsigned ( ip_address ( 1 ) ) ) ) & "." & --
to_string ( to_integer ( unsigned ( ip_address ( 2 ) ) ) ) & "." & --
to_string ( to_integer ( unsigned ( ip_address ( 3 ) ) ) ) --
;
end function ip_to_string ;
2022-10-30 22:32:47 +01:00
function to_std_logic ( constant bool : boolean ) return std_logic is
variable ret : std_logic ;
begin
ret : = '1' when bool else '0' ;
return ret ;
end function to_std_logic ;
2021-09-25 11:07:12 +02:00
end package body trashernet_pkg ;