本发明属于数字电路接口转换领域,涉及到多协议接口转换中的跨时钟域处理问题,具体涉及一种多通道数据源ddr缓存的fpga实现方法。
背景技术:
由于fpga器件本身的bram资源的限制,一般最大容量有几十mbit空间。在实际的应用中就需要很大的外部存储进行数据缓存,数字电路接口进行转换时,一般选用的是ddr对数据进行缓存,以此才能确保数据交接时的安全可靠。但涉及多个通道时,每个通道都是异步的,要求数据进行安全交接,并且要高效灵活的使用ddr就变得很重要。目前通常实现的方法就是一个通道挂载一个ddr颗粒,多通道应用中需要多个ddr相对应。每个通道所使用的存储空间大小是固定的,这种实现方式不灵活。
技术实现要素:
为解决现有技术的不足,本发明用fpga挂若干个ddr颗粒,随意配置通道个数,然后对每个通道ddr读写进行仲裁,仲裁规则是通过轮询,或匹配带宽的仲裁规则。
本发明是将各个通道的数据缓存至ddr的各个通道对应的地址空间,每个通道的地址空间大小可以任意划分。地址空间总共大小为每个ddr颗粒内存空间的总和。通道数据和ddr之间分别是通过异步fifo进行交接。
如图1所示,数据源通过多个通道将数据先写入异步fifo端口的写fifo,其中每个数据通道可以是异步的,数据可以是不连续的。数据写入根据写fifo的full信号,非满就就继续写入。在写fifo会设置水位线,当写入写fifo的数据达到一定水位量时,会将水位线置高,ddr_ctrl模块会根据该信号对写fifo进行读准备。因为ddr是同一时刻只能对数据读或者写,也只能对多路中的一个通道进行读或者写,这就涉及到两个问题。
(1)仲裁,对每一条通道进行仲裁和对该通道数据是写或读两种仲裁。
(2)设置对每一个通道进行读或者写的一次最小数据搬移的对接量,如果设置的对接量太小,这会导致ddr带宽利用率降低,设置的太大,写fifo和读fifo所需缓存的数据量也要增多,导致有限的fpgabram资源消耗太多,需要根据工程的实际需要权衡设置一个合适的对接量。ddr_ctrl将缓存到ddr的数据读出的一个条件是读fifo是否能一次缓存对接量的空间,这就要求读fifo要设置一个水位线,防止读fifo已经满了ddr_ctrl还要写,数据丢失。每个通道缓存的数据对应一定ddr地址空间,可以根据需要设置ddr的缓存深度。
采用的具体技术方案如下:
一种多通道数据源ddr缓存的fpga实现方法,其特征在于,包括:
将各个通道的数据分别缓存至ddr的各通道对应的内存地址空间,每个通道的地址空间大小任意划分,地址空间总大小为所用的ddr颗粒内存空间的总和;各通道数据源和ddr之间分别是通过异步fifo进行交接;
各通数据源通过多个通道将数据先写入异步fifo端口的写fifo,再从写fifo中取数据写至ddr对应的地址空间内,根据读fifo水位线标志信号,再将ddr地址空间中取数据写到读fifo中;具体步骤:
1)用fpga挂若干个ddr颗粒,可根据需求随意配置数据通道个数,设置读写控制模块,仲裁模块;
2)设置写fifo水位线,目的是从写fifo中读出数据时保证fifo必须有一定的数据存量;设置读fifo的水位线,目的是防止从ddr读出数据时写到读fifo中会出现数据溢出,造成数据丢失;
3)每个数据通道写入数据到其对应的写fifo中;
4)判断每个通道写fifo中数据量是否达到设置的水位线要求,若达到水位线要求,则发送该通道写ddr仲裁请求信号至仲裁模块;
5)仲裁模块判断每个通道发出的写ddr仲裁请求信号,根据发送写仲裁申请的先后,给予每个通道写仲裁权限,同一时刻,每个通道的写仲裁与读仲裁中,仲裁模块只会仲裁一条通道的写仲裁或读仲裁有效;
6)读写控制模块根据仲裁结果对某一条通道的写fifo进行取数据,每次取该写fifo中设置的水位线的数据量,该写fifo会确保有一定的数据量;取数据存到设置的ddr对应的地址空间内,地址空间大小随意配置;
7)等待完成;
8)对刚完成仲裁数据通道进行判断,该通道的读fifo是否满足水位线要求,若读fifo水位线满足要求后,则发出读ddr仲裁申请至仲裁模块;
9)仲裁模块给出仲裁结果;
10)读写控制模块根据仲裁结果,将从该通道对应的ddr地址空间中取数据写到读fifo中,每次取设置的水位线数据量,确保读fifo写入数据不会溢出;
11)读fifo等待外部通道读取。
进一步,所述的仲裁模块的仲裁规则或是通过轮询的仲裁规则,或是匹配带宽的仲裁规则。
进一步,所述的数据源通过多个通道将数据先写入异步fifo端口的写fifo,再从写fifo中取数据至ddr对应的地址空间内,再将ddr地址空间中取数据写到读fifo中,其中每个数据通道或是异步的,或是同步的;数据或是连续的,或是不连续的。
实现步骤:
步骤1.若干数据通道开始写入数据到每个对应的写fifo中;
步骤2.判断每个通道写fifo中数据量是否达到设置的水位线要求,设置写fifo水位线目的是从写fifo中读出数据时保证fifo必须有一定的数据存量(设置fifo中数据量为4kb,fifo中数据量大于4kb,标志位为高)则发送该通道写ddr仲裁请求信号至仲裁模块;
步骤3.仲裁模块判断每个通道发出的写ddr仲裁请求信号,根据发送写仲裁申请的先后,给予每个通道写仲裁权限。同一时刻,每个通道的写仲裁与读仲裁中,仲裁模块只会仲裁一条通道的写仲裁或读仲裁有效。不会出现仲裁多个通道写或读仲裁同时有效的现象;
步骤4.读写控制模块根据仲裁结果对某一条通道的写fifo进行取数据,每次取该写fifo中设置的水位线的数据量,该写fifo会确保有一定的数据量。取数据存到设置的ddr对应的地址空间内。地址空间大小可以随意配置;
步骤5.等待完成;
步骤6.对刚完成仲裁数据通道进行判断,该通道的读fifo是否满足水位线。设置读fifo的水位线设置目的是防止从ddr读出数据时写到读fifo中会出现数据溢出,造成数据丢失。读fifo水位线满足条件后,将发出读ddr仲裁申请至仲裁模块;
步骤7.仲裁模块给出仲裁结果;
步骤8.读写控制模块根据仲裁结果,将从该通道对应的ddr地址空间中取数据写到读fifo中,每次取设置的水位线数据量。确保读fifo写入数据不会溢出;
步骤9.读fifo等待外部通道读取。
实现流程都是流水线的操作方式。
fifo水位线指的是,fifo是firstinputfirstoutput的缩写,先入先出队列,是一种先进先出的数据缓存器。水位线是fifo缓存数据量的标志信号,数据量达到设置的水位线时,fifo会输出标志信号。
本发明通过交接多通道数异步数据源,灵活匹配缓存ddr映射的地址空间,灵活匹配缓存ddr映射的地址空间。达到了以下的有益效果:
1.可以对扩展若干个异步时钟时终域通道进行交接;
2.灵活匹配缓存ddr映射的地址空间;
3.可以集中多个ddr的缓存数据带宽对得到仲裁的通道进行缓存。
灵活高效体现在可以使用多个ddr颗粒对各个通道进行读写仲裁,灵活改变每一个通道映射的内存空间。多颗ddr带宽很高,也可以缓存单个通道数据高速率数据。
附图说明
图1为数据流向示意图;
图2为ddr模块的顶层模块结构框图;
图3为读写控制状态转移图;
图4为本发明实现步骤流程图。
具体实施方式
下面结合具体实施例对本发明作进一步描述:
1.ddr模块顶层模块结构框架,参阅图2。
2.项目平台简介:
2.1该项目使用的是4颗ddr颗粒,具体型号为mt41j256m16ha-125。fpga器件平台使用的是xilinx厂商,具体型号是xc7z045-ffg900-2。
2.2数据源分别为通道1,srio接口,带宽速率为800mb/s;通道2,pcie接口,带宽速率为1gb/s;通道3,ad采集的数据源,带宽速率为1gb/s;通道4,读sata盘的接口,带宽为1.2gb/s。四个通道相互独立,与ddr时钟都为异步,并且写入的数据都是不连续的。
2.3ddrmig配置:选择两最64位,数据位宽为512位数据,设置双组ddr控制器。
3.各个模块的介绍
3.1ddrfifo_rdwr_ctrl模块
根据仲裁结果将数据缓存到对应的ddr分配地址空间内,实现对写fifo和读fifo读写控制,每次读写数据是以一定量的数据对接(可配置,默认4kb),如果读写写fifo和读fifo的条件都满足,ddrfifo_rdwr_ctrl会将写fifo中缓存的4kb数据写进ddr中,下一次仲裁来时,会将ddr中4kb数据读出,然后写到读fifo中,读fifo没有及时读出,数据将一直缓存到ddr中。
参阅图3:
s_init:等待加载状态,当i_ddr_init_calib_completeddrmig配置完成,ddr用户逻辑可以操作是跳转到s_idle。
s_idle:初始状态,每次读或写操作结束后(s_wr_data和s_rd_data)就会跳到初始状态、
根据写fifo和读fifo水位线满足读写要求后会跳到写请求s_snd_wreq或读请求s_snd_rreq状态。
s_snd_wreq:写请求状态,当该路仲裁结果有效后,跳转到写准备状态s_wa_wrdy。
s_wa_wrdy:写准备状态,等待migip响应后跳转到写数据状态s_wr_data。
s_wr_data:写数据状态,写完设定的数据量后,跳转到初始状态s_idle。
s_snd_rreq:读请求状态,当该路仲裁结果有效后,跳转到写准备状态s_wa_rrdy。
s_wa_rrdy:读准备状态,等待migip响应后跳转到读数据状态s_rd_data。
s_rd_data:读数据状态,读完设定的数据量后,跳转到初始状态s_idle。
3.2ddrfifo_arbit
当每个通道写fifo中数据量达到设定的水位线时会发出写仲裁请求,当每个通道读fifo中数据量满足设定的水位线时,会发出读仲裁请求。然后仲裁的信号给ddrfifo_arbit_core,会给出仲裁结果,并将按照轮询的方式进行仲裁,每路的读仲裁进行处理,根据仲裁结果把ddruser_interface判给对应的那一路。
3.3ddrfifo_arbit_core
仲裁模块,使用的是轮询的方式对各个满足读写条件的通道进行仲裁。
3.4ddrfifo_mux
根据仲裁的结果对user_interface进行判定。
3.5ddrfifo_gray
将每一路缓存到ddr数据量个数由二进制转换为格雷码,给外部得到缓存数据量的信息。
3.6mig_ddr_ctrl
xilinx官方提供ddrmig的用户接口。