RAM接口控制器

大多数FPGA器件都包含专用的嵌入式存储器单元,虽然容量不大,但在小型设计中使用起来十分方便,同时可以简化单板设计,节约PCB空间。

由于不同外部存储器接口的差异性,不可能去写一个通用的接口控制器对外部存储器操作。使用内部存储器没有这种问题。

FIFO介绍

先进先出的存储队列。一般在程序中的作用是作为 数据的队列通道,让数据暂时缓存,以等待读取。与RAM明显不同的是FIFO是没有地址线的,因此不可随机寻址,而是先进先出。

不同模块之间的数据接口 ,尤其是不同时钟系统下的各个模块之间的数据接口是系统设计的关键。用异步FIFO模块来实现接口,接口双方都在自己时钟的同步下工作,它们之间不需要相互握手,只需要跟接口FIFO模块进行交互即可向接口FIFO中写入数据或读出数据。

用这样一个FIFO模块实现FPGA内部不同时钟系统之间的数据接口,使得设计变得容易。

FIFO框图及其信号

Xilinx FIFO IP调用

调用FIFO Generator,进行自定义。其端口类型有三个选择: Native、AXI Memory Mapped 以及AXI Stream三种。一般选择Native即可,如果却有特殊要求,比如需要与内存映射接口AXI或AXI流接口模块交互,则选择相应的接口的FIFO。

在选定了写数据宽度和深度后,读数据宽度和深度也随之确定。

在状态flag页可以选择性配置Almost Full flag和Almost empty flag。快要满标志信号在FIFO写到差一个就满了时候拉高,快要空信号在FIFO中只剩1个数据时候拉高。

还可以配置programmable flag信号,即自己设置一个阈值,来设定FIFO中数据的深度为多少时候拉高信号。

定制好IP后,通过例化使用该IP。

FIFO时序

写时序

当写使能wr_en拉高,并且将待写入数据等在din上,数据将会被写入FIFO。图中可以看到,full信号在D3时被拉高,表明FIFO写满了。此时,若继续往里写数据,则会导致现在的数据覆盖以前的数据,所以当full信号被拉高时应该停止写数据。

图片发自简书App

读时序

当读使能拉高后,数据会在下一个周期从dout口输出。当数据读完后,empty会被拉高。数据读完后若继续读,则会导致读取的数据为以前写入的数据,所以当empty为高时应停止读数据。

图片发自简书App
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容