资源描述:
《verilog同步和异步FIFO,可直接仿真和综合.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、EDA/SOPC课程设计报告题目:同异步FIFO模块的设计与验证姓名:xxx学号:同组人:xxx指导教师:xxx成绩:目录目录II第1章课程设计的要求11.1课程设计的目的11.2课程设计的条件11.3课程设计的要求1第2章课程设计的内容22.1设计思路22.2软件流程图22.3HDL代码阐述22.4ModelSim验证2第3章课程设计的心得3第1章课程设计的要求1.1课程设计的目的l掌握FIFO设计的基本原理与方法l培养Verilog语言模块化设计的思想意识l完成一个FIFO的设计与验证l掌握较大工程的基本开
2、发技能l培养综合运用Modelsim工具进行硬件开发的能力l培养数字系统设计的基本能力l加强对课堂Verilog语言学习的理解与升华1.2课程设计的条件l设计条件ISE、Modelsim等开发软件的使用1.3课程设计的要求l设计要求1设计同步FIFO并验证(包括仿真验证、FPGA验证)l设计要求2设计异步FIFO并验证(包括仿真验证、FPGA验证)l设计要求3采用DesignCompiler完成其逻辑综合,评估其面积和时序l设计要求4完成综合后的SDF反标仿真第1章课程设计的内容1.1设计思路FIFO(Firs
3、tInputFirstOutput),即先进先出队列。在计算机中,先入先出队列是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令(指令就是计算机在响应用户操作的程序代码,对用户而言是透明的)。如下图所示,当CPU在某一时段来不及响应所有的指令时,指令就会被安排在FIFO队列中,比如0号指令先进入队列,接着是1号指令、2号指令……当CPU完成当前指令以后就会从队列中取出0号指令先行执行,此时1号指令就会接替0号指令的位置,同样,2号指令、3号指令……都会向前挪一个位置,这样解释大家清楚了吧?
4、在设计之初,我们只对FIFO有一个模糊的了解,只知道它是一个先入先出的队列,但是对于它是如何组成和如何工作并不了解,于是我们设计的首要任务就是查阅资料,逐步完善我们对于同步FIFO和异步FIFO的了解。在前两天的工作当中,我们查阅了中外各类资料和文献,对FIFO的组成和工作原理有了深入的了解,最终决定以老师给的两篇《SimulationandSynthesisTechniquesforAsynchronousFIFODesign》和《SimulationandSynthesisTechniquesforAsyn
5、chronousFIFODesignwithAsynchronousPointerComparisons》为学习和参考的重要资料完成本次的课程设计。在两天的研究中,我们敲定异步FIFO的整体设计原理图如下:在懂得设计模块之后,我们接下来就要逐步编写每个子模块的程序。并且在写完每个子模块的设计之后,我们为了验证的方便起见,要求验证FIFO在每个时钟沿自动完成数据从0到15的自增一,观察当数据写满深度为15的FIFO之后能否自动产生”写满“信号并且自动开始”读模式“,在读的状态,关键步骤就是验证是否在读空之后不再继
6、续读。当然,这也是FIFO设计的关键,如何在写满的时候不让外界继续对FIFO继续写入,在读空的时候如何让FIFO不再继续读,在这方面的程序设计中我们走了很多的弯路,最终在两篇重要的论文中找到了解决问题的方式,在写自己代码的时候我们也参考了文章中的代码,感到受益匪浅!1.1软件流程图一:同步FIFO设计流程图:二:异步FIFO设计流程图1)FIFOMEMORY部分2)sync_r2w部分3)sync_w2r部分4)wptr_full部分5)rptr_empty部分6)主模块afifo部分因为这一部分就是将前
7、几部分联系成一个整体,因此无需再画这部分流程图。1.1HDL代码阐述1)同步FIFO设计代码:`defineDEL1modulesynfifo(clock,reset_n,data_in,read_n,write_n,data_out,full,empty);inputclock,reset_n,read_n,write_n;input[0:7]data_in;output[0:7]data_out;outputfull,empty;wireclock,reset_n,read_n,write_n;wire[0
8、:7]data_in;reg[0:7]data_out;wirefull,empty;//?reg[7:0]fifo_mem[14:0];reg[3:0]counter;reg[3:0]rd_pointer;reg[3:0]wr_pointer;assign#`DELfull=(counter==15)?1'b1:1'b0;//当计数值为15时代表已经满了assign#`DELempt