版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中水回用工艺流程优化方案
- 2026年4月西南医科大学附属中医医院招聘23人备考题库(四川)及答案详解(网校专用)
- 2026四川省内江市农业科学院考核招聘事业单位6人备考题库及答案详解【典优】
- 2026广东深圳理工附中教师招聘9人备考题库带答案详解(综合卷)
- 2026江苏盐城市射阳县教育局下属事业单位赴高校招聘教师17人备考题库含答案详解(黄金题型)
- 2026广西防城港市精神病医院招聘30人备考题库(第一期)及答案详解(必刷)
- 2026山东日照市老年大学春季兼职教师招聘备考题库附答案详解(巩固)
- 2026湖北工业大学院士助理招聘2人备考题库附答案详解(精练)
- 2026广东深圳市罗湖区新华外国语学校诚聘4人备考题库附答案详解(能力提升)
- 2026年车辆运行安全培训内容实操要点
- 2026年电网大面积停电应急演练方案
- 2026 年浙江大学招聘考试题库解析
- 2026年山西经贸职业学院单招综合素质考试题库附答案详解(综合题)
- 2025湖南株洲市市直事业单位公开招聘(选调)工作人员(医疗岗146人)笔试历年典型考题及考点剖析附带答案详解试卷2套
- 困难静脉穿刺案例分析
- YOLO介绍教学课件
- 运行维护记录档案制度
- 美国心脏协会(AHA)儿童 新生儿心肺复苏(2025)核心要点
- 2026年贵州建设职业技术学院单招职业适应性测试题库及答案详解一套
- 非自杀性自伤课件
- 米宝宝变形记课件
评论
0/150
提交评论