野火FPGA征途Pro学习笔记(fifo_sum)

FIFO sum 原理

利用fifo进行串行数据流的行计算。
野火FPGA征途Pro学习笔记(fifo_sum)
首先需要注意的是数据是从一根数据线上传输过来的。

这里我们以3行数据相加的情况举例;
3行数据相加,需要用到2个FIFO;这里给出规律,如果需要一次计算X行数据的和,则需要用到X-1个FIFO

首先将前X-1行的数据进行FIFO保存,之后第X行数据的每一次输入,都进行一次当前对应数字的求和,比如前两行数据为:

1 2 3 4
2 3 4 5

第三行的完整数据为:
3 4 5 6

那么
①当第三行中的数据传入到3时,将第1、 2行的对应位置的数字进行相加,1+2+3,进行输出或者后续运算。

②当第三行中的数据传入到4时,将第1、 2行的对应位置的数字进行相加,2+3+4,进行输出或后续运算。

③当第三行中的数据传入到5时,将第1、 2行的对应位置的数字进行相加,3+4+5,进行输出或后续运算。

④当第三行中的数据传入到6时,将第1、 2行的对应位置的数字进行相加,4+5+6,进行输出或后续运算。

由于每一行的数据并不是运算一次就被丢弃(不包含第一行数据),因此需要将该保存的数据进行保存,改丢弃的数据进行丢弃

所以在做sum运算的时候,每一个数据都需要换一行进行保存,也就是第X行数据本来没有FIFO,现在存储到第X-1个FIFO中,第X-1个FIFO中的数据存储到第X-2个FIFO中,以此类推,第一个FIFO中的数据进行丢弃

整个数据流传输完成,也就完成了整个sum运算。

FIFO sum 时序图

野火FPGA征途Pro学习笔记(fifo_sum)

这个时序图是直接从野火的手册上复制的。

这张图片只能看出大致的数据情况,对一些信号的时序关系描述的并不清晰,下面是代码分析后的部分信号时序关系图。

1 2 3 4
pi_flag wr_en2 、data_in2 、rd_en dout 、 po_flag_reg wr_en1 、data_in1 、po_flag

按照从1→4的时序关系,每一个数字相差一个时钟周期。

首先需要注意的是wr_en信号的高电平是传入FIFO数据的开关。
根据这个时序关系图可以看出,FIFO2的数据写入要比FIFO1的数据写入早2个时钟周期,因此可能会产生疑惑,
不应该是先用FIFO2数据覆盖FIFO1数据吗,怎么会先覆盖了FIFO2的数据再去赋值FIFO1呢

这里是因为rd_en信号与FIFO的写入信号是同一拍的,也就是说在FIFO2写入数据的时刻已经将所有FIFO的数据进行了一次读取,并保存在了变量data_outx中去,为此写入FIFO的数据不一定是直接从下一个FIFO直接调取的数据,而是从data_out变量中进行调用。

上一篇:(36)System Verilog类中方法示例


下一篇:AD9250 FPGA驱动开发