FPGA上板项目(四)——FIFO测试

news2024/11/16 11:32:38

目录

  • 实验内容
  • 实验原理
  • FIFO IP 核
  • 时序绘制
  • HDL 代码
  • 仿真
  • 综合实现
  • 上板测试


实验内容

  • 理解 FIFO 原理
  • 调用 FIFO IP 核完成数据读写

实验原理

  • FIFO:First In First Out,先入先出式数据缓冲器,用来实现数据先入先出的读写方式。可分类为同步 FIFO 和异步 FIFO,读写时钟相同即为同步 FIFO,读写时钟不同即为异步 FIFO。
  • FIFO 框图:

在这里插入图片描述

  • FIFO 端口定义与说明:
写端口说明读端口说明
wr_clk写时钟rd_clk读时钟
wr_en写使能rd_en读使能
din写入的数据dout读出的数据
full满信号empty空信号
almost_full将满信号almost_empty将空信号
prog_full可配置满信号prog_empty可配置空信号

full:当 FIFO 已满时,满信号输出高电平,此时的写入操作失效。
almost_full:当 FIFO 差一个数据即满时,将满信号输出高电平,此时只可再进行一次写入操作。
prog_full:用户可自定义阈值,若 FIFO 存储的数据量超过阈值,可配置满信号输出高电平。

FIFO IP 核

  • 添加 FIFO Generator IP 核:IP Catalog -> FIFO Generator
  • Basic 界面
    • Fifo Implementation:用来设置同步/异步,以及使用的资源,常用为 Independent Clocks Block RAM
    • Synchronization Stages:跨时钟域逻辑的同步器级数,保持默认即可。数值 2 代表,empty 信号会在 FIFO 成功写入数据后的 2 个读时钟周期后拉低。

在这里插入图片描述

  • Native Ports 界面
    • Read Mode:Standard FIFO 标准模式,输出数据延迟读使能一拍,First Word Fall Through 预读模式,输出数据与读使能同步。
    • Data Port Parameters:调整数据位宽和深度
    • ECC:数据校验时开启,这里默认不开启
    • Output Registers:输出寄存器,可以改善 FIFO 时序,但输出会延迟一拍
    • Initialization:设置复位信号,Enable Reset Synchronization 启用同步复位
    • Enable Safety Circuit:启用安全电路,复位信号至少要保持八个时钟周期(以慢时钟为准)的有效,且在复位后至少要经过六十个时钟周期(以慢时钟为准)后,才能对 FIFO 进行写数据操作。
    • 其余保持默认,最后会统计出输出延迟 Read Latency

在这里插入图片描述

  • Status Flags 界面:可配置标志位信号,有需求时启用
  • Data Counts 界面:可配置读写数据计数,有需求时启用

时序绘制

  • 实验按照异步 FIFO 进行设计,使用 100MHz 时钟信号作为写时钟,50MHz 时钟信号作为读时钟。
  • 复位后,由于安全电路的存在,慢时钟(读时钟)计数六十拍后才可启动 FIFO,启动后将标志位 state 信号拉高。
  • 启动后,若 FIFO 未满,即 full 信号为低电平时,则拉高 wr_en,开始写数据;启动后,若 FIFO 不空,即 empty 信号为低电平,则拉高 rd_en,开始读数据。

在这里插入图片描述

HDL 代码

`timescale 1ns / 1ps
module FIFO(
    input wire sys_clk_p,
    input wire sys_clk_n,
    input wire rst_n
);
        
/**********************************************
*********** 例化PLL
**********************************************/
    wire sys_clk_100M;
    wire sys_clk_50M;
    wire locked;
    clk_wiz_0 inst_clk(
        // Clock out ports
        .clk_out1(sys_clk_100M),     // output clk_out1
        .clk_out2(sys_clk_50M),     // output clk_out2
        // Status and control signals
        .reset(1'b0), // input reset
        .locked(locked),       // output locked
       // Clock in ports
        .clk_in1_p(sys_clk_p),    // input clk_in1_p
        .clk_in1_n(sys_clk_n)    // input clk_in1_n
    );
    
/**********************************************
*********** 例化FIFO
**********************************************/
    reg [15:0] din;
    wire wr_en;
    wire rd_en;
    wire [15:0] dout;
    wire full;
    wire empty;
    wire wr_rst_busy;
    wire rd_rst_busy;
    fifo_0 inst_fifo (
      .rst(!rst_n),                  // input wire rst
      .wr_clk(sys_clk_100M),            // input wire wr_clk
      .rd_clk(sys_clk_50M),            // input wire rd_clk
      .din(din),                  // input wire [15 : 0] din
      .wr_en(wr_en),              // input wire wr_en
      .rd_en(rd_en),              // input wire rd_en
      .dout(dout),                // output wire [15 : 0] dout
      .full(full),                // output wire full
      .empty(empty),              // output wire empty
      .wr_rst_busy(wr_rst_busy),  // output wire wr_rst_busy
      .rd_rst_busy(rd_rst_busy)  // output wire rd_rst_busy
    );
      
/**********************************************
*********** 信号赋值
**********************************************/  
    // 赋值启动标志位,state为高时代表可以开始FIFO读写
    reg state;
    reg [7:0] start_cnt;
    always@(posedge sys_clk_50M) begin
        if(!rst_n) begin
            start_cnt <= 8'b0;
        end
        else if(state) begin
            start_cnt <= 8'b0;
        end
        else begin
            start_cnt <= start_cnt + 8'b1;
        end
    end
    always@(posedge sys_clk_50M) begin
        if(!rst_n) begin
            state <= 1'b0;
        end
        else if(start_cnt == 8'd60) begin
            state <= 1'b1;
        end
    end

    // 组合逻辑赋值wr_en,当state为1时,wr_en的取值与full信号相反
    assign wr_en = (state == 1'b1) ? ~full : 1'b0;
    
    // 赋值din
    always@(posedge sys_clk_100M) begin
        if(!rst_n) begin
            din <= 16'b0;
        end
        else if(wr_en) begin
            din <= din + 16'b1;
        end
    end
    
    // 组合逻辑赋值rd_en,当state为1时,rd_en的取值与empty信号相反
    assign rd_en = (state == 1'b1) ? ~empty : 1'b0;
    
/**********************************************
*********** 例化ILA
**********************************************/ 
    ila_0 inst_ila (
        .clk(sys_clk_100M), // input wire clk
        .probe0(state), // input wire [0:0]  probe0  
        .probe1(wr_en), // input wire [0:0]  probe1 
        .probe2(din), // input wire [15:0]  probe2 
        .probe3(rd_en), // input wire [0:0]  probe3 
        .probe4(dout) // input wire [15:0]  probe4
    );

endmodule

仿真

testbench 代码:

`timescale 1ns / 1ps
module tb_FIFO();
    
/**********************************************
*********** 实例化模块
**********************************************/
    reg sys_clk_p;
    wire sys_clk_n;
    reg rst_n;
    FIFO tb_FIFO(
        .sys_clk_p(sys_clk_p),
        .sys_clk_n(sys_clk_n),
        .rst_n(rst_n)
    );
    
/**********************************************
*********** 初始化 clk、rst
**********************************************/
    // 初始化 clk
    assign sys_clk_n = ~sys_clk_p;
    initial begin
        sys_clk_p = 1;
        forever #2.5 sys_clk_p = ~sys_clk_p;   
    end
    
    // 初始化 rst
    initial begin
        rst_n = 0;
        #302.5;
        rst_n = 1;
    end
endmodule

仿真时序图:

在这里插入图片描述

  • 当 start_cnt 计数到 60 后,state 标志位置一,开始启动 FIFO
  • 当 wr_en 置高,FIFO 开始写入数据,当 rd_en 置高,FIFO 开始读出数据,输出的数据延迟 rd_en 一拍

在这里插入图片描述

  • 当 FIFO 存满时,full 信号被拉高,等待数据被读取后, full 信号被拉低,即可再次写入数据

综合实现

添加管脚和时序约束后,run synthesis 以及 run implementation,具体步骤可参考:FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试

上板测试

上板测试结果如下:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

论文翻译 | 通过逻辑增强大型语言模型中的零样本思维链推理

摘要 大型语言模型的最新进展已经展示了它们在各个领域的卓越泛化性。然而&#xff0c;他们的推理能力仍有很大的提高空间&#xff0c;特别是在面对需要多步骤推理的场景时。虽然大型语言模型拥有广泛的知识&#xff0c;但它们的推理往往不能有效地利用这些知识来建立连贯的思维…

机器学习/数据分析--通俗语言带你入门决策树(结合分类和回归案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…

[LeetCode]根据决策树设计代码解决dfs

目录 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 决策树&#xff1a;根据题意可以知道&#xff0c;全排列需要找到数组内元素不重复的所有排列方式&#xff0c…

Java面向接口编程——开发打印机

题目&#xff1a; 墨盒&#xff1a;彩色、黑白 纸张类型&#xff1a;A4、B5 墨盒和纸张都不是打印机厂商提供的 打印机厂商要兼容市场上的墨盒、纸张 墨盒接口&#xff1a; public interface InkBox {String colorInkBox(); // 墨盒颜色} 纸张接口&#xff1a; public i…

Centos 添加双网卡 (生产环境配置记录)

1、在虚拟机中添加网卡2 [rootntpserver network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo …

前端(Vue)tagsView(子标签页视图切换) 原理及通用解决方案

文章目录 tagsView 方案总结tagsView 原理分析创建 tags 数据源生成 tagsViewtagsView 国际化处理contextMenu 展示处理contextMenu 事件处理处理 contextMenu 的关闭行为处理基于路由的动态过渡 tagsView 方案总结 整个 tagsView 整体来看就是三块大的内容&#xff1a; tags…

【SAM下游任务微调】TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks

TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks 论文链接&#xff1a;https://arxiv.org/pdf/2408.01835 代码链接&#xff1a;https://github.com/maoyangou147/TS-SAM 一、摘要 基于适配器的微调方法已经被研究用于改进SAM在下游任务上的性能。然而&am…

【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task1

本文是关于李宏毅苹果书“第1章 机器学习基础”学习内容的记录。 1、术语解释 术语解释机器学习&#xff08;Machine Learning, ML&#xff09;机器学习是一种人工智能&#xff08;AI&#xff09;技术&#xff0c;它使计算机能够从数据中学习并做出决策或预测&#xff0c;而无…

【python计算机视觉编程——3.图像到图像的映射】

python计算机视觉编程——3.图像到图像的映射 3.图像到图像的映射3.1 单应性变换3.1.1 直接线性变换算法&#xff08;DLT&#xff09;3.1.2 仿射变换 3.2 图像扭曲3.2.1 图像中的图像3.2.2 分段仿射扭曲3.2.3 图像配准 3.3 创建全景图3.3.1 RANSAC3.3.2 稳健的单应性矩阵估计3.…

【二叉树】LC405-删除二叉搜索树的节点

文章目录 1 删除二叉树的节点思路其他代码参考 1 删除二叉树的节点 https://leetcode.cn/problems/delete-node-in-a-bst/description/ 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。…

探索全球设计灵感:六大海外设计平台

海外设计网站对于设计师而言&#xff0c;不仅是灵感的源泉&#xff0c;更是专业成长的加速器。这些平台聚集了全球创意人士&#xff0c;提供了一个分享和发现最新设计趋势的环境。设计师可以通过这些网站学习行业内的创新技术&#xff0c;参与设计挑战&#xff0c;提升个人设计…

End-to-End视觉里程计新突破:从运动模糊图像中精确估计相机姿态

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;MBRVO: A Blur Robust Visual Odometry Based on Motion Blurred Artifact Prior 作者&#xff1a;Jialu Zhang, Jituo Li*, Jiaqi Li, Yue Sun, Xinqi Liu, Zhi Zheng,…

饮水机复杂交互功能联网调试

饮水机复杂交互功能联网调试 引言 饮水机我们从最开始的放水和加热, 逐渐拓展到保温功能, 童锁功能, 红外检测功能, 对于这些复杂的交互功能, 我们如果通过按键进行调试, 会极大的增加我们的开发时间和成本, 如果我们频繁的进行烧录, 则如果涉及到一些中间变量, 则无法进行调试…

帆软BI怎么制作不等宽柱状图

帆软BI怎么制作不等宽柱状图 文章目录 帆软BI怎么制作不等宽柱状图不等宽柱状图起源一、怎么做不等宽柱状图准备二、操作步骤1.展示效果2.操作步骤-3.操作步骤 -图形属性4.操作步骤 -组件样式5.操作步骤 -横轴和纵轴6.完成7.不等宽柱状图与传统等宽柱状图对比 总结 不等宽柱状图…

【深度学习】嘿马深度学习笔记第5篇:神经网络与tf.keras,学习目标【附代码文档】

本教程的知识点为&#xff1a;深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 …

介绍云计算在医疗领域的应用实例

云计算在医疗领域的应用日益广泛&#xff0c;为医疗行业带来了诸多便利和创新。以下是几个典型的应用实例&#xff1a; 电子病历管理系统&#xff1a; 基于云计算技术的电子病历管理系统&#xff0c;通过互联网实现对病历数据的存储、管理、维护和查询等功能。这类系统能够自动…

关于助记词,词库的讨论

我有个想法&#xff0c;既然私钥碰撞的难度大。 -seed-&#xff08;pathmasterkey&#xff09;-privatekey-publickey-address 通过反推的难度大&#xff0c;那我可以尝试使用助记词碰撞 就例如&#xff0c;我生成1000个eth地址 1000个地址的助记词全部拿到&#xff0c;然后…

C++学习笔记——打印ASCII码

一、题目描述 二、代码 #include <iostream> using namespace std; int main() {char a_char;int a_int;cin >> a_char;a_int a_char;cout << a_int;return 0; }

【数据结构】关于TreeMap与TreeSet的使用你了解多少???

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解TreeMap与Set的相关知识&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/K1moi &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目录 &am…

开源模型应用落地-LangChain实用小技巧-使用各种Loader高效解析不同数据源(七)

一、前言 在 LangChain框架中&#xff0c;提供了Loader机制&#xff0c;以统一的方式来从各种数据源获取数据&#xff0c;使得开发人员可以方便地集成不同类型的数据源&#xff0c;而无需为每种数据源编写特定的加载代码。它可以将不同格式的数据转换为 LangChain 可以处理的统…