HPS(Hard Processor System)是Intel提供的一款高性能片上arm核。在Intel Agilex7系列开发板上,HPS是一个双核Arm Cortex-A53处理器。用户可以方便地在开发板上构建Intel Agilex SoC系统,包括HPS和FPGA。
HPS拥有3个EMAC(Ethernet Media access controller)外围设备控制器(EMAC0、EMAC1、EMAC2)。每一个接口可以在IEEE 802.3标准下,以10/100/1000Mbps的速率进行以太网数据发送和接收。EMAC接口可以配置成mii模式或者gmii模式。同时每个接口提供了配置寄存器,以便进行接口配置。使用EMAC接口,可以方便地实现HPS系统与外界的以太网报文通信。
最近笔者接到一个需求,需要外部其他soc设备通过EMAC通道来访问HPS,实现HPS与其他片上CPU的通信。我们的其它片上CPU通过FPGA的virtio进行数据交互,HPS的收发数据均需要导入到FPGA中或来源于FPGA。因此,需要对EMAC通道进行开发,通过EMAC通道与FPGA之间的以太网数据包传输,打通HPS-FPGA virtio-其他CPU之间的数据通路。本文记录了EMAC通道开发过程的设计思想,遇到的一些问题与解决方法。开发中所使用的工具为quartus prime pro 22.4,使用开发板型号为Agilex 7。
1.创建带有EMAC的HPS IP
首先,我们需要生成HPS IP,并打开HPS的EMAC通道接口。HPS的生成方法在这里不再赘述。双击打开hps_top的platform designer系统,选中HPS IP,然后在详情中选择:pin mux and peripherals -> advanced -> advanced FPGA placement,选择EMAC 0的route to FPGA,打开EMAC0,并导入到FPGA。这里选择接口协议为GMII协议,不需要phy。选择完成后,点击apply。
auto place IP显示应当如下,HPS Quantity=0, FPGA Quantity=1。
我们在本次设计中,将EMAC通道设定为GMII协议接口。采用GMII接口协议,需要125M的时钟。如果没有,则需要在platform designer中新生成一个125M的clock bridge,连接到GMII的tx clk in和rx clk in。同时,emac接口和gtx clk接口要make external。
保存,并generate。现在整个HPS top已经包括了EMAC,并提供了gmii格式的接口。
接下来我们可以利用这个接口,在FPGA中实现与HPS进行以太网数据收发交互。
2.GMII协议EMAC接口的信号
我的工程与其他CPU进行数据交互,需要通过FPGA的virtio,而且virtio的数据接口格式是遵守Intel avalon stream协议的。因此,本文主要实现了一个GMII协议接口到avalon stream协议接口的转接装置。
首先,简要介绍一下gmii接口的信号和avalon stream接口的信号。HPS采用的emac接口是1000Mbps全双工gmii口,所需要的信号如下。
signal
|
i/o(相对于hps)
|
width
|
desc
|
gtx clk
|
o
|
1
|
TX时钟
|
rx clk
|
i
|
1
|
RX时钟
|
tx reset n
|
o
|
1
|
TX复位
|
rx reset n
|
o
|
1
|
RX复位
|
txd
|
o
|
8
|
TX数据
|
txen
|
o
|
1
|
TX发送数据有效
|
txer
|
o
|
1
|
TX发送数据错误
|
rxd
|
i
|
8
|
RX数据
|
rxdv
|
i
|
1
|
RX接收数据有效
|
rxer
|
i
|
1
|
RX接收数据错误
|
col
|
i
|
1
|
如果发生冲突则置为高
|
crs
|
i
|
1
|
载体检测, 未处于IDEL状态则为高电平,不与任何时钟信号同步。
|
此外,EMAC还提供了PTP功能,我们这里的工程暂时没有考虑。全双工模式下,也不需要考虑col和crs信号。收发时钟都采用125Mhz,直接从外界接入即可。因此,主要需要考虑tx和rx的6条数据信号。同时,emac通道的gmii协议需要增加前导码和CRC32校验。
avalon stream协议则是Intel FPGA设计中常用的驱动高带宽、低延迟、单向数据的总线协议。其主要接口如下。在我们的工程中,数据宽度n=512。
signal
|
width
|
desc
|
dat
|
n
|
数据
|
sop
|
1
|
首包置1
|
eop
|
1
|
末包置1
|
err
|
1
|
当前包数据错误
|
vld
|
1
|
当前包数据有效
|
mty
|
n/8
|
末包才生效,指示最后一包中的空字节数
|
sbd
|
m
|
边带
|
rdy
|
1
|
对端发来,对端已经准备就绪
|
以上即为EMAC通道的创建方法和基本数据格式。进一步开发和设计细节详见后续专栏。