野火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 时序图

在这里插入图片描述

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

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

1234
pi_flagwr_en2 、data_in2 、rd_endout 、 po_flag_regwr_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变量中进行调用。

为什么fifo1的写入要比fifo2的写入晚两拍呢?

因为wr_en1信号在第一行数据传入的时候还可以由pi_flag信号控制,但是当后面的数据传入的时候,不能直接使用pi_flag信号进行控制了,因为第二行数据传入的时候第一行数据不需要写入,而再后面的数据传入的时候需要写入,正是因为这样的两种情况导致wr_en1信号不能仅使用pi_flag信号控制。

疑惑1: 野火的教程里使用wr_en2和rd_en作为条件生成了一个reg型daut_flag信号,并用这个信号去控制wr_en1信号,可不可以直接将wr_en2信号直接替代daut_flag信号,这样两个fifo的写入时机就只相差两个时钟周期。

疑惑2: rd_en信号和wr_en2信号是在同一拍,理论上是在这一时间段完成了读取和写入的操作,但是怎么确定rd_en信号一定在写操作之前完成呢?
目前我认为可能是fifo默认在这种情况下是先读后写。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值