网络数据接口主要基于AXI_Stream
接口,该接口主要包含5个主要的信号:
tdata
:待传输数据,位宽可变,可支持8bits ~ 64bits。
tkeep
:指定tdata
中具体位置的字节是否有效。tdata
为16bits,则tkeep
为2bits,高位对应高字节,低位对应低字节。tkeep
某一位为1则表示tdata
对应位字节有效,否则无效。
tvalid
:数据有效信号,由主机(master
)侧发起,该信号有效表示主机待发送数据有效。
tready
:接收有效信号,由从机(slave
)侧发起,该信号有效表示从机可以接收该数据。
tlast
:最后一个数据信号,常用于传输一帧数据中,该信号有效表示对应的数据为该数据帧中的最后一个数据。
tvalid
与tready
为握手信号,当两者同时有效时传输一次数据。数据在 AXI-Stream
接口的时钟信号上升沿传输。
具体传输数据波形图如下。传输两次数据,在tvalid
与tready
同时有效时、clk上升沿完成一次传输。tlast
为高表示D1
为最后一个数据。tuser
为用户自定义信号。
__ __ __ __ __ __ __ __ __
clk __/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__
_____ _________________
tdata XXXXXXXXX_D0__X_D1______________XXXXXXXXXXXXXXXXXXXXXXXX
_____ _________________
tkeep XXXXXXXXX_K0__X_K1______________XXXXXXXXXXXXXXXXXXXXXXXX
_______________________
tvalid ________/ \_______________________
______________ _____ ___________
tready \___________/ \___________/
_________________
tlast ______________/ \_______________________
tuser ________________________________________________________
本设计中以太网数据传输主要需要操作以下几个信号:
tx_udp_payload_axis_tdata
:待发送数据,位宽自定义,目前为8bits。
tx_udp_payload_axis_tvaild
:待发送数据有效信号,每发送一次数据,保持该信号为高电平。
tx_udp_payload_axis_tlast
:帧数据结束信号,当发送一帧数据中的最后一个数据时,将该信号置为有效。
tx_udp_payload_axis_tuser
:用户信号,可以不操作。
tx_udp_hdr_valid
:发送udp帧头数据。
具体传输过程如下。需要先将hdr_valid(tx_udp_hdr_valid)
置为有效以发送帧头部数据,待头部数据发送完成后在根据tvalid(tx_udp_payload_axis_tvaild)
和tready(tx_udp_payload_axis_tready)
信号发送待传输数据。
__ __ __ __ __ __ __
clk __/ \__/ \__/ \__/ \__/ \__/ \__/ \__
______________ ___________
hdr_ready \_________________/
_____
hdr_valid ________/ \_____________________________
_____
hdr_data XXXXXXXXX_HDR_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
___________ _____ _____
tdata XXXXXXXXX_A0________X_A1__X_A2__XXXXXXXXXXXX
___________ _____ _____
tkeep XXXXXXXXX_K0________X_K1__X_K2__XXXXXXXXXXXX
_______________________
tvalid ________/ \___________
_________________
tready ______________/ \___________
_____
tlast __________________________/ \___________
tuser ____________________________________________
另外以太网数据帧包含的mac地址
、ip地址
、端口
、数据长度
等参数都需要在发送前指定好。本次测试设置参数如下:
local_mac
:48'h02_00_00_00_00_00,即02 00 00 00
.
dest_ip
:{8'd192, 8'd168, 8'd1, 8'd10},目标IP为192.168.1.10
.
source_ip
:{8'd192, 8'd168, 8'd1, 8'd128},本机IP为192.168.1.128
.
source_port
:5000。必须指定,否则内部无法知道源端口。
dest_port
:8080。必须制定,否则内部无法知道目标端口。
tx_udp_length
:数据长度,这里为21。
测试时由于ADC采样模块损坏无法使用,因此只用了固定长度的数据组进行发送。设定数据组长度为21,即从A
到U
,采用ASCII码发送。板卡设定发送端口为192.168.1.128:5000
,接收端口为192.168.1.10:8080
,接收结果如下。上位机端基本上每1ms
接收一次数据,基本达到操作系统数据处理的上限,因此测试时会有软件卡死的问题。
本文章使用limfx的vscode插件快速发布