当前位置: 首页 > news >正文

ALTERA FPGA IPCORE核之FIFO详细教程

ALTERA FPGA IPCORE核之FIFO详细教程

一. FIFO简介

FIFO: 是英文first in first out的缩写,即先进先出,指的是对数据的存储具有先进先出特性的缓存器。从字面意思上就可以大致看出和RAM和ROM的区别,即没有地址线,无法像RAM和ROM一样写入或读出指定地址的数据,而必须按顺序读出。
根据读写操作是否使用同一个时钟,可以将FIFO分为两类:

  • 同步FIFO

    读写操作使用同一个时钟,一般用于数据缓存

  • 异步FIFO

    读写操作使用不同的时钟,一般用于跨时钟域处理,比如我们在做视频相关项目时,假如我们的摄像头的像素时钟是25MHZ,SDRAM的读写时钟是100MHZ,那我们要把采集到的视频数据写入SDRAM,那么就必须要用到异步FIFO,进行跨时钟域处理。还有一种应用场景,读写数据的位宽不一致时,比如写入的数据是16位,读出的数据需要8位,这时候使用异步FIFO,只需要分别选择写数据位宽和读数据位宽,非常方便,值得注意的是QuartusII中的同步FIFO,读数据位宽是无法进行更改,默认和写数据位宽一致。

二. FIFO IPCORE生成步骤及参数介绍

不同公司的FPGA,生成的FIFO大同小异,本篇我们以一个实例来对ALTERA的IPCORE来进行介绍。我们要生成一个写数据位宽8,读数据位宽16的异步FIFO,利用Modelsim仿真来观察FIFO的时序波形。

2.1 首先打开QuartusII软件,新建一个工程,命令为async_fifo_test

新建QuartusII工程的步骤就不一一说明,为了方便上板验证,选用我们开发板上的器件:EP4CE6F17C8

2.2 FIFO IPCORE配置

2.2.1 Tools–>MegaWizard Plug-In Manager,如下图所示:
在这里插入图片描述

2.2.1 生成IPCORE,命名为async_fifo_w8r16_d1024
我们在对IPCORE命名时,最好能体现出该IPCORE的一些主要特性,比如我们上面的命令,我们知道是一个异步FIFO,写数据位宽8,读数据位宽16,深度1024。说到这,就有必要说一下非对称读写位宽。读写数据的位宽可以不一致,但是必须满足比例关系:1:8,1:4,1:2,1:1,那么读写位宽不一致,数据的排序关系是怎么样的呢?我们分两种情况做一下说明:

  1. 写位宽大于读位宽,直截了当我做了一个简单的测试程序仿真出的波形如下:
    在这里插入图片描述

    通过仿真可以看出,写入16’h0102,先读出的是8’h02,接着读出的是8’h01,是不是和我们想的不一样,所以这个地方一定要注意噢

  2. 写位宽小于读位宽,直截了当我做了一个简单的测试程序仿真出的波形如下:
    在这里插入图片描述

    通过仿真可以看出,写入8’h01,8’h02两个数,读出的是16’h0201,是不是和我们想的不一样,所以这个地方一定要注意噢
    生成FIFO的步骤如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

当我们生成好后可以看到左边FIFO框图上显示了FIFO的输入输出接口,左下角是FIFO使用的FPGA内部资源。

FIFO各接口定义如下:

  1. wrfull:选用写时钟域,写满是指写得快读得慢,FIFO里面的存储数据超过了FIFO的深度,如果这时候再继续写,数据就会溢出丢失,所以这时需要禁止再往FIFO 中写入数据,防止数据溢出丢失。高电平表示FIFO写入数据量达到 FIFO 设置的最大空间
  2. rdempty:选用读时钟域,高电平表示 FIFO 中已经没有数据了,此时应该通过该信号控制读请求信号(也称为读使能信号),禁止
    FIFO 继续再读出数据,否则读出的将是无效数据。
  3. rdusedw:为FIFO里面存存储的数据个数。在某些应用场景下,我们需要用到usedw时钟监测FIFO存储的数据个数,但是需要注意,同步FIFO的数据计数是准确的,因为读写时钟相同,不需要做跨时钟域处理;但是异步FIFO的计数就不准确了,只能粗略的进行判断,比如半空,半满等。
  4. wrreq:写使能,高电平有效
  5. wrclk:写时钟
  6. data:写数据,位宽8
  7. rdreq:读使能,高电平有效
  8. rdclk:读时钟
  9. aclr:异步复位信号,用于清空 FIFO
  10. almost full:几乎满标志信号,我们可以控制 FIFO 快要被写满的时候和 full 信号的作用一样。
  11. almost empty:几乎空标志信号,我们可以控制 FIFO 快要被读空的时候和 empty 信号的作用一样。
  12. Synchronous clear:同步复位信号,用于清空 FIFO。
    10~12的信号,本例程的FIFO没有生成,大家可根据具体需求选择是否生成这些信号。

三. Verilog代码设计

`timescale 1ns / 100ps
module async_fifo_test(
	input	clk			,//50MHZ
	input	rst_n		,
	output	[15:0]	dout
	);
	reg	[ 7:0]	fifo_wdata	;
	reg			fifo_wren	;
	reg			fifo_rden	;
	wire[15:0]	fifo_rdata	;
	wire		fifo_wclk	;
	wire		fifo_rclk	;
	wire		locked		;
	reg	[9:0]	wr_cnt		;
	reg	[8:0]	rd_cnt		;
	assign	dout=fifo_rdata	;
	//注意需要在fifo_wclk时钟域下,因为fifo写使能和写数据都是在该计数器(wr_cnt)下生成
	always@(posedge fifo_wclk or negedge locked)begin
		if(!locked)
			wr_cnt<=0;
		else 
			wr_cnt<=wr_cnt+1;
	end
	//注意需要在fifo_rclk时钟域下,因为fifo读使能是在该计数器(rd_cnt)下生成
	always@(posedge fifo_rclk or negedge locked)begin
		if(!locked)
			rd_cnt<=0;
		else 
			rd_cnt<=rd_cnt+1;
	end
	//在fifo_wclk时钟域下生成FIFO写数据和写使能,位宽8位,写100个数据
	always@(posedge fifo_wclk or negedge locked)begin
		if(!locked)begin
			fifo_wren<=0;
			fifo_wdata<=0;
		end else if(wr_cnt>0&&wr_cnt<=100)begin
			fifo_wren<=1;
			fifo_wdata<=fifo_wdata+1;
		end else begin
			fifo_wren<=0;
		end
	end
	//在fifo_rclk时钟域下生成FIFO读使能,读数据的位宽是16位,所以读50个数据就将FIFo读空
	always@(posedge fifo_rclk or negedge locked)begin
		if(!locked)
			fifo_rden<=0;
		else if(rd_cnt>100&&rd_cnt<=150)
			fifo_rden<=1;
		else
			fifo_rden<=0;
	end
	//利用PLL生成FIFO的读写时钟,写时钟25MHZ,读时钟50MHZ
	pll Upll(
	.areset		(~rst_n		),
	.inclk0		(clk		),
	.c0			(fifo_wclk	),
	.c1			(fifo_rclk	),
	.locked 	(locked		)
	);
	//例化FIFO IPCORE
	async_fifo_w8r16_d1024 Uasync_fifo_w8r16_d1024(
	.aclr		(~rst_n		),//复位,高电平复位
	.data		(fifo_wdata	),//写数据
	.rdclk		(fifo_rclk	),//读时钟
	.rdreq		(fifo_rden	),//读使能
	.wrclk		(fifo_wclk	),//写时钟
	.wrreq		(fifo_wren	),//写使能
	.q			(fifo_rdata	),//读数据
	.rdempty	(),//读空标志
	.rdusedw	(),//在读时钟域下,FIFO中当前存储的数据个数,数据位宽16位
	.wrfull ()//写满标志
	);
endmodule

四. Verilog测试代码设计

`timescale 1ns / 100ps
module async_fifo_test_tb;
	reg					clk			=1;
	reg					rst_n		=0;
initial
	begin
		#1000
		rst_n=1;
	end
//生成激励时钟
always #10 clk<=~clk;
//例化被测试模块
async_fifo_test Uasync_fifo_test(
	.clk	(clk	),//50MHZ
	.rst_n	(rst_n	),
	.dout   (		)
	);
endmodule

五. 仿真波形分析

在这里插入图片描述

1.aclr	:fifo复位信号,高电平复位
2.wrclk	:fifo写时钟
3.wrreq	:fifo写使能,高电平时表示写入数据。
4.rdclk	:fifO读时钟
5.rdreq	:fifo读使能,高电平表示读数据,由于我们选择是正常模式,所以在rdreq有效时,会延时一个时钟周期才会出有效数据。
6.q:fifo读数据
7.rdempty:空标志,高电平表示fifo为空,在仿真波形中可以看出在fifo复位时且未写入数据时,rdempty为高电平,当前fifo为空。
8.rdusedw:FIFO里面存存储的数据个数,由于我们用的是异步fifO,这个数据并不能精确的反应fifo里面的数据个数,只能做一个参考。通过上面的仿真图也可以看出,rdusedw并没有精确的反应fifo中的数据个数。
9.wrfull:满标志,当fifo中存储的数据个数超过fifo自身的深度时,便会溢出,wrful置高。
通过上面的仿真图,我们可以看到wrfull一直为低,所以fifo数据未溢出,不会造成数据丢失。同时,fifo在进行读操作时,rdempty一直为低,说明在读数据时,fifo中一直有数据,不会读出无效数据。一般来说,只要fifo操作满足以上两个条件,便可进行正常的数据写入和读取。

相关文章:

  • 【ELK】日志分析系统概述及部署
  • MyBatis一对多查询,MyBatis中resultMap的使用,MyBatis中collection注意事项,MyBatis的级联搜索
  • STC15单片机-RS-485通信
  • 【JAVA-1】JDK、JRE安装及卸载,有手就会!
  • Python 操作MySql数据库(封装、优雅)
  • 《蓝海战略》让你竞争中获得优势
  • RequestMapping注解
  • 实战Spring Boot集成quartz任务调度框架
  • 神经网络深度学习(五)初始化
  • jvm虚拟机学习一class文件
  • 【编程题】【Scratch四级】2021.12 森林运动会
  • chapter 01 字符串的那些事
  • 给Python漫画分集标题下载工具开发Qt界面
  • 电子学会2022年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析
  • 【Redis实战】生产中使用Redis的一些注意事项
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 78. Subsets
  • ES6语法详解(一)
  • iOS编译提示和导航提示
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java Agent 学习笔记
  • Java应用性能调优
  • js算法-归并排序(merge_sort)
  • k8s如何管理Pod
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redis 懒删除(lazy free)简史
  • select2 取值 遍历 设置默认值
  • SpiderData 2019年2月23日 DApp数据排行榜
  • use Google search engine
  • 翻译:Hystrix - How To Use
  • 飞驰在Mesos的涡轮引擎上
  • 观察者模式实现非直接耦合
  • 前端技术周刊 2019-02-11 Serverless
  • 前端知识点整理(待续)
  • 如何使用 JavaScript 解析 URL
  • 深入浏览器事件循环的本质
  • ionic异常记录
  • 移动端高清、多屏适配方案
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #Ubuntu(修改root信息)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (C)一些题4
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)汇编语言——简单程序
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题