verilog同步和异步FIFO,可直接仿真和综合_第1页
verilog同步和异步FIFO,可直接仿真和综合_第2页
verilog同步和异步FIFO,可直接仿真和综合_第3页
verilog同步和异步FIFO,可直接仿真和综合_第4页
verilog同步和异步FIFO,可直接仿真和综合_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、EDA/SOPC课程设计报告题目:同异步FIFO模块的设计与验证姓名:xxx学号:120260320同组人:xxx指导教师:xxx成绩:目录目录II第1章课程设计的要求11.1 课程设计的目的11.2 课程设计的条件11.3 课程设计的要求1第2章课程设计的内容22.1 设计思路22.2 软件流程图32.3 HDL代码阐述72.4 ModelSim验证13第3章课程设计的心得21第1章课程设计的要求1.1 课程设计的目的掌握FIFO设计的基本原理与方法培养Verilog语言模块化设计的思想意识完成一个FIFO的设计与验证掌握较大工程的基本开发技能培养综合运用Modelsim工具进行硬件开发的能

2、力培养数字系统设计的基本能力加强对课堂Verilog语言学习的理解与升华1.2 课程设计的条件设计条件ISE、Modelsim等开发软件的使用1.3 课程设计的要求设计要求1设计同步FIFO并验证(包括仿真验证、FPGA验证)设计要求2设计异步FIFO并验证(包括仿真验证、FPGA验证)设计要求3采用DesignCompiler完成其逻辑综合,评估其面积和时序设计要求4完成综合后的SDF反标仿真第2章课程设计的内容2.1 设计思路FIFO(FirstInputFirstOutput),即先进先出队列。在计算机中,先入先出队列是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指

3、令(指令就是计算机在响应用户操作的程序代码,对用户而言是透明的)。如下图所示,当CPU在某一时段来不及响应所有的指令时,指令就会被安排在FIFO队列中,比如0号指令先进入队列,接着是1号指令、2号指令当CPU完成当前指令以后就会从队列中取出0号指令先行执行,此时1号指令就会接替0号指令的位置,同样,2号指令、3号指令都会向前挪一个位置,这样解释大家清楚了吧?在设计之初,我们只对FIFO有一个模糊的了解,只知道它是一个先入先出的队列,但是对于它是如何组成和如何工作并不了解,于是我们设计的首要任务就是查阅资料,逐步完善我们对于同步FIFO和异步FIFO的了解。在前两天的工作当中,我们查阅了中外各类

4、资料和文献,对FIFO的组成和工作原理有了深入的了解,最终决定以老师给的两篇SimulationandSynthesisTechniquesforAsynchronousFIFODesign»和«SimulationandSynthesisTechniquesforAsynchronousFIFODesignwithAsynchronousPointerComparisons»为学习和参考的重要资料完成本次的课程设计。在两天的研究中,我们敲定异步FIFO的整体设计原理图如下:在懂得设计模块之后,我们接下来就要逐步编写每个子模块的程序。并且在写完每个子模块的设计之后

5、,我们为了验证的方便起见,要求验证FIFO在每个时钟沿自动完成数据从0到15的自增一,观察当数据写满深度为15的FIFO之后能否自动产生”写满信号并且自动开始“读模式;在读的状态,关键步骤就是验证是否在读空之后不再继续读。当然,这也是FIFO设计的关键,如何在写满的时候不让外界继续对FIFO继续写入,在读空的时候如何让FIFO不再继续读,在这方面的程序设计中我们走了很多的弯路,最终在两篇重要的论文中找到了解决问题的方式,在写自己代码的时候我们也参考了文章中的代码,感到受益匪浅!2.2 软件流程图一:同步FIFO设计流程图::异步FIFO设计流程图1)FIFOMEMORY部分第一个always块

6、中总是监测rclk.和rrst_n端口I/O声明及内部变量定义和数据声明等第二个always块中总是监测wclk2)sync_r2w部分否是wq2_rptr,wq1_rpt一r均清零wq2_rptr,wq1_rptr<=wq1_rptr,r-ptr;3)sync_w2r部分开始4)wptr_full部分5)rptr_empty部分6)主模块afifo部分因为这一部分就是将前几部分联系成一个整体,因此无需再画这部分流程图。2.3HDL代码阐述1)同步FIFO设计代码:'defineDEL1modulesynfifo(clock,reset_n,data_in,read_n,writ

7、e_n,data_out,full,empty);inputclock,reset_n,read_n,write_n;input0:7data_in;output0:7data_out;outputfull,empty;wireclock,reset_n,read_n,write_n;wire0:7data_in;reg0:7data_out;wirefull,empty;/?reg7:0fifo_mem14:0;reg3:0counter;reg3:0rd_pointer;reg3:0wr_pointer;assign#'DELfull=(counter=15)?1'b1:1

8、'b0;/当计数值为15时代表已经满了assign#'DELempty=(counter=0)?1'b1:1'b0;/当计数值为0的时候代表空了always(posedgeclockornegedgereset_n)beginif(reset_n)/复位状态begin#'DEL;rd_pointer<=4'b0;wr_pointer<=4'b0;counter<=4'b0;data_out<=8'b0;endelseif(read_n)/读信号有效beginif(counter=0)begin$di

9、splay("nERRORattime%0t:",$time);$display("FIFOUnderflown");$stop;endif(write_n)/只读不写begincounter<=counter-1;enddata_out<=#'DELfifo_memrd_pointer;/数据读出if(rd_pointer=14)rd_pointer<=#'DEL4'b0;elserd_pointer<=rd_pointer+1;endelseif(write_n)/写状态有效beginif(counte

10、r=15)begin$display("nERRORattime%0t:",$time);$display("FIFOOverflown");$stop;endif(read_n)/只写不读begincounter<=#'DELcounter+1;endfifo_memwr_pointer<=#'DELdata_in;/数据写入if(wr_pointer=14)wr_pointer<=#'DEL4'b0;elsewr_pointer<=#'DELwr_pointer+1;endendendm

11、odule2)异步FIFO设计:1、FIFOmemory部分:modulefifomem(rdata,wdata,waddr,raddr,wclken,wfull,wclk,rrst_n,rinc,rempty,rclk);input7:0wdata;input3:0waddr,raddr;inputwclken,wfull,wclk,rrst_n,rinc,rempty,rclk;output7:0rdata;reg7:0rdata;reg7:0mem0:15;always(posedgerclkornegedgerrst_n)if(!rrst_n)rdata<=8'b0;el

12、seif(rinc&&!rempty)读有效并且没空rdata<=memraddr;/数据读出always(posedgewclk)if(wclken&&!wfull)/写有效并且没满memwaddr<=wdata;endmodule3) sync_r2w部分:modulesync_r2w(wq2_rptr,rptr,wq1_rptr,wclk,wrst_n);input4:0rptr;inputwclk,wrst_n;output4:0wq1_rptr,wq2_rptr;reg4:0wq1_rptr,wq2_rptr;always(posedgew

13、clkornegedgewrst_n)/这部分进行写地址到到读地址的同步if(!wrst_n)wq2_rptr,wq1_rptr<=0;elsewq2_rptr,wq1_rptr<=wq1_rptr,rptr;endmodule4) sync_w2r部分:modulesync_w2r(rq2_wptr,wptr,rq1_wptr,rclk,rrst_n);input4:0wptr;inputrclk,rrst_n;output4:0rq1_wptr,rq2_wptr;reg4:0rq1_wptr,rq2_wptr;always(posedgerclkornegedgerrst_n)

14、/读地址至1J写地址的同步if(!rrst_n)rq2_wptr,rq1_wptr<=0;elserq2_wptr,rq1_wptr<=rq1_wptr,wptr;Endmodule5) wptr_full部分:modulewptr_full(wfull,waddr,wbin,wptr,wq2_rptr,winc,wclk,wrst_n);inputwrst_n,wclk,winc;input4:0wq2_rptr;output3:0waddr;output4:0wptr;outputwfull;output4:0wbin;regwfull;reg4:0wptr;reg4:0wbi

15、n;wire4:0wgraynext,wbinnext;always(posedgewclkornegedgewrst_n)/转化成格雷码进行比较if(!wrst_n)beginwbin<=5'b0;wptr<=5'b0;endelsebeginwbin<=wbinnext;wptr<=wgraynext;endassignwaddr=wbin3:0;assignwbinnext=wbin+(winc&!wfull);assignwgraynext=(wbinnext>>1)八wbinnext;assignwfull_val=(wgr

16、aynext=!wq2_rptr4:3,wq2_rptr2:0);/如果高两位不同,低3位相同那么写满标志有效always(posedgewclkornegedgewrst_n)if(!wrst_n)wfull<=1'b0;elsewfull<=wfull_val;endmodule6) rptr_empty部分:modulerptr_empty(rempty,raddr,rbin,rptr,rq2_wptr,rinc,rclk,rrst_n);inputrrst_n,rclk,rinc;input4:0rq2_wptr;output3:0raddr;output4:0rp

17、tr;outputrempty;output4:0rbin;regrempty;reg4:0rptr;reg4:0rbin;wire4:0rgraynext,rbinnext;always(posedgerclkornegedgerrst_n)if(!rrst_n)beginrbin<=5'b0;rptr<=5'b0;endelsebeginrbin<=rbinnext;rptr<=rgraynext;endassignraddr=rbin3:0;assignrbinnext=rbin+(rinc&!rempty);assignrgraynext

18、=(rbinnext>>1)八rbinnext;assignrempty_val=(rgraynext=rq2_wptr)?1'b1:1'b0;/均相同时则为空有效always(posedgerclkornegedgerrst_n)if(!rrst_n)rempty<=1'b1;elserempty<=rempty_val;endmodule7) afifo部分:moduleafifo(output7:0rdata,outputwfull,outputrempty,input7:0wdata,inputwinc,wclk,wrst_n,input

19、rinc,rclk,rrst_n);wire3:0waddr,raddr;wire4:0wptr,rptr,wq2_rptr,rq2_wptr;/每个模块的每个信号都需要例化sync_r2wsync_r2w(.wq2_rptr(wq2_rptr),.rptr(rptr),.wclk(wclk),.wrst_n(wrst_n);sync_w2rsync_w2r(.rq2_wptr(rq2_wptr),.wptr(wptr),.rclk(rclk),.rrst_n(rrst_n);fifomemfifomem(.rdata(rdata),.wdata(wdata),.waddr(waddr),.r

20、addr(raddr),.wclken(winc),.wfull(wfull),.wclk(wclk),.rrst_n(rrst_n),.rinc(rinc),.rempty(rempty),.rclk(rclk);rptr_emptyrptr_empty(.rempty(rempty),.raddr(raddr),.rbin(rbin),.rptr(rptr),.rq2_wptr(rq2_wptr),.rinc(rinc),.rclk(rclk),.rrst_n(rrst_n);wptr_fullwptr_full(.wfull(wfull),.waddr(waddr),.wbin(wbin

21、),.wptr(wptr),.wq2_rptr(wq2_rptr),.winc(winc),.wclk(wclk),.wrst_n(wrst_n);endmodule2.4ModelSim验证一、同步FIFO1、HDL验证语言:'defineDEL10modulesyn_tb;regclock,reset_n,read_n,write_n;reg7:0in_data;wire7:0out_data;wirefull,empty;integerfifo_count;reg7:0exp_data;regfast_read,fast_write;regfilled_flag;regcycle

22、_count;synfifosynfifo_tb(.clock(clock),.reset_n(reset_n),.data_in(in_data),.read_n(read_n),.write_n(write_n),.data_out(out_data),.full(full),.empty(empty);initialbeginin_data=0;exp_data=0;fifo_count=0;read_n=1;write_n=1;filled_flag=0;cycle_count=0;clock=1;fast_read=0;fast_write=1;reset_n=1;#20reset_

23、n=0;#20reset_n=1;if(empty!=1)begin$display("nerrorattime%0t:",$time);$display("afterreset,emptystatusnotassertedn");$stop;endif(full!=0)begin$display("nerrorattime%0t:",$time);$display("nerrorattime%0t:",$time);$stop;endendalways#100clock=clock;always(posedgec

24、lock)beginif(-write_n&&read_n)fifo_count=fifo_count+1;elseif(write_n&&-read_n)fifo_count=fifo_count-1;endalways(negedgeclock)beginif(-read_n&&(out_data!=exp_data)begin$display("nerrorattime%0t:",$time);$display("expecteddataut=%h",exp_data);$display("

25、actualdataut=%hn",out_data);$stop;endif(fast_write&&(cycle_count&1b1)&&full)?beginwrite_n=0;in_data=in_data+1;endelsewrite_n=1;if(fast_read&&(cycle_count&1b1)&&empty)/?beginread_n=0;exp_data=exp_data+1;endelseread_n=1;if(full)beginfast_read=1;fast_write=0

26、;filled_flag=1;endif(filled_flag&&empty)begin$display("nsimulationcomplete-noerrorsn");$finish;endcycle_count=cycle_count+1;endalways(fifo_count)begin# 'DEL;# 'DEL;# 'DEL;case(fifo_count)0:beginif(empty!=1)|(full!=0)begin$display("nerrorattime%0t:",$time);$dis

27、play("fifo_count=%h",fifo_count);$display("empty=%hn",empty);$display("full=%hn",full);$stop;endif(filled_flag=1)begin$display("nsimulationcomplete-noerrorn");$finish;endend15:beginif(empty!=0)|(full!=1)begin$display("nerrorattime%0t:",$time);$displa

28、y("fifo_count=%h",fifo_count);$display("empty=%hn",empty);$display("full=%hn",full);$stop;endfilled_flag=1;fast_write=0;fast_read=1;enddefault:beginif(empty!=0)|(full!=0)begin$display("nerrorattime%0t:",$time);$display("fifo_count=%h",fifo_count);$di

29、splay("empty=%hn",empty);$display("full=%hn",full);$stop;endendendcaseendinitialbegin$fsdbdumpfile("sfifo.fsdb");$fsdbdumpvars();endendmodule2、仿真波形:茸,也!乩it-:;flfl腰hjaanaD«<rurtI:卬h.5mdi$户卢Hdjgnnftfcb3rMz3miqPnx一xALWAflSaiiS_tt>FfW电种.由PrecIW.WAT5MEq$iMeIS-Fsm.

30、iap*XrsCap-住WCQKl|JE如”3、说明当写FIFO的时候,一个上升的时钟沿一来,并且写信号有效,读信号无效时,数据逐个写入FIFO存储器中。我们在这里设置FIFO的宽度为4,深度为15。因此在写满FIFO之后,我们让存储器自动产生满信号,而经过仿真波形可知道在满信号有效的时候,读信号有效而写信号无效,数据依次从FIFO中读出,并且读出的顺序正好是写入的先后顺序,实现了“先入先出”。而我们设置下面几个信号的原因就是为了更好的确保FIFO存储器在读空之后不再读,写满之后不再写。需要特别白注意exp_data,对它可以对输出的数据进行对比,从而来看输出的数据是否真的是我们所期待输出的数

31、据。最终结果证明我们设计的同步FIFO是正确的。二、异步FIFO1、HDL代码:'timescale1ns/1nsmoduleAfifotest();reg7:0wdata;regwinc;regwclk;regwrst_n;regrinc;regrclk;regrrst_n;wire7:0rdata;wirewfull;wirerempty;integeri;afifoafifo(.rdata(rdata),.wdata(wdata),.wclk(wclk),.rclk(rclk),.wrst_n(wrst_n),.rrst_n(rrst_n),.wfull(wfull),.rempty(rempty),.winc(winc),.rinc(rinc);alwaysbegin# 50wclk=1;# 50wclk=0;endalwaysbegin# 100rclk=1;# 100rclk=0;endinitialbeginwrst_n=0;rrst_n=0;rinc=0;winc=0;wclk=

温馨提示

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

评论

0/150

提交评论