野火FPGA征途Pro学习笔记(fifo_sum)
作者:互联网
FIFO sum 原理
利用fifo进行串行数据流的行计算。
首先需要注意的是数据是从一根数据线上传输过来的。
这里我们以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 时序图
这个时序图是直接从野火的手册上复制的。
这张图片只能看出大致的数据情况,对一些信号的时序关系描述的并不清晰,下面是代码分析后的部分信号时序关系图。
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变量中进行调用。
标签:FPGA,第三行,Pro,FIFO,时序,fifo,数据,sum,进行 来源: https://blog.csdn.net/m0_50882712/article/details/120570778