Verilog功能模块——标准FIFO转FWFT FIFO

news2025/1/13 9:32:24

前言

在使用FIFO IP核时,我更喜欢使用FWFT(First Word First Through) FIFO而非标准FIFO,FWFT FIFO的数据会预先加载到dout端口,当empty为低时数据就已经有效了,而rd_en信号是指示此FIFO更新下一个数据,这种FWFT FIFO的读取延时是0。无需关心读延时使得读端口的控制变得非常简单,所以,我自编的一些模块均使用了FWFT FIFO的读端口作为接口。

但是,最近我开始使用国产的FPGA,安路的EG4系列,对应的开发工具TD(TangDanasty)中的FIFO只有Stardard FIFO这一种,并没有提供FWFT FIFO的选项,如果将标准FIFO读端口与以FWFT FIFO读端口为端口的模块连接,原本正常工作的模块逻辑就会出问题。

因此,我设计了一个标准FIFO读端口转FWFT FIFO读端口的模块,名为standardFIFO2FWFTFIFO.v,通过此模块能将Stardard FIFO读端口转为FWFT FIFO读端口,转换后端口的行为与真实的FWFT FIFO读端口完全一致。


一. 模块框图

Verilog功能模块——标准FIFO转FWFT FIFO-1

信号说明:

分类信号名称输入/输出说明
参数STANDARD_FIFO_READ_LATENCY标准FIFO读延时
0表示就是FWFT FIFO
1(默认)表示在rd_en有效后, 标准FIFO立刻更新数据;
2表示在rd_en有效后, 标准FIFO延迟一个读时钟再更新数据
依此类推
STANDARD_FIFO_DOUT_WIDTH标准FIFO输出数据位宽
FWFT FIFO读端口fwft_fifo_doutoutput转换后的FWFT FIFO数据输出
fwft_fifo_emptyoutput转换后的FWFT FIFO空信号
fwft_fifo_rd_eninput转换后的FWFT FIFO读使能
标准FIFO读端口standard_fifo_doutinput标准FIFO数据输出
standard_fifo_emptyinput标准FIFO空信号
standard_fifo_rd_enoutput标准FIFO读使能
时钟与复位clkinput模块工作时钟,与标准FIFO的读时钟应是同一时钟
srstinput复位信号,与标准FIFO的读复位应是同一信号,
高电平有效,以保持与Vivado中FIFO默认的复位电平一致

二. 部分代码展示

/*
! 模块功能: 将Standard FIFO的读端口转换为FWFT(First Word Fall Through) FIFO的读端口
!         (在Quartus中, Standard FIFO被称为Noraml FIFO, FWFT FIFO被称为Show-ahead FIFO)
* 思路:
  标准FIFO的读端口要变为FWFT FIFO的读端口, 两者的区别在于:
  Noraml FIFO的dout在empty为低时, 数据还不是新数据, 而是在rd_en有效后再延迟更新
  而FWFT FIFO的dout在empty为低时, 数据就已经是新数据, 在rd_en有效后立即更新下一个数据
1.直连两种FIFO的dout, 通过改变empty信号来指示数据是否有效
2.标准FIFO非空, 马上读数据, 模拟FWFT FIFO的dout行为; FWFT FIFO的rd_en使能, 标准FIFO如果非空则同步使能, 更新下一个数据
3.FWFT的empty信号在数据更新完成后拉低, 在数据更新过程中拉高 或 在读出最后一个数据后拉高
4.在FIFO复位时, 拉高fwft_fifo_empty
~ 使用:
1.READ_LATENCY = 0视为FIFO本身就是FWFT FIFO, 此时信号直连, 无任何操作
2.对于Standard FIFO, READ_LATENCY最小为1, 此时本模块可完全将Standard FIFO的读端口转为FWFT FIFO的读端口, 与真实的FWFT FIFO完全相同
3.对于READ_LATENCY大于等于2的情况, 因为读延迟影响, Standard FIFO的数据在连续读的过程中, 有效数据之间必然存在间隔, 所以, 此时本模块
  无法完全模拟FWFT FIFO, fwft_fifo_empty会间歇性拉高, 无法一直为低, 因为有效数据无法连续更新。
*/

module standardFIFO2FWFTFIFO
#(
  // 1(默认)表示在rd_en有效后, 标准FIFO立刻更新数据; 2表示在rd_en有效后, 标准FIFO延迟一个读时钟再更新数据
  parameter STANDARD_FIFO_READ_LATENCY = 1,
  parameter STANDARD_FIFO_DOUT_WIDTH = 8 // FIFO输出端口数据位宽
)(
  output wire [STANDARD_FIFO_DOUT_WIDTH-1 : 0] fwft_fifo_dout,
  output reg                                   fwft_fifo_empty,
  input  wire                                  fwft_fifo_rd_en,

  input  wire [STANDARD_FIFO_DOUT_WIDTH-1 : 0] standard_fifo_dout,
  input  wire                                  standard_fifo_empty,
  output wire                                  standard_fifo_rd_en,

  input  wire clk, // 此时钟必须也是FIFO的读时钟
  input  wire srst // 读端口同步复位, 高电平有效(与Xilinx FIFO复位电平保持一致)
);

三. 功能仿真

比较下以下情况下的fifo读端口行为与真实的FWFT FIFO是否一致:

情况一:每次写入单个数据

1.非空立即读

2.非空后间隔一段时间再读

情况二:一次写入多个数据

1.非空立即读

2.非空后间隔一段时间再读

testbench如下:

module standardFIFO2FWFTFIFO_tb();

timeunit 1ns;
timeprecision 10ps;

localparam STANDARD_FIFO_DIN_WDITH    = 8;
localparam STANDARD_FIFO_READ_LATENCY = 1;
localparam STANDARD_FIFO_DOUT_WIDTH   = 8;

logic [STANDARD_FIFO_DIN_WDITH-1:0] din;
logic                 wr_en;
logic                 full;

logic fwft_fifo_empty;
logic fwft_fifo_rd_en;

logic true_fwft_fifo_empty;
logic true_fwft_fifo_rd_en;

logic clk;
logic rstn;

standardFIFO2FWFTFIFOTop #(
  .STANDARD_FIFO_DIN_WDITH    (STANDARD_FIFO_DIN_WDITH   ),
  .STANDARD_FIFO_READ_LATENCY (STANDARD_FIFO_READ_LATENCY),
  .STANDARD_FIFO_DOUT_WIDTH   (STANDARD_FIFO_DOUT_WIDTH)
)  standardFIFO2FWFTFIFOTop_inst(.*);


// 生成时钟
localparam CLKT = 2;
initial begin
  clk = 0;
  forever #(CLKT / 2) clk = ~clk;
end


initial begin
  rstn = 0;
  wr_en = 1'b0;
  #(CLKT * 10)  rstn = 1;
  #(CLKT * 10);

  // 一次写入一个数据
  wr_en = 1'b1;
  #(CLKT) wr_en = 1'b0;

  #(CLKT*5)
  // 一次写入一个数据
  wr_en = 1'b1;
  #(CLKT) wr_en = 1'b0;

  #(CLKT*5)
  // 一次写入多个数据
  wr_en = 1'b1;
  #(CLKT*3) wr_en = 1'b0;

  #(CLKT*1)
  // 一次写入单个数据
  wr_en = 1'b1;
  #(CLKT) wr_en = 1'b0;

  #(CLKT * 30) $stop;
end


always_ff @(posedge clk) begin
  if (~rstn)
    din <= 'd0;
  else
    din <= din + 1;
end


localparam CLK_CNT_MAX = 4;
logic [$clog2(CLK_CNT_MAX+1)-1 : 0] clk_cnt;
always_ff @(posedge clk, negedge rstn) begin
  if (~rstn)
    clk_cnt <= '0;
  else if (clk_cnt < CLK_CNT_MAX)
    clk_cnt <= clk_cnt + 1'b1;
  else
    clk_cnt <= '0;
end


assign fwft_fifo_rd_en = ~fwft_fifo_empty && clk_cnt == CLK_CNT_MAX;

assign true_fwft_fifo_rd_en = ~true_fwft_fifo_empty && clk_cnt == CLK_CNT_MAX;


endmodule

仿真波形如下:

可以看到模块输出的fwft fifo与true fwft fifo的读端口行为是一致的,只是可能会超前或滞后一定的clk周期。

其实只要看empty信号拉低时,数据是否有效就可以了,有效的就是FWFT FIFO,无效的就是标准FIFO,从上图可见,在empty拉低后,模块输出的数据就已经是新数据了。

在标准FIFO延迟为1时,此模块可完全模拟FWFT FIFO的行为。

**注意这个延迟为1,指的是rd_en有效后,数据下一周期输出。**见上图。

调整延迟,将STANDARD_FIFO_READ_LATENCY设为2,注意,除了在testbench中修改以外,在FIFO配置界面也需要对应修改,如下图所示。

仿真波形如下:

因为读延迟为2,所以每次读完必须置高empty,等待输出数据有效。这就无法模拟FWFT FIFO数据连续有效的情形,但读端口的行为仍然是FWFT FIFO的行为。

读延时≥2的情形都是一样的,不再展示。


四. 工程分享

standardFIFO2FWFTFIFO Vivado 2021.2工程。

欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。

4230

建议复制过去不会码错字!


徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux基础】第30讲 Linux用户和用户组权限控制命令(二)

1&#xff09;sudo命令 sudo是Linux系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;如halt,reboot,su等等&#xff0c;这样不仅减少了root用户的登录和管理时间&#xff0c;同样也提高了安全性。 2&#xff09;修改配置…

Grafana设置默认主页

点击【设置/管理】-> 【默认首选项 Preferences】-> 【主页仪表盘】 在下拉中选择一个页面作为主页即可

山西电力市场日前价格预测【2023-09-22】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-22&#xff09;山西电力市场全天平均日前电价为322.75元/MWh。其中&#xff0c;最高日前电价为386.53元/MWh&#xff0c;预计出现在06: 45。最低日前电价为237.40元/MWh&#xff0c;预计…

Java高级-动态代理

动态代理 1.介绍2.案例 1.介绍 public interface Star {String sing(String name);void dance(); }public class BigStar implements Star{private String name;public BigStar(String name) {this.name name;}public String sing(String name) {System.out.println(this.name…

一个不怎么成功的三级菜单

三级菜单制作&#xff0c;菜单焦点总是消失&#xff0c;等发现好的再写一篇 发现 ​ 父元素设置了display:flex时&#xff0c;子元素中的display:none或者display:block就会失效。这是因为display:flex的优先级高于display:none和display:block&#xff0c;使他们的作用失效了。…

Map<K,V>的使用和List学习

Map Map是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。对于静态类型的查找来说&#xff0c;一般直接遍历或者用二分查找【不会对区间进行插入和删除操作】 而在现实生活中的查找比如&#xff1a; 根据姓名查询考试成绩通讯录…

RISC-V Reader 笔记(七)RV64,特权架构,未来可选扩展

RV64 比起 RV32&#xff0c;其实扩展不多。 主要是添加了一系列字&#xff0c;双字为单位的操作。 各个 ISA 32 64比较 x86&#xff1a;变量都存在寄存器里&#xff0c;不像 32 存在内存里&#xff0c;因此指令数少很多&#xff0c;但是因此添加了很多新操作码来操作更多的寄…

ctfshow web入门(2)

web11 打开这个网站&#xff0c;到网站诊断分析模块 搜索域名 web12 提示 有时候网站上的公开信息&#xff0c;就是管理员常用密码 打开&#xff0c;就是个购物网站 因为昨天刚做robots.txt 我就搜了一下 真的有&#xff0c;提示admin这个页面 访问一下&#xff0c;userna…

PTE阅读写作讲解

目录 FIB-R和FIB-R想要拿到65分以上的正确率要达到百分之75以上 1.通过因果关系猜词 2.通过同义词和反义词的关系猜词 3.通过定义或释义关系来推测词义 WE 只需要背一个万能模版就可以了&#xff08;160&#xff09; 只需要保证语法正确就可以了 文本中的实词不能出现第…

阿里云视频点播服务视频地址浏览器打开失效问题记录

我这边的视频都是存储到阿里云视频点播服务中,访问方式都是移动端通过api接口访问视频.现在需要从浏览器直接访问,上传视频成功之后,可以正常打开,但是过段时间地址就显示无法访问,具体显示内容为: 很明显,是视频地址失效了,以下是处理方式: 1.修改视频关联的存储桶读取权限,修…

1334. 阈值距离内邻居最少的城市

1334. 阈值距离内邻居最少的城市 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;DijkstraDijkstra_小顶堆Floyd_martix方法 原题链接&#xff1a; 1334. 阈值距离内邻居最少的城市 https://leetcode.cn/problems/find-the-city-with-th…

排序算法的奥秘:JAVA中的揭秘与实现

冒泡排序(Bubble Sort)是一种简单的排序算法&#xff0c;它通过多次迭代比较和交换相邻的元素来排序一个数组。每次迭代&#xff0c;较大的元素会逐渐"冒泡"到数组的末尾。以下是Java中实现冒泡排序的示例代码&#xff1a; public class BubbleSort { public sta…

【数据结构】链表的学习和介绍

前言 今天&#xff0c;我们来学习&#xff0c;数据结构中的链表 链表是什么 链表&#xff0c;就是多个结构体变量之间&#xff0c;通过结构体指针连接在一起的一种数据结构 提示&#xff1a; 本篇文章主要讲解动态链表&#xff0c;对于静态链表不做过多介绍 链表的分类 链…

ESP8266 WiFi物联网智能插座—硬件功能

目录 1、控制器板 2、采集器板 2.1、电源设计 2.2、控制器设计 2.3、电量采集电路设计 2.4、按键和LED指示灯设计 ESP8266 WiFi物联网智能插座的硬件功能主要包括两部分&#xff1a;控制器板和采集器板。 焊接成品效果如下图所示&#xff1a; 1、控制器板 控制器板是ES…

PAT 1029 旧键盘

PAT 1029 旧键盘 题目描述思路讲解代码展示 题目描述 思路讲解 分析&#xff1a;用string的find函数&#xff5e;遍历字符串s1&#xff0c;当当前字符s1[i]不在s2中&#xff0c;它的大写也不在ans中时&#xff0c;将当前字符的大写放入ans中&#xff0c;最后输出ans字符串即可…

阿里巴巴商品详情接口

阿里巴巴商品详情接口是阿里巴巴API接口的一种&#xff0c;可获取到商品链接、商品ID、商品标题、商品价格、品牌名称、店铺昵称、sku规格、sku属性、发货地、详情属性、店铺信息等参数&#xff0c;接口对接可适用于选品上架、数据分析、代购商城建站、erp系统商品数据选品、价…

怒刷LeetCode的第10天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;两次拓扑排序 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;分治法 方法二&#xff1a;优先队列&#xff08;Priority Queue&#xff09; 方法三&#xff1a;迭代 第三题 题目来源 题目内容…

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

Vulnhub系列靶机-Infosec_Warrior1

文章目录 Vulnhub系列靶机-Infosec_Warrior11. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用4. 权限提升 Vulnhub系列靶机-Infosec_Warrior1 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.191发现22端口和80端口是…

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找 所谓的查找或搜索&#xff0c;指从一组数据对象中找出符合特定条件者&#xff0c;这是构建算法的一种基本而重要的操作。其中的数据对象&#xff0c;统一地表示和实现为 词条&#xff08;entry&#xff09; 的形式&#xff1b;不同词条之间&#xff0c;依照各自的 关键码…