3.2 FPGA
最小系统设计
FPGA
最小系统是指可以使
FPGA
正常工作的最基本的系统,主要包括电源电
路、配置电路、时钟和复位电路。本次设计使用的
FPGA
为紫光同创的
PG2L100H,
接下来具体介绍
FPGA
最小系统各个部分的电路设计。
(
1
)电源电路设计
FPGA
所需要的电源电压有
3.3V
、
1.8V
、
1.2V
和
1V
。其中,内核逻辑电源和
专用
RAM
模块(
DRAM
)电源为
1V
,
FPGA
辅助电源为
1.8V
,
IO BANK
电源使
用
3.3V
,
HSST
高速串行接口的模拟电源需要
1V
和
1.2V
。
FPGA
电源设计框图如
下图
3-5
所示。
使用上海贝岭的电源芯片
BL1084
和
BL9309
对输入的
5V
电源进行转换。
BL1084
为
LDO
电源,可输出固定的
3.3V
电源,输出电流最大可达到
5A
。
BL9309
输出电压可调节,使用电阻分压得到
1V
、
1.2V
和
1.8V
电源,输出电流最大为
2A
。
(
2
)配置电路设计
PG2L100H
支持多种配置模式,本次设计使用
JTAG
模式和
Master SPI
模式。
JTAG
接口可以将程序下载到
FPGA
内部的
SRAM 里,也可以将程序固化到外部
Flash
。
在
Master SPI
模式下,程序保存在外部的
SPI Flash
里,
FPGA
上电时会主动
从
Flash
读取位流。
本次设计使用兆易创新的
SPI Flash
作为
FPGA
的外部配置器件,
Flash
型号为
GD25Q32CSIGR
,容量为
32Mb
,符合设计需求。
(3)时钟和复位电路设计
FPGA
是基于时钟工作的,时钟电路和复位电路必不可少。本次设计使用深圳
扬兴科技的
50MHz
的有源晶振作为
FPGA
的系统时钟输入,将此时钟接到
FPGA
的全局时钟管脚上。
50MHz
的时钟在
FPGA
内部经过锁相环分频得到
16MHz
的
时钟,将此时钟输出给
VME
总线连接器。此外,
FPGA
的
PCIE
接口还需要
100MHz
的差分参考时钟,由
RK3399
处理器输出给
FPGA
。
FPGA
时钟设计框图如下图
3-
6
所示。
FPGA
的上电复位来自
RK808-D
输出的复位信号,由于
RK808-D
输出的复位
信号电平为
1.8V
,而
FPGA
的
IO
电平为
3.3V
,所以需要进行电平转换,使用江
苏润石的电平转换芯片进行转换。此外,
FPGA
还有一个复位按键可以进行手动复
位。
3.4 VME
接口电路设计
作为一个嵌入式控制器板卡,要实现与其他功能板卡的通信还需要借助于计
算机总线来完成。本课题设计的控制器需要最终需要工作在
VME
测试系统中,所
以需要设计
VME
接口电路。
由于
RK3399
处理器内部没有
VME
相关的控制器,所以需要自行完成
PCIE
与
VME
总线的接口逻辑设计。由于
VME
总线接口是由
FPGA
逻辑实现,所以将
RK3399
上的
PCIE
接口连到
FPGA
上,
RK3399
通过
PCIE
总线对
FPGA
内部寄存
器读写实现对
VME
总线的控制。
VME
接口设计如图
3-11
。
VME
总线接口通过
FPGA
逻辑与驱动电路的配合来实现,在
FPGA
内部设计
PCIE
接口与
VME
接口的转换。由于
FPGA
的
IO
电压为
3.3V
,而
VME
总线信号
电平为
5V
,需要通过驱动电路进行电平转换。使用江苏润石的
245
双向驱动器来
完成
VME
连接器和
FPGA
之间的电平转换。
FPGA
逻辑设计即使用
VerilogHDL
或者
VHDL
语言,设计出系统所需要的数
字逻辑电路。本课题的
FPGA
逻辑设计主要完成
PCIE
总线与
VME
总线的接口转
换,本章主要从
PCIE
接口逻辑和
VME
接口逻辑两个部分进行详细介绍。
4.1 FPGA
逻辑设计方案
FPGA
逻辑主要实现
PCIE
总线到
VME
总线的接口转换,逻辑设计框图如图
4-1
所示,主要包括
PCIE
接口逻辑和
VME
接口逻辑两大部分。在
FPGA
内部设
计了对
VME
进行控制的相关寄存器,通过
PCIE
总线对这些寄存器进行读写,从
而实现对
VME
总线的控制。
4.2 PCIE
接口逻辑设计
PCIE
接口逻辑主要由深圳信迈实现
RK3399
处理器和
FPGA
之间的通信,
RK3399
作为
PCIE
的
Root Complex
(
RC
),
FPGA
作为
PCIE
的
Endpoint
。通过地址映射的方式
将
CPU
地址映射到
PCIE
设备的
BAR0
和
BAR1
存储空间,通过
BAR1
来访问
VME
总线地址,通过
BAR0
进行控制寄存器的读写。
在紫光同创
FPGA
平台上,利用
PCIE IP
核设计
PCIE
接口逻辑。
PCIE IP
是
按照
PCIE2.1
协议实现的,支持配置链路宽度为
X1
、
X2
、
X4
,支持配置链路速度
为
2.5GT/s
、
5GT/s
。
PCIE IP
主要实现
PCIE 协议的事务层、数据链路层和物理层
的功能,并向用户提供
AXI4-Stream
接口,以实现应用层和事务层之间的数据传
递。
PCIE
接口逻辑包括
PCIE IP
、
TLP
解码模块、
TLP
编码模块、
PCIE
中断控制
模块、时钟及复位、地址映射和控制寄存器设计。其中,
TLP
是
PCIE
的事务层包,
包括头标(
Header
)和数据(
Data
)两部分。
TLP
解码和编码都是通过
AXI4-Stream
总线接口来进行设计的,
AXI4-Stream
是一种并行总线,没有地址信号线,通过
valid
和
ready
握手信号进行数据传输。
PCIE IP
提供
AXI4-Stream Master
接口和
AXI4-
Stream Slave
接口,用户可以据此设计
TLP
解码和编码逻辑。
4.2.1 TLP
解码模块设计
TLP
解码模块接收来自
PCIE IP
的
TLP
事务层包,并进行解析,获得地址和
数据等信息。
TLP
的
Header
长度为
3DW
或
4DW
。存储器读写请求事务的
3DW
头标格式如图
4-2
,标有
R
的部分未使用,应当设置为
0 [42]。
其中,
Fmt
和
Type
规定了事务的相关信息。
TC
表示传输等级,
PCIE
规定了
8
种
TC
,分别为
TC0~TC7
,默认为
TC0
。
Attr
字段有
3
位,第
2
位表示是否支持
ID-based Ordering
,第
1
位表示是否支持宽松排序(
Relaxed Ordering
),第
0
位表
示是否需要进行
Cache
一致性处理。本设计中
Attr[2:0]
为
000
,表明
TLP
的序为缺
省序,即强序模型,且通过总线监听自动完成
cache
一致性。使用强序模型时,处
理相同类型的
TLP
时,必须等当前的传输完成再传输下一个;不同种类的
TLP
事
务包可以乱序通过。
长度
Length
为
TLP
包的数据长度,单位为
DW
。
1st DW BE
对应数据的第一
个双字的四个字节,
Last DW BE
对应数据的最后一个双字的四个字节,为
0
时说
明对应的字节无效,为
1
有效。
Tag
的长度决定了
PCIE
发送端能够暂存同类型
TLP
的个数,
Tag
一般只使用
低
5
位,即可以暂存
32
个
TLP
,如果使能了
Extended Tag
位,
Tag
使用
8
位,发
送端可以暂存
256
个
TLP
。由于存储器写请求不返回完成包,所以不使用
Tag 标
签,
Tag
字段置为
0
。
Address[31:2]
为
32
位寻址方式的存储器读写地址,
32
位地址
的低两位保留(
00b
),强制起始地址为
DW
对齐。
TLP
解码使用
AXI4-Stream Master
接口,主要通过设计状态机来实现,如图
4-3
为
TLP
解码的状态转换图。
TLP
解码状态机包括
IDLE
、
HEAD_RCV
、
DATA_RCV
三个状态。其中,初
始状态为
IDLE
,系统复位后进入此状态,
IDLE
状态下将地址和数据等寄存器清
零。当
ready
和
valid
均为
1
时,说明开始传输数据且数据有效,跳转至
HEAD_RCV
状态。在
HEAD_RCV
状态下,开始接收
TLP
的
Header
信息,并将
TLP
事务类型
和地址解析出来。当
with_data
为
1
时,说明
TLP
事务类型为存储器写事务,包含
有数据,故跳转至
DATA_RCV
状态;当
with_data
为
0
时,说明
TLP
事务类型为
存储器读事务,不包含数据,故跳转至
IDLE
状态。在
DATA_RCV
状态下,接收
TLP
的
Data
,当
tlast
为
1
时,说明数据传输结束,跳转至
IDLE
状态,准备接收
下一个
TLP
事务层包。
此外,
AXI4-Stream Master
接口还有一个
tuser
信号,该信号有
8
位,其中
[6:4]
这
3
位用来指示
TLP
包要对哪个 BAR 进行操作。
4.2.2 TLP
编码模块设计
TLP
编码模块主要是将来自
VME
总线的数据和地址打包成
TLP
事务层包,
发送给
PCIE IP,
通过
AXI4-Stream Slave
接口实现
TLP
编码。下图
4-4
为
TLP
编
码的状态转换图。
TLP
编码状态机包括
IDLE
、
HEAD_TX
、
DATA_TX
三个状态。其中,初始状
态为
IDLE
,系统复位后进入此状态,当
tready
为
0
时说明
RC
端未准备好,状态
依然保持为
IDLE
。当
tready
为
1
且
data_valid
为
1
时,跳转至
HEAD_TX
状态。
在
HEAD_TX
状态下,将
TLP
各个字段的信息进行组合,因完成包的头标长度固
定为
3DW
,所以组合成长度为
3DW
的头标,发送给
PCIE IP
,并将
tready
信号置
为高电平,表明数据有效。当
tready
为
1
时,跳转至
DATA_TX 状态,在此状态下
发送完成包的数据,
tready
信号依旧置为高电平。发送完数据后,跳转至
IDLE
状
态,将 tready 信号置为低电平。
4.2.3 PCIE
中断控制设计
PCIE
总线支持两种类型的中断,一种是消息信号中断(
MSI
),另一种是虚拟
INTx
信号中断。
MSI
中断是
PCIE
设备通过存储器写事务,将消息数据寄存器中
的内容写入其消息地址寄存器所规定的存储器地址,从而向处理器提交中断请求。
虚拟
INTx
中断是使用中断消息来模仿
PCI
兼容的中断信号,传达
INTx#
信号的跳
变情况。
MSI
中断的效率比较高,它不需要软件去确认是哪个设备产生了中断,即不用
识别中断源。所以本次设计使用
MSI
中断,在
PCIE IP
设置界面里使能
MSI
中断。
在接收来自
VME
的中断后,拉高
MSI
中断请求信号,
PCIE IP
会将中断请求提交
至
CPU
的
PCIE
控制器,
CPU
接收到中断后可以进行相应的操作。在
CPU
收到
MSI
中断请求后,将
MSI
中断请求信号拉低,防止
CPU
接收到重复的中断。
在使用
MSI
中断的时候,需要注意存储器同步问题,即
CPU
在接收到
MSI
中
断请求后立即去执行中断处理程序,这个时候可能会打断当前的读写操作。为避免
这种问题,可以在设计时确保应用数据的存储器写事务和
MSI
存储器写事务的
TC
号一样,这样就不会打断当前的存储器写事务了。
4.2.4
地址映射和控制寄存器设计
通过地址映射的方式将
CPU
地址映射到
PCIE
设备的
BAR0
和
BAR1
存储空
间,通过
BAR0
进行控制寄存器的读写,通过
BAR1
来访问
VME
总线地址。由于
VME
总线的地址线为
24
,所以将
BAR1
的空间大小设置为
16MB
,并根据控制寄
存器的实际使用情况将
BAR0
的空间大小设置为
256B
,以上内容均在
PCIE IP
核
中进行设置。
为了实现对
VME
总线的控制,需要定义一些控制寄存器,并将这些控制寄存
器的地址映射到
PCIE
设备的
BAR0
空间。本课题定义的
VME 控制寄存器如下表
4-1
所示,由于
PCIE
存储空间的读写地址为双字对齐,所以本次设计的控制寄存
器的地址为 4 的倍数。
这些寄存器
Register
大致可分为两类,一类是中断控制相关的寄存器,一类是
读写控制相关的寄存器。中断控制相关的寄存器包括中断屏蔽、中断挂起、中断使
能、中断向量和中断状态寄存器。中断屏蔽
Register
用来对某一级或某几级中断进
行屏蔽,使用户只接收到自己所需要的中断。中断挂起
Register
用来指示哪一级中
断产生了。中断使能
Register
用来对
VME
中断进行使能或禁能。中断向量
Register
用来读取中断向量,从而使用户可以进行相应的中断处理。中断屏蔽和中断挂起寄
存器均定义了
8
位,第
0
位不使用。
读写控制相关的寄存器包括全局控制寄存器、读写状态寄存器和
LED
控制寄
存器。全局控制寄存器用来对地址模式和数据读写方式进行控制,地址模式包括
16
位地址和
24
位地址两种,数据读写方式有
16
位数据读写、
8
位偶地址读写、
8
位
奇地址读写三种。读写状态寄存器用来指示
VME
总线读写是否正常完成,该寄存
器值为
1
表示写正常完成,
2
表示读正常完成,
4
表示数据读写方式错误,
8
表示
超时错误。
LED
控制寄存器用来对前面板的
LED
灯进行控制,当系统上电后点亮
LED
灯。
VME
控制寄存器模块是
PCIE
接口与
VME
接口之间的桥梁,通过此模块实
现
PCIE
总线与
VME
总线的接口转换。本模块将来自
TLP
解码模块的
PCIE 地址
映射到
BAR0
、
BAR1
空间,实现对
BAR0
空间里的
VME
控制寄存器的读取和写
入,对
BAR1
空间里的
VME
总线数据写入和读取。并且将
VME
控制寄存器的具
体内容和
VME
总线的数据和地址传递至
VME
读写操作模块和
VME
中断管理模
块。此外需要注意的是,当
VME
接口的
VME
总线读写操作未完成时,需要进行
等待,直到
VME
总线读写完成之后,再进行下一次的读写操作。
4.3 VME
接口逻辑设计
VME
总线为异步并行总线,主要由数据传输总线(
DTB
)、数据传输的仲裁总
线、优先级中断总线和公用总线四部分构成。
DTB
的主要作用是在模块间传递数
据、地址和控制信号;仲裁总线负责控制和分配
DTB
,保证某一时间只有一个模
块控制
DTB
;优先级中断总线使得
VME
设备和中断管理器之间可以进行中断请
求和中断响应,中断请求可以
7
个中断优先级。
DTB
分为寻址线、数据线和控制线三大类。
VME
背板可配置为
16
或
32
条数
据线,
16
条数据线的背板一次可同时访问
2
个字节的数据,
32
条数据线的背板一
次可同时访问
4
个字节的数据。
DTB
控制线包括
AS*
、
DS0*
、
DS1*
、
DTACK*
、
WRITE*
和
BERR*
。
AS*
由高变低说明地址选通,可以使用。
DS0*/ DS1*
的第一个
下降沿在写周期表明主模块已将有效数据放到数据总线上了,在读周期用来告诉
从模块可以将数据总线上的数据撤掉。
WRITE*
为电平有效信号,为低电平时表明
数据是从主模块向从模块传输,为高电平时表明数据是从从模块向主模块传输。
BERR*
由从模块或总线定时器驱动,为低时表明数据传输出现错误。
本课题中的
VME
接口逻辑设计主要包括
VME
读写操作模块、
VME
中断管
理模块、
VME
定时模块、时钟驱动和复位逻辑等。时钟驱动和复位逻辑主要是产
生
VME
总线的系统时钟
16MHz
和复位信号。系统时钟可以由锁相环分频得到,
复位信号通过按键复位来产生。接下来具体介绍
VME
读写操作模块、中断管理模
块和定时模块的设计。
4.3.1 VME
读写操作模块
本课题设计
VME
读写操作模块来控制
VME
总线数据传输,实现
VME
总线
读写操作,并且数据读写支持三种访问方式。基本的设计原则是通过握手信号实现
数据异步传输,
VME
控制器使用
AS*
、
DS0*
、
DS1*
向从模块发出控制信息,而
VME
功能模块使用
DTACK*
来进行应答。
VME
读写操作模块采用状态机来实现,状态转换图如图
4-5
所示。初始状态
为
IDLE
,当收到读或者写请求且总线未被占用时,跳转至
AS(地址选通)状态,
若总线被占用则一直处于
IDLE
状态。在
AS
状态下,延时
40ns
后,驱动
AS
信号
为低并驱动
WRT
信号,跳转至
DS
(数据选通)状态。在
DS
状态下延时
40ns
,
然后根据数据读写方式来驱动
DS
信号,并跳转至
DTACK
(数据传输应答)状态。
在
DTACK
状态下,若
DTACK
信号为低,说明数据传输成功,拉高
AS
和
DS
信
号,跳转至
WR_CLR
(写清除)状态;若
BERR
信号为低,说明总线出现超时错
误,此时同样需要拉高
AS
和
DS
信号,跳转至
WR_CLR
状态。在
WR_CLR
状态
下,延时
20ns
后清除
WRITE
信号和读写标志信号,并跳转至
END
(结束)状态。
在
END
状态下,延时
40ns
跳转至 IDLE 状态。
4.3.2 VME
中断管理模块
中断模块用来对
IRQ1
到
IRQ7
中断进行接收和处理,当
VME
中断模块接收
到
VME
中断后,进行中断应答操作并将中断信息传递至
PCIE
中断控制模块,由
PCIE
中断控制模块向
RK3399
提出
MSI
中断申请,
RK3399
通过读取中断挂起和
中断向量寄存器来确定中断产生了哪一级及中断类型。具体实现过程如下:
(
1
)
VME
中断管理模块接收到
VME
设备的中断请求
IRQ
后,将中断级别信
息写入到相应的中断挂起
Register
,并将中断传递至
PCIE
中断模块。
(2)
PCIE
中断控制模块接收到来自
VME
中断模块的中断后,向
RK3399
发起
MSI
中断请求。
(3)
RK3399
接收到
PCIE
设备的
MSI
中断请求后,进入中断处理函数,禁
止使能中断,读取中断挂起寄存器,查看
1
—
7
哪一级发生了中断,并读取中断向
量进行相应的中断处理。
(4)
VME
寄存器控制模块得知
RK3399
读中断向量后,向
VME
中断控制模
块传递
IACK_en 信号,表明可以进行应答操作。
(5)
VME
中断管理模块开始中断应答,驱动
IACK*
为低电平。读取来自
VME
功能模块的中断向量并传递至
VME
寄存器控制模块。
(6)应用程序里的中断处理完成之后,
RK3399
写中断使能,告诉
PCIE
设备
中断已经得到处理,可以接收下一次中断。
VME
中断模块的状态转换图见图
4-6
。初始状态为
WAIT
状态,当接收到
VME
中断请求后,向
PCIE
中断模块传递中断,并跳转至
IACK
(中断应答)状态,否
则一直处于
WAIT
状态。在
IACK
状态下,若收到中断应答使能信号,说明处理器
已接收到中断请求,中断管理模块进行中断应答,并跳转至
DS
状态,否则一直处
于
IACK
状态。在
DS
状态下,延时
40ns
后驱动
DS
和
AS
信号有效并跳转至
DTACK
状态。在
DTACK
状态下,当
DTACK
或
BERR
信号为低电平时,驱动
IACK
、
AS
和
DS
信号无效,并跳转至
NWAIT
状态。在
NWAIT
状态下,延时
40ns
跳转至
IACK_CLR
状态,
IACK_CLR
状态表示中断完成,延时一个周期跳转至初
始状态。
4.3.3 VME
定时模块
VME
总线定时模块的功能是对
VME
总线定时
64us
,当
VME
总线出错超过
64us
时,驱动总线错误线
BERR*
为低,输出超时错误。
VME
定时有两种方式,一
是不论
DTACK*
和
BERR*
的电平为高或者低,当
DS1*
和
DS0*
这两个信号中的任
意一个维持为低的时间超过
64
微秒,就将
BERR*
信号拉低。二是当
DS1*
和
DS0*
这两个信号中的任意一个维持为低的时间超过
64
微秒,且
DTACK*
和
BERR*
均
为高时,拉低
BERR*
信号。
本次
VME
定时模块设计使用第二种方法,设计状态机来进行
64us
的定时操
作。状态机包括三个状态,分别为起始状态(
IDLE
)、计时开始状态(
START)和
停止状态(
STOP
)。
VME
定时操作的状态转换图见下图
4-7
。
系统复位后进入
IDLE
状态,当
DS1*
和
DS0*
其中一个为低或者均为低电平
时,由初始状态跳转至定时开始状态,开始计时。当
DTACK*
由高变为低时或者时
间达到
64us
,由计时状态跳转至停止状态,若跳转条件为达到
64us
,将
BERR*
驱
动为低电平;不满足跳转条件的话停留在计时状态。当
DS1*
和
DS0*
均为高,由停
止状态跳转到初始状态并将 BERR*拉高。
VME
定时操作可以解决总线超时或者出现错误带来的问题,当控制器模块对
没有定义的地址进行操作或者其他
VME
功能模块出现错误时,可以进行报错并结
束此次操作,提高总线工作的效率。
信迈提供RK3399+FPGA的解决方案。