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

目录

  • 实验内容
  • 实验原理
  • 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) beginif(!rst_n) beginstart_cnt <= 8'b0;endelse if(state) beginstart_cnt <= 8'b0;endelse beginstart_cnt <= start_cnt + 8'b1;endendalways@(posedge sys_clk_50M) beginif(!rst_n) beginstate <= 1'b0;endelse if(start_cnt == 8'd60) beginstate <= 1'b1;endend// 组合逻辑赋值wr_en,当state为1时,wr_en的取值与full信号相反assign wr_en = (state == 1'b1) ? ~full : 1'b0;// 赋值dinalways@(posedge sys_clk_100M) beginif(!rst_n) begindin <= 16'b0;endelse if(wr_en) begindin <= din + 16'b1;endend// 组合逻辑赋值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
**********************************************/// 初始化 clkassign sys_clk_n = ~sys_clk_p;initial beginsys_clk_p = 1;forever #2.5 sys_clk_p = ~sys_clk_p;   end// 初始化 rstinitial beginrst_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.mzph.cn/diannao/52790.shtml

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

相关文章

一个php快速项目搭建框架源码,带一键CURD等功能

介绍&#xff1a; 框架易于功能扩展&#xff0c;代码维护&#xff0c;方便二次开发&#xff0c;帮助开发者简单高效降低二次开发成本&#xff0c;满足专注业务深度开发的需求。 百度网盘下载 图片&#xff1a;

Redis 入门到精通1

一、String&#xff08;字符串&#xff09; 特点&#xff1a; 最基本的数据类型&#xff0c;二进制安全&#xff0c;可以存储任何数据&#xff0c;比如图片或者序列化的对象。一个 key 对应一个 value。 常用命令及示例&#xff1a; SET key value&#xff1a;设置一个键值对。…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

CannotCreateTransactionException产生原因及解决方案

CannotCreateTransactionException 是 Spring 框架中的一个异常&#xff0c;通常出现在使用 Spring 的事务管理器时。该异常表明事务无法创建&#xff0c;可能是由于与底层资源&#xff08;如数据库连接&#xff09;相关的问题导致的。这是一个运行时异常&#xff0c;通常与 Da…

MySQL 函数、约束、多表查询与事务详解

在 MySQL 数据库中&#xff0c;函数、约束、多表查询和事务是非常重要的概念&#xff0c;它们可以帮助我们更好地管理和操作数据。本文将详细介绍这些概念&#xff0c;并通过代码演示来帮助你更好地理解。 一、函数 MySQL 提供了许多内置函数&#xff0c;可以用于处理字符串、数…

【网络安全】服务基础第一阶段——第六节:Windows系统管理基础---- DNS部署与安全

计算机智能识别并用IP地址定位&#xff0c;例如我们想要访问一个网页&#xff0c;其实是只能使用这个网页的IP地址&#xff0c;即四位的0&#xff5e;255来访问&#xff0c;但这一串数字难以记忆&#xff0c;于是就有了DNS&#xff0c;将难以记忆的数字转化为容易记忆的域名&am…

odbc连接达梦数据库DM8

odbc连接达梦数据库DM8 1 环境介绍2 达梦数据库安装3 odbc安装3.1 查询yum 匹配的odbc安装包3.2 安装 unixODBC.x86_64 4 配置odbc4.1 查看odbc 环境信息 5 odbc连接dm8成功5.1 配置 odbcinst.ini5.2 配置 odbc.ini5.3 odbc 连接达梦数据库5.3.1 dmdba 用户使用isql5.3.2 root …

AI模型:追求全能还是专精?

OpenAI计划在秋季推出的代号为“草莓”的新AI模型&#xff0c;展现了从数学问题到主观营销策略等多样化处理能力&#xff0c;这确实是一个引人注目的全能型AI发展的里程碑。关于全能型AI是否代表未来趋势&#xff0c;以及相比专业型AI产品是否具有更广阔的经济市场和用户吸引力…

合宙LuatOS产品规格书——Air700EAQ

Luat Air700EAQ是合宙的LTE Cat.1bis通信模块&#xff0c;采用移芯EC716E平台&#xff0c;支持LTE 3GPP Rel.13技术。 该模块专为满足小型化、低成本需求而设计&#xff0c;具备超小封装和极致成本优势。 Air700EAQ支持移动双模&#xff0c;内置丰富的网络协议&#xff0c;集…

获取Word、PPT、Excel、PDF文件页数及加密校验

想要获取一个pdf文件的页数&#xff0c;有多种实现方式。可以利用pdfjs&#xff0c;也可以利用PDFDocument&#xff1a; // 方法一&#xff1a;利用文件的arrayBuffer let arrayBuffer await file.arrayBuffer(); const pdfDoc await PDFDocument.load(arrayBuffer, { ignor…

基于AI大模型开发上层应用常见的技术栈

基于AI大模型的上层应用开发&#xff0c;技术栈要求通常包括以下几个方面&#xff1a; 编程语言&#xff1a;Python是AI领域的主要编程语言&#xff0c;具有大量的库和框架支持&#xff0c;是大模型开发的首选语言 。TypeScript也是不错的选择&#xff0c;很多模型对外提供类似…

LuaJit分析(六)luajit -bl 命令分析

Luajit -bl命令用于将luajit字节码文件或者lua脚本文件反汇编&#xff0c;输出汇编指令&#xff0c;很好奇怎么将字节码文件和lua脚本文件放在一块处理的&#xff0c;下面一步步分析&#xff1a; luajit虚拟机由luajit.c文件生成&#xff0c;首先定位到main函数&#xff0c;代…

【ceph学习】ceph如何进行数据的读写(3)

本章摘要 上文说到&#xff0c;osdc中封装请求&#xff0c;使用message中的相关机制将请求发送出去。 本文详细介绍osd服务端如何进行请求的接收。 osd初始化 osd启动时&#xff0c;定义了message变量ms_public&#xff0c;该变量绑定public网络&#xff0c;负责接收客户端的…

Java使用POI创建带样式和公式的Excel文件

这篇文章将演示如何使用POI 创建带样式和公式的Excel文件。 代码 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream; import java.io.IOException;public class ExcelDemo {public static void mai…

FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线(FPGA专业知识的学习方向,FPGA现场可编程门阵列学习路线和方向)

前言 前几篇讲了一下FPGA的发展和应用&#xff0c;以及未来前景。具体详细&#xff0c;请看 FPGA发展和应用&#xff0c;以及未来前景https://blog.csdn.net/weixin_65793170/category_12665249.html 这里我们来&#xff0c;记录一下&#xff0c;FPGA专业知识的学习路线 一.…

Python(C++)自动微分导图

&#x1f3af;要点 反向传播矢量化计算方式前向传递和后向传递计算方式图节点拓扑排序一阶二阶前向和伴随模式计算二元分类中生成系数高斯噪声和特征二元二次方程有向无环计算图超平面搜索前向梯度下降算法快速傅里叶变换材料应力和切线算子GPU CUDA 神经网络算术微分 Pytho…

理解 decltype() 指定符(C++ 11 及以上版本)

目录 1. 功能 2. 语法格式 3. 理解 3.1 第一点 1.2 第二点 4. 例释 在 C 编程语言中&#xff0c;decltype 是一个用于检查实体的声明类型或表达式的类型和值类别的关键字。该关键字在 C11 中引入&#xff0c;主要用于泛型编程中&#xff0c;因为在泛型编程中&#x…

数据类型 NVARCHAR2 与 VARCHAR2 的对比

数据类型 NVARCHAR2 与 VARCHAR2 的对比 在数据库系统中&#xff0c;字符数据类型是用于存储文本数据的关键部分。在达梦数据库&#xff08;DM Database&#xff09;以及许多其他关系数据库管理系统&#xff08;例如 Oracle&#xff09;&#xff0c;常见的字符数据类型有 NVAR…

C语言阴阳迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <Windows.h> enum WASD {W…

CityHash、FarmHash

CityHash和FarmHash都是由Google开发的非加密哈希函数&#xff0c;专为快速处理大量数据而设计。它们在数据中心和大规模分布式系统中尤其有用&#xff0c;用于任务如数据分区、查找优化、数据校验等。这两种哈希函数都以其高效的性能和良好的分布特性而著称。 CityHash City…