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

下载本文档

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

文档简介

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

2、delsim工具进行硬件开发的能力l 培养数字系统设计的基本能力l 加强对课堂Verilog语言学习的理解与升华1.2 课程设计的条件l 设计条件 ISE、Modelsim等开发软件的使用1.3 课程设计的要求l 设计要求1 设计同步FIFO并验证(包括仿真验证、FPGA验证)l 设计要求2 设计异步FIFO并验证(包括仿真验证、FPGA验证)l 设计要求3 采用Design Compiler完成其逻辑综合,评估其面积和时序l 设计要求4 完成综合后的SDF反标仿真第2章 课程设计的内容2.1 设计思路FIFO(First Input First Output),即先进先出队列。在 计算机中,

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

4、逐步完善我们对于同步FIFO和异步FIFO的了解。在前两天的工作当中,我们查阅了中外各类资料和文献,对FIFO的组成和工作原理有了深入的了解,最终决定以老师给的两篇Simulation and Synthesis Techniques for Asynchronous FIFO Design和Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons为学习和参考的重要资料完成本次的课程设计。在两天的研究中,我们敲定异步FIFO的整体设计原理图如下:

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

6、同步FIFO设计流程图:二:异步FIFO设计流程图1) FIFOMEMORY部分2)sync_r2w部分 3) sync_w2r部分4)wptr_full部分5)rptr_empty部分6) 主模块afifo部分 因为这一部分就是将前几部分联系成一个整体,因此无需再画这部分流程图。2.3 HDL代码阐述1) 同步FIFO设计代码:define DEL 1module synfifo(clock,reset_n,data_in,read_n,write_n,data_out,full,empty);input clock,reset_n,read_n,write_n;input 0:7 data

7、_in;output 0:7 data_out;output full,empty;wire clock,reset_n,read_n,write_n;wire 0:7 data_in;reg 0:7 data_out;wire full,empty;/?reg7:0 fifo_mem14:0;reg 3:0 counter;reg3:0 rd_pointer;reg3:0 wr_pointer;assign #DEL full=(counter=15)?1b1:1b0;/当计数值为15时代表已经满了assign #DEL empty=(counter=0)?1b1:1b0;/当计数值为0的时

8、候代表空了always (posedge clock or negedge reset_n) begin if(reset_n)/复位状态 begin #DEL; rd_pointer=4b0; wr_pointer=4b0; counter=4b0; data_out=8b0; end else if(read_n)/读信号有效 begin if(counter=0) begin $display(nERROR at time %0t:,$time); $display(FIFO Underflown); $stop; end if(write_n)/只读不写 begin counter=c

9、ounter-1; end data_out=#DEL fifo_memrd_pointer;/数据读出 if(rd_pointer=14) rd_pointer= #DEL 4b0; else rd_pointer=rd_pointer+1; end else if(write_n)/写状态有效 begin if(counter=15) begin $display(nERROR at time %0t:,$time); $display(FIFO Overflown); $stop; end if(read_n)/只写不读 begin counter=#DEL counter+1; end

10、 fifo_memwr_pointer=#DEL data_in;/数据写入 if(wr_pointer=14) wr_pointer=#DEL 4b0; else wr_pointer=#DEL wr_pointer+1; end endendmodule2) 异步FIFO设计:1、 FIFOmemory部分:module fifomem(rdata,wdata,waddr,raddr,wclken,wfull,wclk,rrst_n,rinc,rempty,rclk);input7:0wdata;input3:0waddr,raddr;input wclken,wfull,wclk,rrs

11、t_n,rinc,rempty,rclk;output7:0rdata;reg7:0rdata;reg7:0mem0:15;always(posedge rclk or negedge rrst_n)if(!rrst_n) rdata=8b0;else if(rinc&!rempty)/读有效并且没空rdata=memraddr;/数据读出always(posedge wclk)if(wclken&!wfull)/写有效并且没满 memwaddr=wdata;endmodule3) sync_r2w部分:module sync_r2w(wq2_rptr,rptr,wq1_rptr,wclk,w

12、rst_n); input4:0rptr; input wclk,wrst_n; output 4:0 wq1_rptr,wq2_rptr; reg 4:0 wq1_rptr,wq2_rptr; always(posedge wclk or negedge wrst_n)/这部分进行写地址到到读地址的同步 if(!wrst_n) wq2_rptr,wq1_rptr=0; else wq2_rptr,wq1_rptr=wq1_rptr,rptr; endmodule4) sync_w2r部分:module sync_w2r(rq2_wptr,wptr,rq1_wptr,rclk,rrst_n);

13、 input4:0wptr; input rclk,rrst_n; output 4:0 rq1_wptr,rq2_wptr; reg 4:0 rq1_wptr,rq2_wptr; always(posedge rclk or negedge rrst_n)/读地址到写地址的同步 if(!rrst_n) rq2_wptr,rq1_wptr=0; else rq2_wptr,rq1_wptr=rq1_wptr,wptr; Endmodule5) wptr_full部分:module wptr_full(wfull,waddr,wbin,wptr,wq2_rptr,winc,wclk,wrst_n

14、); input wrst_n,wclk,winc; input 4:0wq2_rptr; output 3:0waddr; output 4:0wptr; output wfull; output4:0wbin; reg wfull; reg 4:0wptr; reg4:0wbin; wire4:0wgraynext,wbinnext; always(posedge wclk or negedge wrst_n)/转化成格雷码进行比较 if(!wrst_n) begin wbin=5b0; wptr=5b0; end else begin wbin=wbinnext; wptr1)wbinn

15、ext; assign wfull_val = (wgraynext =!wq2_rptr4:3,wq2_rptr2:0);/如果高两位不同,低3位相同那么写满标志有效 always (posedge wclk or negedge wrst_n) if (!wrst_n) wfull = 1b0; else wfull = wfull_val;endmodule6) rptr_empty部分:module rptr_empty(rempty,raddr,rbin,rptr,rq2_wptr,rinc,rclk,rrst_n); input rrst_n,rclk,rinc; input 4:

16、0rq2_wptr; output 3:0raddr; output 4:0rptr; output rempty; output4:0rbin; reg rempty; reg 4:0rptr; reg4:0rbin; wire4:0rgraynext,rbinnext; always(posedge rclk or negedge rrst_n) if(!rrst_n) begin rbin=5b0; rptr=5b0; end else begin rbin=rbinnext; rptr1)rbinnext; assign rempty_val = (rgraynext = rq2_wp

17、tr)?1b1:1b0;/均相同时则为空有效 always (posedge rclk or negedge rrst_n) if (!rrst_n) rempty = 1b1; else rempty = rempty_val;endmodule7) afifo部分:module afifo (output 7:0 rdata,output wfull,output rempty,input 7:0 wdata,input winc, wclk, wrst_n,input rinc, rclk, rrst_n);wire 3:0 waddr, raddr;wire 4:0 wptr, rpt

18、r, wq2_rptr, rq2_wptr;/每个模块的每个信号都需要例化sync_r2w sync_r2w(.wq2_rptr(wq2_rptr), .rptr(rptr),.wclk(wclk), .wrst_n(wrst_n);sync_w2r sync_w2r(.rq2_wptr(rq2_wptr), .wptr(wptr),.rclk(rclk), .rrst_n(rrst_n);fifomem fifomem(.rdata(rdata), .wdata(wdata),.waddr(waddr), .raddr(raddr),.wclken(winc), .wfull(wfull),

19、.wclk(wclk),.rrst_n(rrst_n),.rinc(rinc),.rempty(rempty),.rclk(rclk);rptr_empty rptr_empty(.rempty(rempty),.raddr(raddr),.rbin(rbin),.rptr(rptr), .rq2_wptr(rq2_wptr),.rinc(rinc), .rclk(rclk),.rrst_n(rrst_n);wptr_full wptr_full(.wfull(wfull), .waddr(waddr),.wbin(wbin),.wptr(wptr), .wq2_rptr(wq2_rptr),

20、.winc(winc), .wclk(wclk),.wrst_n(wrst_n);endmodule2.4 ModelSim验证一、 同步FIFO1、HDL验证语言:define DEL 10module syn_tb;reg clock,reset_n,read_n,write_n;reg 7:0 in_data;wire 7:0 out_data;wire full,empty;integer fifo_count;reg 7:0 exp_data;reg fast_read,fast_write;reg filled_flag;reg cycle_count;synfifo synfif

21、o_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);initial begin in_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; #20 reset_n=0; #

22、20 reset_n=1; if(empty!=1) begin $display(nerror at time %0t:,$time); $display(after reset,empty status not assertedn); $stop; end if(full!=0) begin $display(nerror at time %0t:,$time); $display(nerror at time %0t:,$time); $stop; end endalways #100 clock=clock;always (posedge clock) begin if(write_n

23、 & read_n) fifo_count=fifo_count+1; else if(write_n & read_n) fifo_count=fifo_count-1; endalways (negedge clock) begin if(read_n & (out_data!=exp_data) begin $display(nerror at time %0t:,$time); $display(expected data ut=%h,exp_data); $display(actual data ut=%hn,out_data); $stop; end if(fast_write&(

24、cycle_count&1b1)&full)/? begin write_n=0; in_data=in_data+1; end else write_n=1; if(fast_read&(cycle_count&1b1)&empty)/? begin read_n=0; exp_data=exp_data+1; end else read_n=1; if(full) begin fast_read=1; fast_write=0; filled_flag=1; end if(filled_flag&empty) begin $display(nsimulation complete -no

25、errorsn); $finish; end cycle_count=cycle_count+1; endalways(fifo_count) begin # DEL; # DEL; # DEL; case (fifo_count) 0:begin if(empty!=1)|(full!=0) begin $display(nerror at time %0t:,$time); $display(fifo_count=%h,fifo_count); $display(empty=%hn,empty); $display(full=%hn,full); $stop; end if(filled_

26、flag=1) begin $display(nsimulation complete -no errorn); $finish; end end 15:begin if(empty!=0)|(full!=1) begin $display(nerror at time %0t:,$time); $display(fifo_count=%h,fifo_count); $display(empty=%hn,empty); $display(full=%hn,full); $stop; end filled_flag=1; fast_write=0; fast_read=1; end defaul

27、t:begin if(empty!=0)|(full!=0) begin $display(nerror at time %0t:,$time); $display(fifo_count=%h,fifo_count); $display(empty=%hn,empty); $display(full=%hn,full); $stop; end end endcase end initial begin $fsdbdumpfile(sfifo.fsdb); $fsdbdumpvars(); endendmodule2、 仿真波形:3、说明 当写FIFO的时候,一个上升的时钟沿一来,并且写信号有效

28、,读信号无效时,数据逐个写入FIFO存储器中。我们在这里设置FIFO的宽度为4,深度为15。因此在写满FIFO之后,我们让存储器自动产生满信号,而经过仿真波形可知道在满信号有效的时候,读信号有效而写信号无效,数据依次从FIFO中读出,并且读出的顺序正好是写入的先后顺序,实现了“先入先出”。而我们设置下面几个信号的原因就是为了更好的确保FIFO存储器在读空之后不再读,写满之后不再写。需要特别的注意exp_data,对它可以对输出的数据进行对比,从而来看输出的数据是否真的是我们所期待输出的数据。最终结果证明我们设计的同步FIFO是正确的。二、 异步FIFO1、 HDL代码:timescale 1n

29、s/1nsmodule Afifotest();reg 7:0 wdata;reg winc;reg wclk;reg wrst_n;reg rinc;reg rclk;reg rrst_n;wire 7:0 rdata;wire wfull;wire rempty;integer i;afifo afifo(.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#50 wclk=1;#50 wclk=0;endalwaysbegin#100 rclk=1;#100 rclk=0;endinitialbeginwrst_n=0;rrst_n=0;rinc=0;winc=0;wclk=0;rclk=0;wdata=0;i=0;#400;wrst_n=1;rr

温馨提示

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

评论

0/150

提交评论