FPGA的FIFO实现过程资料_第1页
FPGA的FIFO实现过程资料_第2页
FPGA的FIFO实现过程资料_第3页
FPGA的FIFO实现过程资料_第4页
FPGA的FIFO实现过程资料_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FPGA的FIFO实现过程

FIFO队列是一种数据缓冲器,用于数据的缓存。他是一种先入先出的存储

器,即最先写入的数据,最先读。FIFO的参数有数据深度和数据宽度。数据宽

度是指存储数据的宽度。深度是指存储器可以存储多少个数据。

FIFO队列有两个标志位。一个满和一个空标志位。分别表示FIFO是数据写

满,还是数据读空。在数据写满状态下,数据写入是不允许的,因此在这个状

态下,写入的数据无效。而数据读空状态下,数据读取是不允许的,因此在这

个状态下,读取的数据无效。

FIFO队列有两个位置指示指针。一个是写指针,指向队列的第一个存储单

元。一个读指针,指向队列的最后一个存储单元。当有写命令的时候,数据写

入写指针指向的存储单元,然后指针加一。当有读命令的时候,读指针加一,

在读出读指针指向的存储单元的数据。这里读命令,指针要加一,是定义读数

据,是读出读指针的下一个存储单元的数据。

肖写指针和读指针的指向存储单元一样时,这时候根据之前是读命令还是

写命令来判断队列是空,还是满。在读命令,两个指针值一样时候,则队列

空。在写命令,两个指针值一样,则队列满。

以后就开始写代码实现上诉FIFO队列,并进行仿真。

以下,是实现数据宽度为8.深度为2八4的深度的FIFO。。读/写时钟是同

一个。

modulefifo_cus

parameterN=8,〃数据宽度

parameterM=4〃fifo的地址宽度

)

〃对队列的参数设置。建议这样写,便于以后代码的移植。

〃如果以后要实现数据宽度为16,深度为2〃8的FIFO。只需改N=16M=8

即可

inputelk,//输入时钟

inputrst_n,//输入复位信号

inputwr,//输入与使能

input[N-l:0]wdata,〃输入输入

inputrd,〃输入读便能

outputempty,〃输出fifo空标志

outputful1,〃输出fifo满标志

output[N-l:0]r_data〃输出读取的数据

);

//寄存器组,用来充当FIFO队列

reg[N-l:0]array_reg[2**M-1:0];

〃定义写指针,指示当前写的位置,下一个状态写的位置,写位置的下一

个位置

reg[M-l:0]wptrreg,w_ptr_next,w_ptr_succ;

〃定义读指针,指示当前读的位置,下一个状态读的位置,读位置的下一

个位置

reg[M-l:0]r_ptr_reg,r_ptr_next,r_ptr_succ;

〃定义FIFO满和空的信号

rogfull_rog,fulInoxt;

regempty_reg,empty_next;

wirewren;

〃数据的写入,在数据的上升沿的时候,有写使能信号,将数据写入。而

always©(posedgeelk)begin

if(wr_en)

arrayreg[wptrreg]<=wdata;

else

arrayreg[wptrreg]<=array_reg[w_ptr_reg];

end

//数据的读取。数据读取是一宜在读取的,不过读取的是之前的值。

assignrdcitci=array_reg[r_ptr_reg];

assignwren=wr&^full_reg;

/*状态跳转

在复位信号有效,读/写指针都指向0地址。此时队列状态为空。

在复位不有效,且在时钟的上升沿,读/写指针的值,队列空,满状态的值

又下一状态决定。否则保持*/

always©(posedgeelk)begin

if(!rst_n)

begin

w_ptr_reg<=0;

r_ptr_reg<=0;

full_reg<=rbO;

empty_reg<=1'bl;

end

else

begin

wptr_reg<=w_ptr_next;

r_ptr_reg<=r_ptr_next;

fullreg<=fullnext;

empty_reg<=empty_next;

end

end

/*与命令:在与命令卜,如果队列小为满,将当前与指针的下一个指针赋

值给读指针的下一个状态,同时将队列的空标志置0。

然后判断写指针的下一个指针是否和读指针的值一样。一样的话,说明,

队列为满。否则不为满。

*/

2'biO:

begin

if(^fullreg)

begin

w_ptr_next=w_ptr_succ;

empty_next=0;

if(w_pli_succ—i_pli_reg)

full_next=rb1;

else

full_next=rbO;

end

end

/*读写命令:在读写命令下,直接改变时应指针的下一个状态值。

*/

21611:

begin

w_ptr_next=w_ptr_succ:

r_ptr_next=r.ptrsucc;

endeelse

end

//满/空输出信号的赋值。

assignfull=full_reg;

assignempty=emptyreg;

endmodule

好了,终于搞定FIFO的代码了。下面来仿真看看结果。

以下分析仿真的结果:

写数据:

从下图仿真,可看出。在最开始的时候,队列是空的状态。读指针和写指

针都是0。在写使能情况下,在每个时钟的上升沿(蓝色线),数据写入队列

array_reg中。同时,写指针加一。而读指针是不变的。

|2(X4[2151

l—1

3・180ns,190ns200ns210ns

11・11RIlliiiii■■illiii

................

1吆empty0

Qfull0

...........

.elk1________r________1

1

Qs11

A■w-ata[7:0]/2d

130/<1

.......--------

S0j•__i

»Mr_ptr_r*e[3:0]0-------------1

▼■•r»*y_»«r(150,70)(X,X,X,X.X,X.X,XzX,I,X,X,工Xx.x,x,x,x,x,x][X,X,X,3J,X,…[x,x,

>,[15,7:0】X

A、[1<70]X

A~[13,7:0]X

>,[12,7:0]X

A,[11,7:0]X

>~[10,7:。】X

li■]

>■07:0】X

>~[«,70]X

A,[LTO]X

>y[6,7:0]X

A~[5":0]XI

>,[4,7:0]13X

»、[3,TO]Z43X

〉,[2,7:0]249-IT

>■[1,70]

Z41X-

>,[0,1:0]4"HFL

二二二二-i'll「二!三“丫一L

1

XI;245240ns

从卜图发现,在队列满状态下,即使与使能,FIFO也小接受与数据。依IH

保持原来的值。

340ns360M370ns380

1....

0

&full1

二____1—1

遥cik0________111____■____1

e“51

1

242:9)1也1:245):250)

>Zw_p*r_r«K(3:0)0

—]11

>0]0

一一i・

11...

▼,•»r»y_r«t[150,70]【246,9,12,13,12,1-[X.9,12,13U3-1

>,[15,T:0]246*X

>,[14,7:0]9X<_

>,[13,7:0]12

1

AW[12,7:0]13

>,[!L7:0]13

A,[10,7:0]6

>.[9,70]13

>.[8,70]

1____

>,[7,7:0】Z42

>,[6,70]245

>,(5,70]13

>巾[4,7:0]13

»Rf[3,70]243

>,[2.70]249

>2【L70]241

—■

>,[0,70]4

4HHHHHHHHHM1A

XI:4013452

读数据

从下图中看出,最开始,数据读出是有值的。为初始化的读指针指向的存

储单元的值。这里为4。

当有读命令时候,在时钟的上升沿(蓝色线),读指针加一。读取的数据

随之改变。

在数据读完后,即队列为空状态下。此时对数据的读取是无效的。从图中

可看出,读完后,读指针为0.回到存储器的第一个地址。而此时读出的值是无

效的。

Ax_d*U[70]

>■r.ptr.r«t(3:0)

▼,•rtfcy-r«K(15:0,7:0]

>.[】,ru]

),[14,7:0]

»f[13,70]

»〜[12,70]

A.[IL7:0]

>I[10,70]

»,[9,7:0】

>Rf[8,7:0]

>,[7,7:0]

>Rf[6,7:0】

>f[5,7:0】

>,[4,70]

A〜E7:0]

>.[2,TO]

»■[1,7:0】

>M07:0)

>,w_P»»_r«t[30]

4swi、・Ao♦•r,•ci

XI634.457ns

读写命令:

在同时读同时写的时候。从下图,可看出,结果有问题了。在队列为空的

状态下,此时读取的值,应为此时写的数据才对了。但是从图中,可看出,读

取的值不是当前写的数据的值。而是之前存储在FIFO中的值。这样的话,读取

的值就不是正确的值了。

1EZL'E'

1•BeValue半91,,,J720ns1730ns740ns....I7:

____.111111111—■

1I

Qfun0

■1

Qcik1——11__1

11--------------------------

H1近|1

1—

.rd1__1

»蟹0]1312*2d¥

、1

r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论