首页 > 编程知识 正文

sdram和异步fifo,异步fifo课设

时间:2023-05-03 23:20:05 阅读:60278 作者:3451

异步FIFO (格雷码实现)一、FIFIO简介

FFO是先进的数据缓冲器,其特征是没有外部的读写地址。 因为没有来自外部的地址信号,所以只能依次读写,不能跳过。 FIFO的读写通过设计写使能和读使能来写入/读取FIFO,FIFO满时不能在里面写入,FIFO满时不能读取数据。 读FIFO时,会自动添加一个内部读取指针,写FIFO时会自动添加一个指针。

二、异步FIFO的用途

1、使用异步FIFO,能够在两个不同的时钟域之间快速方便地传输数据,起到在时钟域之间进行处理的作用。 常用于处理时钟域之间的问题。

2、对于宽度不同的数据接口也可以用FIFO缓冲。 例如,8位输入、16位输出。 (注:本文仅介绍输入/输出位宽相同的情况。)

三、FIFO的常见参数

wfull:完整标志表示FIFO已满,无法写入更多数据。

rempty :空标志表示FIFO为空,无法读取更多数据。

wclk:写入时钟

rclk:读时钟

允许winc:写入

rinc:可读

wdata :写数据

rdata:读取数据

wrst_n:写入复位

rrst_n :读取复位

四、FIFO满空标志的产生

FIFO设计的关键是如何产生可靠的读写指针和满空信号。

判空:当读指针赶上写入指针时,两者相等且为空。

空判定与使用二进制文件相同,判断读写指针是否完全相同即可。

判满:当写入指针赶上读取指针时,两者相等且满。

图中使用了格雷码。 最高位是辅助判断是否为空的东西。 实际深度是8。 例如,如果写入指针为1000,读取指针为0100,则写入指针将超过读取指针一圈,并且写入已满。因此判断其是否写满,需判断高两位是否相反,剩下的是否相同。

http://www.Sina.com/http://www.Sina.com /

moduleafifo # (参数wsize=8,参数dsize=16 ) input [WSIZE - 1:0]wdata,input wclk,input winc,input winc reg [ wsize-1:0 ] mem [ 0: dsize-1 ]; wire [3:0] waddr; wire [3:0] raddr; reg [4:0] wptr; reg [4:0] rptr; reg rempty_val; reg wfull_val; assign data=mem [raddr]; Always@(Posedgewclk ) Beginif ) Winc! wfull(Beginmem[waddr]=wdata; 最终结束reg [ 4:0 ] wbin; always @ (posedgewclkornegedgewrst _ n ) begin if (! wrst_n ) begin wbin=5'b0; endelseif(Winc! wfull ) begin wbin=wbin 1'b1; endendassignwaddr=wbin [ 3:0 ]; reg [4:0]wgray; always @ (posedgewclkornegedgewrst _ n ) begin if (! wrst_n ) begin wgray=5'b0; endelsebeginWGray=(wbin1 ) ^ wbin; 结束always @ (posedgewclkornegedgewrst _ n ) begin if (! wrst_n ) begin wptr=5'b0; end else begin wptr=w

gray; end end reg [4:0]wptr_1; reg [4:0]wptr_2; always @(posedge wclk or negedge wrst_n) begin if(!wrst_n)begin {wptr_2 , wptr_1} <= 10'd0; end else begin {wptr_2 , wptr_1} <= {wptr_1 , rptr}; end end assign wfull = {~wptr_2[4:3],wptr_2[2:0]} == wgray; reg [4:0]rbin; always @(posedge rclk or negedge rrst_n) begin if (!rrst_n) begin rbin <= 5'b0; end else if(rinc && !rempty) begin rbin <= rbin + 1'b1; end end assign raddr = rbin[3:0]; reg [4:0]rgray; always @(posedge rclk or negedge rrst_n) begin if(!rrst_n)begin rgray <= 5'b0; end else begin rgray <= (rbin >> 1) ^ rbin; end end always @(posedge rclk or negedge rrst_n) begin if(!rrst_n)begin rptr <= 5'b0; end else begin rptr <= rgray; end end reg [4:0]rptr_1; reg [4:0]rptr_2; always @(posedge rclk or negedge rrst_n) begin if(!rrst_n)begin {rptr_2 , rptr_1} <= 10'd0; end else begin {rptr_2 , rptr_1} <= {rptr_1 , wptr}; end end assign rempty = rptr_2 == rgray; endmodule

tb文件

`timescale 1ns / 1psmodule tb_afifo( ); reg wclk; reg [7:0]wdata; reg winc; reg wrst_n; reg rclk; reg rrst_n; reg rinc; wire wfull; wire rempty; wire [7:0]data; integer i = 0; localparam CYCLE = 20; localparam CYCLE1 = 40; initial begin wclk = 0; forever #(CYCLE/2) wclk = ~wclk; end initial begin rclk = 0; forever #(CYCLE1/2) rclk = ~rclk; end initial begin wrst_n = 1; #2; wrst_n = 0; #(CYCLE*3); wrst_n = 1; end initial begin rrst_n = 1; #2 rrst_n = 0; #(CYCLE*3); rrst_n = 1; end always@(posedge wclk or negedge wrst_n)begin if(!wrst_n)begin i <= 0; end else if(!wfull)begin i <= i+1; end else begin i <= i; end end afifo u_afifo( .wclk (wclk), .wdata (wdata), .winc (winc), .wrst_n (wrst_n), .rclk (rclk), .rrst_n (rrst_n), .rinc (rinc), .wfull (wfull), .rempty (rempty), .data (data) ); always @(posedge wclk or negedge wrst_n)begin if(wrst_n==1'b0)begin i <= 0; end else if(!wfull)begin i = i+1; end else begin i <= i; end end always @(rempty or rrst_n)begin if(rrst_n==1'b0)begin rinc = 1'b0; end else if(!rempty)begin rinc = 1'b1; end else rinc = 1'b0; end always@(wfull or wrst_n)begin if(wrst_n) winc = 1'b0; else if(!wfull) winc = 1'b1; else winc = 1'b0; end always@(*)begin if(!wfull) wdata= i; else wdata = 0; endendmodule

七、异步FIFO仿真效果

参考文献:
C.E. Cummings, Simulation and Synthesis Techniques for Asynchronous FIFO Design, SNUG 2002 .User Papers, 2002.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。