一种基于FPGA的跨步访问数据流检测电路及方法与流程

文档序号:23152373发布日期:2020-12-04 13:47阅读:199来源:国知局
一种基于FPGA的跨步访问数据流检测电路及方法与流程

本发明应用于数据流检测领域,具体涉及一种基于fpga的跨步访问数据流检测电路及方法。



背景技术:

近年来,深度学习算法和数字信号处理广泛应用于各个领域,如计算机视觉、图像识别、矩阵计算、卷积计算、快速傅里叶变换fft等,其中的卷积神经网络算法cnn(convolutionalneuralnetworks)是深度学习算法中使用最广的算法之一。cnn算法简单、并行程度高,但其数据计算量大,有大量的卷积计算操作,而卷积计算的读写方式主要是跨步访问。所以提高系统的带宽和数据流检测的准确率,对于改善系统的性能有着重要意义。如何准确的检测跨步数据流是解决访存冲突的重要途经之一,有利提高存储系统的带宽和效率。

目前数据访存主要基于软件仿真平台和linux操作系统,通过对跨步数据访存预读或预取算法。预读算法通常是通过模式匹配的启发式检测算法,该类算法对用户程序透明,但是能监测到的预读模式比较单一。linux操作系统适用于顺序预读算法,并不针对其它数据的访问类型。fpga是一种可编程逻辑门器件,具有集成度高、处理速度快等特点,易于维护和移植,方便让研究人员有足够的设计空间来定制专用的数据流检测硬件电路,可以利用跨步访存的特性设计数据流检测电路和方法。



技术实现要素:

本发明的目的在于提供一种基于fpga的跨步访问数据流检测电路及方法,本发明资源及功耗较低,检测效果良好,能准确判断输入数据流是否为跨步访存数据。

为实现上述目的,本发明的技术方案是:一种基于fpga的跨步访问数据流检测电路,包括第一数据寄存器、减法器、数据差值寄存器、数据存储器、计数器、比较器、信号计数器、第二数据寄存器、与门;第一数据寄存器的输入端、减法器的第一输入端相连接作为整个电路的数据输入端,第一数据寄存器的输出端与减法器的第二输入端相连接,减法器的输出端与数据差值寄存器的输入端连接,数据差值寄存器的输出端与数据存储器的第一输入端连接,数据存储器的第二输入端与计数器的输入端、计数器的输出端连接,数据存储器的的输出端与比较器的输入端连接,比较器的输出端与与门的第一输入端、信号计数器的输入端连接,信号计数器的输出端与第二数据寄存器的输入端连接,第二数据寄存器的输出端与与门的第二输入端连接,与门的输出端作为整个电路的信号输出端;第一数据寄存器的使能端、数据差值寄存器的使能端、数据存储器的使能端、计数器的使能端、信号计数器的使能端相连接作为整个电路的使能端,第一数据寄存器的时钟端、数据存储器的时钟端、计数器的时钟端、信号计数器的时钟端、第二数据寄存器的时钟端相连接作为整个电路的时钟端,第一数据寄存器的复位端、数据存储器的复位端、计数器的复位端、信号计数器的复位端、第二数据寄存器的复位端相连接作为整个电路的复位端。

在本发明一实施例中,所述比较器包括第一比较单元、第二比较单元、第三比较单元;其中,第一比较单元与数据存储器中的data_ram[kernel-1]数据块相连,第二比较单元与数据存储器中的data_ram[kernel_size-1]数据块和data_ram[kernel-kernel_size-1]数据块相连,第三比较单元与数据存储器中剩下的data_ram数据块相连,其中kernel、kernel_size为常数。

在本发明一实施例中,所述第一比较单元由一个比较器电路构成,第一比较单元的比较器电路第一输入端与gnd连接,第一比较单元的比较器电路第二输入端与数据存储器中的data_ram[kernel-1]数据块输出端连接,第一比较单元的比较器电路输出端与第二比较单元连接;第二比较单元由两个比较器电路和两个与门电路构成,第二比较单元的第一个比较器电路两输入端分别与数据存储器中的data_ram[kernel_size-1]数据块输出端和data_ram[kernel-kernel_size-1]数据块输出端相连,第二比较单元的第一个比较器电路输出端与第二比较单元的第一与门第一输入端连接,第二比较单元的第二个比较器电路第一输入端与系统设定值连接,第二比较单元的第二个比较器电路第二输入端与数据存储器中的data_ram[kernel_size-1]数据块输出端或data_ram[kernel-kernel_size-1]数据块输出端连接,第二比较单元的第二个比较器电路输出端与第二比较单元的第二与门电路第一输入端连接,第二比较单元的第一与门电路第二输入端与第一比较单元的比较器电路输出端连接,第二比较单元的第一与门电路输出端与第二比较单元的第二与门电路第二输入端连接,第二比较单元的第二与门电路输出端与第三比较单元连接。

在本发明一实施例中,所述第三比较单元由kernel-kernel_size-2个比较器电路和kernel-kernel_size-2与门电路构成,第三比较单元的kernel-kernel_size-2个比较器电路用于实现数据存储器中剩余data_ram数据块输出端输出值的比较,第三比较单元的kernel-kernel_size-2与门电路用于实现第三比较单元的kernel-kernel_size-2个比较器电路输出端输出值、第二比较单元的第二与门电路输出端输出值的与逻辑比较。

本发明还提供了一种基于上述所述的基于fpga的跨步访问数据流检测电路的跨步访问数据流检测方法,包括如下步骤:

步骤一:根据跨步访问数据流的特点,定义系统变量image_width、kernel_size、kernel、stride;

步骤二:输入数据data_in存入第一数据寄存器,输入使能信号enable延时一个时钟周期;

步骤三:第一数据寄存器存储的前一刻时钟数据与数据data_in的后一刻时钟数据在减法器做减法得到的差值数据并存入数据差值寄存器;

步骤四:计数器从零开始计数,计数存入数据差值寄存器的数据的个数并计数到kernel-1后,将kernel个数据记为一组;

步骤五:比较器判断每组数据的第[kernel-1]个数据是否小于0且判断每组数据的第[kernel_size-1]个数据和第[kernel-kernel_size-1]个数据==image_width-kernel_size+1,若是,则比较器判断每组数据除上述外的数据是否相等,若是,执行步骤六;

步骤六:比较器输出信号vld_r=’d1;

步骤七:信号计数器计数信号vld_r值为’d1的个数并输出计数值vld_num给第二数据寄存器;

步骤八:第二数据寄存器判断((image_withe-kernel_size+stride)/stride)2==vld_num是否成立,若等式成立则第二数据寄存器输出信号vld_d=‘d1;

步骤九:与门计算data_vld=vld_r&&vld_d的值,并输出信号data_vld;

其中image_width、kernel、kernel_size、stride为常数。

相较于现有技术,本发明具有以下有益效果:本发明基于verilog硬件描述语言,利用fpga开发平台设计了一种跨步访问数据流检测电路和方法,本发明电路能对输入的数据流进行存储、分析、计算和检测,能准确判断输入数据流是否为跨步访存数据。设计的硬件电路突破传统采用软件仿真器或者linux操作系统检测的方式,利用跨步访问数据流的特点,所涉及电路片上利用率低,系统功耗低,检测效果良好。

附图说明

图1是本发明基于fpga的跨步访问数据流检测电路图。

图2是本发明数据存储器和比较器结构框图。

图3是本发明跨步数据流检测算法流程图。

具体实施方式

下面结合附图,对本发明的技术方案进行具体说明。

本发明提供了一种基于fpga的跨步访问数据流检测电路,包括第一数据寄存器、减法器、数据差值寄存器、数据存储器、计数器、比较器、信号计数器、第二数据寄存器、与门;第一数据寄存器的输入端、减法器的第一输入端相连接作为整个电路的数据输入端,第一数据寄存器的输出端与减法器的第二输入端相连接,减法器的输出端与数据差值寄存器的输入端连接,数据差值寄存器的输出端与数据存储器的第一输入端连接,数据存储器的第二输入端与计数器的输入端、计数器的输出端连接,数据存储器的的输出端与比较器的输入端连接,比较器的输出端与与门的第一输入端、信号计数器的输入端连接,信号计数器的输出端与第二数据寄存器的输入端连接,第二数据寄存器的输出端与与门的第二输入端连接,与门的输出端作为整个电路的信号输出端;第一数据寄存器的使能端、数据差值寄存器的使能端、数据存储器的使能端、计数器的使能端、信号计数器的使能端相连接作为整个电路的使能端,第一数据寄存器的时钟端、数据存储器的时钟端、计数器的时钟端、信号计数器的时钟端、第二数据寄存器的时钟端相连接作为整个电路的时钟端,第一数据寄存器的复位端、数据存储器的复位端、计数器的复位端、信号计数器的复位端、第二数据寄存器的复位端相连接作为整个电路的复位端。

所述比较器包括第一比较单元、第二比较单元、第三比较单元;其中,第一比较单元与数据存储器中的data_ram[kernel-1]数据块相连,第二比较单元与数据存储器中的data_ram[kernel_size-1]数据块和data_ram[kernel-kernel_size-1]数据块相连,第三比较单元与数据存储器中剩下的data_ram数据块相连,其中kernel、kernel_size为常数。

所述第一比较单元由一个比较器电路构成,第一比较单元的比较器电路第一输入端与gnd连接,第一比较单元的比较器电路第二输入端与数据存储器中的data_ram[kernel-1]数据块输出端连接,第一比较单元的比较器电路输出端与第二比较单元连接;第二比较单元由两个比较器电路和两个与门电路构成,第二比较单元的第一个比较器电路两输入端分别与数据存储器中的data_ram[kernel_size-1]数据块输出端和data_ram[kernel-kernel_size-1]数据块输出端相连,第二比较单元的第一个比较器电路输出端与第二比较单元的第一与门第一输入端连接,第二比较单元的第二个比较器电路第一输入端与系统设定值连接,第二比较单元的第二个比较器电路第二输入端与数据存储器中的data_ram[kernel_size-1]数据块输出端或data_ram[kernel-kernel_size-1]数据块输出端连接,第二比较单元的第二个比较器电路输出端与第二比较单元的第二与门电路第一输入端连接,第二比较单元的第一与门电路第二输入端与第一比较单元的比较器电路输出端连接,第二比较单元的第一与门电路输出端与第二比较单元的第二与门电路第二输入端连接,第二比较单元的第二与门电路输出端与第三比较单元连接。所述第三比较单元由kernel-kernel_size-2个比较器电路和kernel-kernel_size-2与门电路构成,第三比较单元的kernel-kernel_size-2个比较器电路用于实现数据存储器中剩余data_ram数据块输出端输出值的比较,第三比较单元的kernel-kernel_size-2与门电路用于实现第三比较单元的kernel-kernel_size-2个比较器电路输出端输出值、第二比较单元的第二与门电路输出端输出值的与逻辑比较。

本发明还提供了一种基于上述电路的跨步访问数据流检测方法,包括如下步骤:

步骤一:根据跨步访问数据流的特点,定义系统变量image_width、kernel_size、kernel、stride;

步骤二:输入数据data_in存入第一数据寄存器,输入使能信号enable延时一个时钟周期;

步骤三:第一数据寄存器存储的前一刻时钟数据与数据data_in的后一刻时钟数据在减法器做减法得到的差值数据并存入数据差值寄存器;

步骤四:计数器从零开始计数,计数存入数据差值寄存器的数据的个数并计数到kernel-1后,将kernel个数据记为一组;

步骤五:比较器判断每组数据的第[kernel-1]个数据是否小于0且判断每组数据的第[kernel_size-1]个数据和第[kernel-kernel_size-1]个数据==image_width-kernel_size+1,若是,则比较器判断每组数据除上述外的数据是否相等,若是,执行步骤六;

步骤六:比较器输出信号vld_r=’d1;

步骤七:信号计数器计数信号vld_r值为’d1的个数并输出计数值vld_num给第二数据寄存器;

步骤八:第二数据寄存器判断((image_withe-kernel_size+stride)/stride)2==vld_num是否成立,若等式成立则第二数据寄存器输出信号vld_d=‘d1;

步骤九:与门计算data_vld=vld_r&&vld_d的值,并输出信号data_vld;

其中image_width、kernel、kernel_size、stride为常数。

以下为本发明的具体应用实例。

本发明应用于数据流检测领域,具体为一种基于fpga的跨步访问数据流检测电路,能对输入的数据流进行存储、分析、计算和检测,准确的判断输入数据流是否为跨步访存数据。

本发明基于fpga的跨步访问数据流检测电路图如图1所述。电路主要包括输入激励、数据寄存器din_r、减法器subtractor、数据差值寄存器data_dif、数据存储器data_ram、计数器cnt_num、比较器comparator、信号计数器vld_num、数据寄存器vld_d、与门rtl_and、输出信号data_vld。其中输入激励包括:系统时钟clk,复位信号rst_n,输入数据流data_in,使能信号enable;输入数据流data_in位宽为[width-1:0]bit数据;数据寄存器din_r可寄存位宽[width-1:0]bit数据;数据差值寄存器data_dif可寄存位宽[width-1:0]bit数据;数据存储器data_ram可寄存kernel-1个且可存[width-1:0]bit的有符号数据;计数器cnt_num计数范围为0~15,当计数达到预设计数值时计数器cnt_num的输出端q会输送清零信号返回计数器cnt_num的输入端d,当计数达到预设计数值时计数器cnt_num的输出端q会输送信号至数据存储器data_ram的输入端a,使得数据存储器data_ram每cnt_num个数的data_dif计为一组;信号计数器计数vld_r信号为’d1值的个数;数据寄存器寄存vld_d的值,计数范围为0~1023。

电路结构如下所述:输入数据流data_in与数据寄存器din_r的输入端d相连;输入数据流data_in与减法器subtractor的输入端data_i0相连;数据寄存器din_r的输出端q与减法器subtractor的输入端data_i1相连;减法器subtractor的输出端o与差值寄存器data_dif的输入端d相连;差值寄存器data_dif的输出端q与数据存储器data_ram的输入端d相连;计数器cnt_num的输出端q与计数器cnt_num的输入端d相连;计数器cnt_num的输出端q与数据存储器data_ram的输入端a相连;数据存储器data_ram的输出端q与比较器comparator的输入端i相连;比较器comparator的输出端o与信号计数器vld_num的输入端d相连;信号计数器vld_num的输出端q与数据寄存器vld_d的输入端a相连;与门rtl_and的输入端i1与数据寄存器的输出端o相连;与门rtl_and的输入端i0与比较器comparator的输出端o相连;与门rtl_and的输出端o与输出信号data_vld相连;系统使能信号enable分别与计数器cnt_num的输入端ce、数据寄存器din_r的输入端ce、数据差值寄存器data_dif的输入端ce、数据存储器data_ram的输入端ce、信号计数器vld_num的输入端ce相连;系统时钟clk分别与数据寄存器din_r、计数器cnt_num、数据存储器data_ram、信号计数器vld_num、数据寄存器vld_d相连;复位信号rst_n分别与数据寄存器din_r、计数器cnt_num、信号计数器vld_num、数据寄存器vld_d相连。

本发明实例中,为了描述方便,将各器件输出值用器件符号替代,如计数器cnt_num,其输出值就用cnt_num替代。

本发明电路使用过程如下所述:并行输入位宽为[width-1:0]bit的数据流data_in;输入数据流data_in从外部输入存于数据寄存器din_r;数据寄存器din_r存储的前一刻时钟数据data_i1与数据data_in的后一刻时钟数据data_i0在减法器subtractor做减法得到的差值数据存储于数据差值寄存器data_dif;数据差值寄存器data_dif将差值数据存储到数据存储器data_ram;计数器cnt_num计数差值数据data_dif的个数,数据存储器data_ram每输入一个差值数据data_dif,计数器cnt_num便加’d1,等加到kernel-1个数据时,便有kernel(计数器是从0开始计数)个数据存储在数据存储器data_ram;数据存储器data_ram每次输出一组数据在比较器comparator中作比较,若符合比较条件,则vld_r信号等于’d1,并输出给信号计数器vld_num;信号计数器vld_num计数vld_r信号为’d1的次数vld_num,并将计数值vld_num存入数据寄存器vld_d;数据寄存器vld_d输出信号vld_d与比较器comparator输出信号vld_r在与门rtl_and作与计算,若输出信号data_vld结果为’d1,则输入数据流为跨步数据流。

数据存储器data_ram每次输出一组数据data_ram[n],每组包括kernel个数据。将该组数据传输至比较器comparator。

比较器comparator每次对每组数据data_ram[n]作如下判断:

1、判断每组数据data_ram[kernel-1]是否<0?

2、判断每组数据data_ram[kernel_size-1]和data_ram[kernel-kernel_size-1]是否等于image_width-kernel_size+1的值?

3、判断每组数据除上述外的数据是否相等?

当上述三个条件均满足,比较器comparator输出vld_r信号等于’d1;

而后,数据寄存器vld_d判断((image_withe-kernel_size+stride)/stride)2==vld_num是否成立,若等式成立则第二数据寄存器输出信号vld_d=‘d1;

最后,与门rtl_and计算data_vld=vld_r&&vld_d的值,并输出信号data_vld,则输入数据流为跨步数据流。

如图2所示,比较器comparator包括第一比较单元、第二比较单元、第三比较单元。

第一比较单元与数据存储器data_ram中的data_ram[kernel-1]数据块相连,第二比较单元与数据存储器data_ram中的data_ram[kernel_size-1]数据块和data_ram[kernel-kernel_size-1]数据块相连,第三比较单元与数据存储器data_ram中剩下的data_ram数据块相连。系统参数对比值与第一比较单元和第二比较单元相连。其中第一比较单元执行上述第(1)个判断条件,第二比较单元执行上述第(2)个判断条件,第三比较单元执行上述第(3)个判断条件。

第一比较单元由一个比较器电路构成,该比较器电路一端与gnd连接,另一端与数据存储器data_ram中的data_ram[kernel-1]数据块连接,当数据存储器data_ram中的data_ram[kernel-1]数据块输出的值小于0时(即第(1)个条件成立),第一比较单元的比较器电路输出1给第二比较单元;

第二比较单元由两个比较器电路和两个与门电路构成,其中第一个比较器电路的两端分别与数据存储器data_ram中的data_ram[kernel_size-1]数据块和data_ram[kernel-kernel_size-1]数据块相连,当数据存储器data_ram中的data_ram[kernel_size-1]数据块输出的值和data_ram[kernel-kernel_size-1]数据块输出的值相等时,第一个比较器电路输出1,第二个比较器电路的一端与系统设定值连接,另一端与数据存储器data_ram中的data_ram[kernel_size-1]数据块或data_ram[kernel-kernel_size-1]数据块连接,当数据存储器data_ram中的data_ram[kernel_size-1]数据块输出值或data_ram[kernel-kernel_size-1]数据块输出值与系统设定值相同时,第二个比较器电路输出1,第一个与门电路的一端与第一比较单元的比较器电路输出端连接,另一端与第一个比较器电路输出端连接,输出端与第二与门电路的一端连接,第二与门电路的另一端与第二个比较器电路的输出端连接,当第一个比较器电路输出1、第二个比较器电路输出1(即第(2)个条件成立),且第一比较单元的比较器电路输出1(即第(1)个条件成立)时,第二与门输出1给第三比较单元;

第三比较单元采用kernel-kernel_size-2个比较器电路和kernel-kernel_size-2与门电路构成,该kernel-kernel_size-2个比较器电路和kernel-kernel_size-2与门电路用于实现数据存储器data_ram中剩下的data_ram数据块输出值的比较,比较原理同第二比较单元,此处不再赘述,当数据存储器data_ram中剩下的data_ram数据块输出值均相等时(即第(3)个判断条件成立),即第三比较单元的第kernel-kernel_size-3与门电路输出1给第三比较单元的第kernel-kernel_size-2与门电路的一端,第三比较单元的第kernel-kernel_size-2与门电路的另一端与第二比较单元的第二与门输出端连接,在第(1)个条件、第(2)个条件均成立时,第二比较单元的第二与门输出1,此时第三比较单元的第kernel-kernel_size-2与门电路输出1(即’d1,’d表示十进制)。

如图3所示,本发明还提供了一种基于上述电路的跨步访问数据流检测方法,包括如下步骤:

步骤一:定义系统变量image_width、kernel_size、kernel、stride、width等(该些参数由跨步访问数据流特点决定);

步骤二:输入数据data_in存入第一数据寄存器,输入使能信号enable延时一个时钟周期;

步骤三:第一数据寄存器存储的前一刻时钟数据与数据data_in的后一刻时钟数据在减法器做减法得到的差值数据并存入数据差值寄存器;

步骤四:计数器开始计数存入数据差值寄存器的数据的个数并计数到kernel-1个,将每kernel个数据记为一组;

步骤五:比较器判断每组数据的[kernel-1]个数据是否小于0且判断每组数据的第[kernel_size-1]个数据和第[kernel-kernel_size-1]个数据==image_width-kernel_size+1,若是,则比较器判断每组数据除上述外的数据是否相等,若是,执行步骤六;

步骤六:比较器输出信号vld_r=’d1;

步骤七:信号计数器计数信号vld_r值为’d1的个数并输出计数值vld_num给第二数据寄存器;

步骤八:第二数据寄存器判断((image_withe-kernel_size+stride)/stride)2==vld_num是否成立,若等式成立则第二数据寄存器输出信号vld_d=‘d1;

步骤九:与门计算data_vld=vld_r&&vld_d的值,并输出信号data_vld。

例1:

设定参数image_width=13、kernel_size=3、kernel=9、width=28等,

假设输入数据流如下:0x00、0x01、0x02、0x0d、0x0e、0x0f、0x1a、0x1b、0x1c、0x02、0x03、0x04、0x0f、0x10、0x11、0x1c、0x1d、0x1f、0x04、0x05等。

经数据寄存器、减法器减法完得差值数据流0x01、0x01、0x0c、0x01、0x01、0x0c、0x01、0x01、fxe6、0x01、0x01、0x0c、0x01、0x01、0x0c、0x01、0x01、fxe6、0x01等。因为kernel=9,所以每9个差值数据记为一组存入数据存储器中,即第一组差值数据为0x01、0x01、0x0c、0x01、0x01、0x0c、0x01、0x01、fxe6,计data_ram[0]~data_ram[8]。

(1)判断每组第9个数据fxe6是否小于0;

(2)判断每组第3个数据0x0c和第6个数据0x0c是否相等且数值为image_width-kernel_size+1=11;

(3)判断每组除上述外的数据是否相等且均等于0x01;

上述三个判断等式成立vld_r=‘d1;

计数器计数vld_r等于‘d1的次数,并输出次数值vld_num;

在数据寄存器vld_d判断((image_withe-kernel_size+stride)/stride)2==vld_num是否成立,本例等式两边数值均为12,等式成立,输出信号vld_d=‘d1;

与门计算data_vld=vld_r&&vld_d的值,本例输出信号data_vld=‘d1;

则该访存数据流为跨步数据流。

本发明采用xilinx的artix-7ma701开发板上进行验证,电路的消耗资源与功耗如表1所示,资源及功耗较低,能准确测试跨步数据流的访问类型。

表1电路消耗资源与功耗图

以上是本发明的较佳实施例,凡依本发明技术方案所作的改变,所产生的功能作用未超出本发明技术方案的范围时,均属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1