同步FIFO
- 格式:ppt
- 大小:894.00 KB
- 文档页数:27


CPLD实现同步FIFO1 实现原理CPLD实现8个字节的同步FIFO,实现8个字节数据的缓存。
CPLD内部模块逻辑框图如下所示。
Data_a_we_pulse写数据到FIFO的使能信号。
Data_a_rd_pulse从FIFO读取数据的使能信号。
Data_a_in和Data_a_out分别表示写入FIFO和从FIFO读出的数据的值。
Data_a_we_full指示FIFO写满的状态。
Data_a_rd_nop指示FIFO读空的状态。
2 CPLD代码module fifo_8B (clk,reset_n,data_a_in,data_a_we_pulse,data_a_we_full,data_a_out,data_a_rd_pulse,data_a_rd_nop);input clk;input reset_n;input [7:0] data_a_in;input data_a_we_pulse;output data_a_we_full;output [7:0] data_a_out;input data_a_rd_pulse;output data_a_rd_nop;//////////////////////////FIFO 写入数据逻辑////////////////////////////reg [7:0] fifo_mem [7:0]; //FIFO空间,8个8bit的空间reg [2:0] fifo_we_addr; //FIFO写地址寄存器reg fifo_we_addr_reverse_pulse; //FIFO写地址翻转状态寄存器,用于指示写//地址是否从最大地址翻转回到最小地址always@(posedge clk or negedge reset_n)beginif(reset_n == 1'b0)beginfifo_we_addr <= 3'h0;fifo_we_addr_reverse_pulse <= 1'b0;endelse if((data_a_we_pulse == 1'b1)&&(fifo_we_addr != 3'h7)&&(data_a_we_full == 1'b0)) beginfifo_mem[fifo_we_addr] <= data_a_in; //对应写地址,写入相应的值fifo_we_addr <= fifo_we_addr+3'h1;endelse if((data_a_we_pulse == 1'b1)&&(fifo_we_addr == 3'h7)&&(data_a_we_full == 1'b0)) beginfifo_mem[fifo_we_addr] <= data_a_in;fifo_we_addr <= fifo_we_addr+3'h1;fifo_we_addr_reverse_pulse <= ~fifo_we_addr_reverse_pulse;endelse;end//////////////////////////FIFO 读出数据逻辑////////////////////////////reg [2:0] fifo_rd_addr; //FIFO读地址寄存器reg fifo_rd_addr_reverse_pulse; //FIFO读地址翻转状态寄存器,用于指示读//地址是否从最大地址翻转回到最小地址reg [7:0] data_a_out;always@(posedge clk or negedge reset_n)beginif(reset_n == 1'b0)beginfifo_rd_addr <= 3'h0;fifo_rd_addr_reverse_pulse <= 1'b0;endelse if((data_a_rd_pulse == 1'b1)&&(fifo_rd_addr != 3'h7)&&(data_a_rd_nop == 1'b0)) begindata_a_out <= fifo_mem[fifo_rd_addr]; //对应读地址,读出相应的值fifo_rd_addr <= fifo_rd_addr+3'h1;endelse if((data_a_rd_pulse == 1'b1)&&(fifo_rd_addr == 3'h7)&&(data_a_rd_nop == 1'b0)) begindata_a_out <= fifo_mem[fifo_rd_addr];fifo_rd_addr <= fifo_rd_addr+3'h1;fifo_rd_addr_reverse_pulse <= ~fifo_rd_addr_reverse_pulse;endelse;end//////////////////////////FIFO 满空逻辑////////////////////////////wire fifo_addr_reverse_flag;assign fifo_addr_reverse_flag = (fifo_we_addr_reverse_pulse^fifo_rd_addr_reverse_pulse == 1'b1) ? 1'b1 : 1'b0;reg data_a_we_full;reg data_a_rd_nop;always@(posedge clk or negedge reset_n)beginif(reset_n == 1'b0)begindata_a_we_full <= 1'b0;data_a_rd_nop <= 1'b1;endelse if((fifo_rd_addr == fifo_we_addr)&&(fifo_addr_reverse_flag ==1'b1))begindata_a_we_full <= 1'b1;data_a_rd_nop <= 1'b0;endelse if((fifo_rd_addr == fifo_we_addr)&&(fifo_addr_reverse_flag ==1'b0))begindata_a_we_full <= 1'b0;data_a_rd_nop <= 1'b1;endelsebegindata_a_we_full <= 1'b0;data_a_rd_nop <= 1'b0;endendendmodule3 仿真结果3.1 正常写入读取FIFO仿真如下红色圆框,红色圆框表示向FIFO写入3个字节数据,红色方框表示从FIFO读取出2个字节数据。
同步FIFO之VHDL描述同步FIFO的意思是说FIFO的读写时钟是同一个时钟,不同于异步FIFO,异步FIFO的读写时钟是完全异步的。
同步FIFO的对外接口包括时钟,清零,读请求,写请求,数据输入总线,数据输出总线,空以及满信号。
下面分别对同步FIFO的对外接口信号作一描述:1.时钟,输入,用于同步FIFO的读和写,上升沿有效;2.清零,输入,异步清零信号,低电平有效,该信号有效时,FIFO被清空;3.写请求,输入,低电平有效,该信号有效时,表明外部电路请求向FIFO写入数据;4.读请求,输入,低电平有效,该信号有效时,表明外部电路请求从FIFO中读取数据;5.数据输入总线,输入,当写信号有效时,数据输入总线上的数据被写入到FIFO中;6.数据输出总线,输出,当读信号有效时,数据从FIFO中被读出并放到数据输出总线上;7.空,输出,高电平有效,当该信号有效时,表明FIFO中没有任何数据,全部为空;8.满,输出,高电平有效,当该信号有效时,表明FIFO已经满了,没有空间可用来存贮数据。
使用VHDL描述的FIFO将以上面的接口为基础,并且可以参数化配置FIFO的宽度和深度。
先把对外接口描述出来吧。
----------------------------------------------------------------------------------------------------------- Designer : skycanny-- Date : 2007-1-29-- Description : Synchronous FIFO created by VHDLlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity sfifo isgeneric(width : positivedepth : positive);port(clk : in std_logic;rst : in std_logic;wq : in std_logic;rq : in std_logic;data : in std_logic_vector(width - 1 downto 0);q : in std_logic_vector(width - 1 downto 0);empty : out std_logic;full : out std_logic);end entity sfifo;下面的框图主要描述同步FIFO的内部结构,画出框图有助于对电路结构的理解,同样也有助于RTL 代码的编写:异步FIFOFIFO (先进先出队列)是一种在电子系统得到广泛应用的器件,通常用于数据的缓存和用于容纳异步信号的频率或相位的差异。
【博文连载】CY7C68013同步FIFO配置在VIP Mini开发板资料包08_USB_Keil_Project目录下,Bingo 提供了CY7C68013的同步FIFO配置工程,以及其他的一些功能。
软件版本为Keil UVision 4.73.00,C51V95200。
首先介绍一下68013的Slave FIFO,对于CY7C68013的通信接口而言,最主要的有GPIF 与Slave FIFO。
Slave FIFO模式是FX2最常用的模式。
芯片工作于Slave FIFO模式下,该芯片就像一个USB FIFO。
一端接USB口,另外一端就是一个简单的FIFO接口。
USB的数据直接从上位机传递到该FIFO中,用户可以直接用现成的驱动程序和固件程序进行开发,省去了很多熟悉USB协议和驱动开发的工作。
Slave FIFO通过内部的FIFO 乒乓操作,实现数据的实时传输,框图如下所示:在Slave FIFO模式,68013与处理器只需要如下一个信号的链接,通过简单的片选,写入/读取实现,别可以实现数据的双向通信。
全功能接口如下所示:USB_Camera_Demo工程如下所示,我们主要关心的为USB_Camera_Demo.c、intr.c,其他内容Bingo已经完整的整理封装好。
关于同步FIFO的配置,详见USB_Camera_Demo.c,这里给出最重要的几个寄存器的介绍,请同步参照《FX2+TechRefManual》《USB68013_slave_fifo说明文档》寄存器配置手册。
手册Page342如下图所示:其中EF为EMPTY标志,FF为FULL标志:备注:FLAGA = PF;FLAGB = FF;FLAGC = EF;FLAGD = EP2PF,默认由FIFOADDR选择。
同步缓冲器(FIFO)的设计与实现姓名:学号:012004022102班级:2010级测控1班院系:控制系专业:测控技术与仪器同组人姓名:(说明:我们三个人前面的报告部分是一样的,因为课设基本是三个人商议完成,所以就感觉报告部分没什么不同的就只写了一份报告)目录1原理与系统设计 (3)2设计思想 (4)3源码与注释 (5)4仿真 (12)5综合 (15)6心得体会与建议 (19)1 原理与系统设计FIFO(FirstIn FirstOut)——是一种可以实现数据先入先出的存储器件。
FIFO就像一个单向管道,数据只能按固定的方向从管道一头进来,再按相同的顺序从管道另一头出去,最先进来的数据必定是最先出去。
FIFO被普遍用作数据缓冲器。
FIFO的基本单元是寄存器,作为存储器件,FIFO的存储能力是由其内部定义的存储寄存器的数量决定的。
本题中所设计的是同步F I FO(即输出输入端时钟频率一致),异步复位,其存储能力为(16x8),输出两个状态信号:full与e m pty,以供后继电路使用。
根据系统要求,画出的系统框图,如图1所示clockreset 读控制信号写控制信号inputfullemptyoutput 图1同步FI F O框图端口说明:输入:in_dat a: 输入数据端口,位宽为8位;read_n:读使能端,当read_n=0时,可以读出数据;write_n: 写使能端,当write_n=0时,可以写入数据;clock:时钟信号,在时钟的正边沿进行采样;reset_n: 复位信号,当reset_n=0时,计数器及读写都被清零(即:读写地址指针都指向0)输出:out_da ta: 输出数据端口,位宽为8位;;full:FIFO状态信号,当full=1时,表明该FIF O存储器已经写满;empty:FIFO状态信号,当empty=1时,表明该FIF O存储器已经读空;FIFO满的情况下,不能再写,写指针不能加1;FIFO空的情况下,不能再读,读指针不能加1;2 设计思想由以上的系统框图和端口分析,我们将设计的重点定在了解决以下三个核心问题上:1.FIFO的存储体如何表示?2.如何实现“先进先出”的逻辑功能?3.如何知道FI FO内部使用了多少,是满是空?针对以上三个问题,我们所采取的方法是:1.定义一个16×8的二维数组来表示FI FO的存储体。