同步fifo设计实验报告
实验4

实验四. 同步FIFO的设计一. 实验目的1、熟悉FIFO工作原理2、设计FIFO的VHDL代码和顶层VHDL仿真测试平台,并进行仿真二. 实验内容1、根据规定的接口创建VHDL代码及其顶层测试文件2、编译工程中的测试文件及仿真脚本,仿真脚本编写可以参考参考资料中的”Modelsim仿真脚本编写.ppt”3、使用modelsim软件进行波形仿真,关于modelsim软件的使用以及顶层testbench的写法可参见参考资料4、软件下载链接ModelSim–/content/modelsim-pe-student-edition-hdl-simulation三. 同步FIFO工作原理FIFO是英文FIRST-IN-FIRST-OUT的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常方便,但是缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成FIFO的主要功能是基于对双口RAM的读写控制来完成的,根据双口RAM的数据存储状况产生空满信号。
双口RAM指的就是能同时对RAM进行读写操作的RAM存储器,如图5.1所示图5.1 双口RAMFIFO就是对这个双口RAM进行操作,FIFO产生empty和full信号,告诉用户RAM 满和空的状态,满的话就不能再写数据进去,空的话就不能再读数据出来FIFO的内部工作结构图如图5.2所示图5.2 FIFO内部结构图所谓同步FIFO指的是读和写在同一个clock下工作四. 模块接口Type Name Value Width FunctionParameter FIFO_Depth 16 - FIFO深度,若FIFO内存储数据数目达到深度,则置Full为高Parameter DataWidth 8 - FIFO宽度,代表存储数据的位宽Parameter AddrSize 4 - FIFO内部地址线宽度IN Sys_Clk - 1 系统时钟信号IN Sys_Rst - 1 系统reset信号,高有效IN WrData - DataWidth FIFO写入数据IN Wr_en - 1 FIFO写使能,高有效IN Rd_en - 1 FIFO读使能,高有效OUT RdData - DataWidth FIFO读出数据OUT FIFO_Full - 1 FIFO满信号,置1表示FIFO满OUT FIFO_Empty - 1 FIFO空信号,置1表示FIFO空五. 检测方法及内容由于本实验不需要烧入BASYS2开发板验证,因此检测将使用统一的顶层测试文件对各位同学的模块进行测试,因此要求如下:1、模块名字统一命名为Ram_FIFO2、模块的接口统一按照“模块接口”一节中所列进行编写3、要求同学每人给出自己的testbench以供检查,但是检测时使用助教提供的testbench和脚本文件进行检测,因此模块接口的匹配十分重要,请各位同学注意(可以在提供的Ram_FIFO.vhd文件上进行修改)检测内容包括:1、FIFO正常写入读出数据功能是否正确2、Enable功能是否正常3、Full和Empty信号能否正常产生,并且在Full和Empty信号下能否进行写或者读六. 整体思路解决方案、FPGA资源使用情况以及仿真结果和结论1.同步FIFO是否满的判断:当复位信号置1时,在下一时钟周期同步复位即full值在下一时钟周期同步置0。
操作系统fifo算法模拟实验总结

FIFO算法模拟实验总结操作系统中的页面置换算法是为了有效管理计算机内存空间而设计的。
FIFO (First-In, First-Out)是最简单和最常见的页面置换算法之一。
通过对FIFO算法进行模拟实验,我们可以更好地理解其工作原理,评估其性能,并进一步探讨其局限性和优化方向。
重要观点1.FIFO算法的基本原理:FIFO算法按照页面进入内存的先后顺序进行置换,即最早进入内存的页面将最先被淘汰。
这一原理确保了页面的公平访问,但可能导致较低的缓存命中率。
2.页面置换的开销问题:无论使用哪种页面置换算法,都需要进行页面调度和数据迁移,这涉及到CPU和内存之间频繁的数据传输。
因此,算法的开销也需考虑在内。
3.缺页中断的处理:当CPU请求的页面不在内存中时,会发生缺页中断。
FIFO算法需要将最早进入内存的页面替换出去,为新页面腾出位置来处理缺页中断。
这需要涉及读取磁盘上的页面数据,带来了较高的I/O开销。
4.FIFO算法的局限性:FIFO算法没有考虑页面的重要性和访问频率,只单纯按照进入内存的顺序进行页面置换。
这种简单的先进先出策略可能会导致较低的缓存命中率和较大的开销。
关键发现通过对FIFO算法进行模拟实验,我们得出了一些关键发现:1.FIFO算法的缓存命中率与页面引用模式密切相关。
在连续引用的页面中,若页面较大且请求频繁,FIFO算法的缓存命中率可能会较低。
2.长作业更容易导致缺页中断。
FIFO算法可能更频繁地替换长时间运行的作业所需的页面,因为长作业往往具有更大的作业集。
3.FIFO算法对缓存容量的依赖。
当缓存容量较大时,FIFO算法可以维持较高的命中率。
然而,当缓存容量有限时,FIFO算法的性能可能急剧下降。
进一步思考通过对FIFO算法模拟实验的总结,我们可以进一步思考如下问题:1.如何提高FIFO算法的性能?可以尝试引入更智能的页面置换算法,如LRU(Least Recently Used)算法,根据页面的访问频率和重要性进行置换,以提高缓存命中率。
同步FIFO的设计与实现

同步缓冲器(FIFO)的设计与实现姓名:学号:012004022102班级:2010级测控1班院系:控制系专业:测控技术与仪器同组人姓名:(说明:我们三个人前面的报告部分是一样的,因为课设基本是三个人商议完成,所以就感觉报告部分没什么不同的就只写了一份报告)目录1原理与系统设计 (3)2设计思想 (4)3源码与注释 (5)4仿真 (12)5综合 (15)6心得体会与建议 (19)1 原理与系统设计FIFO(FirstIn FirstOut)——是一种可以实现数据先入先出的存储器件。
FIFO就像一个单向管道,数据只能按固定的方向从管道一头进来,再按相同的顺序从管道另一头出去,最先进来的数据必定是最先出去。
FIFO被普遍用作数据缓冲器。
FIFO的基本单元是寄存器,作为存储器件,FIFO的存储能力是由其内部定义的存储寄存器的数量决定的。
本题中所设计的是同步F I FO(即输出输入端时钟频率一致),异步复位,其存储能力为(16x8),输出两个状态信号:full与e m pty,以供后继电路使用。
根据系统要求,画出的系统框图,如图1所示clockreset 读控制信号写控制信号inputfullemptyoutput 图1同步FI F O框图端口说明:输入:in_dat a: 输入数据端口,位宽为8位;read_n:读使能端,当read_n=0时,可以读出数据;write_n: 写使能端,当write_n=0时,可以写入数据;clock:时钟信号,在时钟的正边沿进行采样;reset_n: 复位信号,当reset_n=0时,计数器及读写都被清零(即:读写地址指针都指向0)输出:out_da ta: 输出数据端口,位宽为8位;;full:FIFO状态信号,当full=1时,表明该FIF O存储器已经写满;empty:FIFO状态信号,当empty=1时,表明该FIF O存储器已经读空;FIFO满的情况下,不能再写,写指针不能加1;FIFO空的情况下,不能再读,读指针不能加1;2 设计思想由以上的系统框图和端口分析,我们将设计的重点定在了解决以下三个核心问题上:1.FIFO的存储体如何表示?2.如何实现“先进先出”的逻辑功能?3.如何知道FI FO内部使用了多少,是满是空?针对以上三个问题,我们所采取的方法是:1.定义一个16×8的二维数组来表示FI FO的存储体。
推荐-FIFO磁盘调度算法操作系统课程设计报告1 精品

哈尔滨理工大学课程设计(计算机操作系统)题目:FIFO磁盘调度算法班级:姓名:指导教师:系主任:20XX年03月01日目录555661FIFO磁盘调度算法课程设计1.1题目分析本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务磁盘调度算法的理解。
这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
1.2数据结构1 先来先服务算法模块:void FCFS(int array[],int m)输入磁道号,按先来先服务的策略输出磁盘请求序列,求平均寻道长度,输出移动平均磁道数。
主要代码:for(i=0,j=1;j<m;i++,j++){sum+=abs(array[j]-array[i]);ave=(float)(sum)/(float)(m);}1.3流程图FIFO算法流程图:1.4实现技术为实现上述设计,采用C++语言,VS20XX开发环境。
具体采用的技术如下:(1)(2)实现步骤如下:(1)输入磁道序列、当前磁道号(2)FIFO磁盘调度(3)输出平均磁道数运行结果如下:1.5设计结论和心得通过课程设计得到如下结论:(1)本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。
本系统是在dos状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。
VLSI课程设计——同步FIFO的设计与实现

VLSI课程设计同步FIFO设计与实现班级:学号:姓名:指导教师:VLSI课程设计报告——同步FIFO设计与实现一、FIFO概述FIFO是英文First In First Out的缩写,意为先入先出存储器,由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来越便宜。
作为一种新型大规模集成电路,FIFO芯片以其灵活、方便、高效的特性,逐渐在高速数据采集、高速数据处理、高速数据传输以及多机处理系统中得到越来越广泛的应用。
它与普通随机存储器的区别是没有外部读写地址线,这样使用起来非常方便但缺点就是只能顺序读写数据,其读写数据地址依靠内部的读指针和写指针完成。
读操作与写操作可以异步进行,写入区上写入的数据按照写入的顺序从读取端的区中读出,类似于吸收写入端与读出端速度差的一种缓冲器。
计算机的串口,一般也都具有FIFO缓冲器(不是单一的FIFO存储器,而是嵌入在设备内部)。
二、同步FIFO同步FIFO(S ynchronous FIFO,下称SFIFO)的意思是说FIFO的读写时钟是同一个时钟,因此时钟频率是相同的,只是在相位上可能有差别,不同于异步FIFO,异步FIFO的读写时钟是完全异步的。
SFIFO的对外接口包括时钟,清零,读请求,写请求,数据输入总线,数据输出总线,空以及满信号。
查阅资料找到一款成型SFIFO产品的接口描述,如图1:图1 一款同步FIFO的接口资料为了更好的理解FIFO的工作方式,我们设定SFIFO的深度为8。
SFIFO的难点主要是状态判断,如图2是对空状态和满状态来进行判断的方式。
图2 FIFO空满状态判断可以看出,当读指针和写指针的值一样的时候,FIFO的状态为空。
比较麻烦的是对FIFO是否已经满的状态的判断,因为存在两种情况,第一种情况时写指针比读指针大,比如写指针= 7而读指针= 0,还有一种情况时写指针比读指针小,比如写指针= 2而读指针= 3。
FIFO算法实验报告材料

实验报告课程名称学生所在系部年级专业、班级学生姓名学号任课教师实验成绩软件工程系制一、实验题目:先进先出(FIFO)页面置换算法和最近最久未使用(LRU)置换算法程序设计二、实验目的:通过对FIFO,LRU算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。
三、实验设备及环境:1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。
四、实验内容及要求:(1)用C语言编程实现对FIFO,LRU算法的模拟。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:五、实验方法内容1.算法流程图2.主要的常量变量char a;int m=4,n=12,i,y[12]={1,2,3,4,1,2,5,1,2,3,4,5};主要模块void FIFO(void);void LRU(void);void Xunhuan()void main()四.代码#include"stdio.h"#include"stdlib.h"#include"time.h"void FIFO(void);void LRU(void);char a;int m=4,n=12,i,y[12]={1,2,3,4,1,2,5,1,2,3,4,5}; /*m为物理块数,n为要访问的页面数*/typedef struct page{int num;int time;}Page;Page x[10];int GetMax(page *x){int i;int max=-1;int tag=0;for(i=0;i<m;i++){if(x[i].time>max){ max=x[i].time;tag=i;}}return tag;}void Xunhuan(){printf("Please select 1:FIFO算法\n 2:LRU算法\n"); scanf("%s",&a);printf("物理块数:4\n");//scanf("%d",&m);for(i=0;i<m;i++){x[i].num=-1;}printf("所要访问的页面数:12\n");//scanf("%d",&n);//srand(time(NULL));printf("所要访问的页面号序列为:");for(i=0;i<n;i++)printf("%d ",y[i]);printf("\n");printf("页面置换步骤如下:\n");switch(a){case '1':FIFO();break;case '2':LRU(); break;}}void main(){char a;Xunhuan();while(1){printf("Continue or Exit:C/Anykey:\n"); scanf("%s",&a);if(a=='c'||a=='C')Xunhuan();else break;}exit(0);}void FIFO(void){int i,j,u;for(i=0;i<m;i++)x[i].time=0;x[0].num=y[0];x[0].time=1;printf(" %d \n",x[0].num);for(i=1;i<n;i++){ u=0;for(j=0;j<m;j++)if(x[j].num==y[i]){u=1;break;}if(u!=1&&x[m-1].num!=-1){j=GetMax(x);x[j].num=y[i];x[j].time=0;}if(u!=1&&x[m-1].num==-1){for(j=0;j<m;j++){if(x[j].num==-1){x[j].num=y[i];break;}}}for(j=0;j<m;j++)if(x[j].num!=-1)x[j].time++;for(j=0;j<m;j++)if(x[j].num==-1)printf("%2c ",32);elseprintf("%2d ",x[j].num); printf("\n");}}void LRU(){int i,j,u;for(i=0;i<m;i++)x[i].time=0;x[0].num=y[0];x[0].time=1;printf(" %d \n",x[0].num);for(i=1;i<n;i++){ u=0;for(j=0;j<m;j++)if(x[j].num==y[i]){x[j].time=0;u=1;break;}if(u!=1&&x[m-1].num!=-1){j=GetMax(x);x[j].num=y[i];x[j].time=0;}if(u!=1&&x[m-1].num==-1){for(j=0;j<m;j++){if(x[j].num==-1){x[j].num=y[i];break;}}}for(j=0;j<m;j++)if(x[j].num!=-1)x[j].time++;for(j=0;j<m;j++)if(x[j].num==-1)printf("%2c ",32);elseprintf("%2d ",x[j].num); printf("\n");}}五、实验结果1.执行结果2.结果分析由结果可以看出,使用FIFO算法,总是淘汰最先进入内存的页面,即即选择在内存中驻留时间最久的页面予以淘汰。
同步fifo的设计代码和分析

同步fifo的设计代码和分析《IC设计基础》同步fifo的设计行为级的描述:比较简单,因为是同步,所以只有一个时钟,读使能和写使能要保证不能同时有效,就是说,读的时候就读,不能写,写的时候就写不能读。
<错误!读和写可以同时进行的,只要保证不读空,不写满就可以了,只是说counter计数器的加减是在要么读使能要么写使能有效的情况下进行的>主要是要产生两个标志位:空,满。
当空的时候就不能再读了,当满的时候就不能再写了。
设计中考虑了调试,所以出错的地方会自动停止程序,进行调试。
输入和输出信号都是8位,fifo的深度是15.使用的是异步复位.因为fifo比较小,所以没有调用ram(fifo相当于是一个管子,一端进,一端出(先进的先出),堆栈相当于是一个水缸,先进的后出,后进的先出)同步fifo的使用场合:,,,,,,,,注意count计数器的设计目的.可以使得读写同时进行(只要有的读就可),也可以只读或只写,(只要保证不读空不写满就可)`define DEL 1modulesynfifo(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_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;//?reg[7:0] fifo_mem[14:0];//定义fifo的大小,用寄存器组表示宽为8深为15 reg [3:0] counter;//计数器,这是很重要的reg[3:0] rd_pointer;//读指针reg[3:0] wr_pointer;//写指针assign #`DEL full=(counter==15)?1'b1:1'b0;//计数到15说明写满了assign #`DEL empty=(counter==0)?1'b1:1'b0;//计数到0说明读空了(需要先写满,再去读空呢,还是先写一部分,然后从这部分读空???)可以同时读和写,对fifo不同的位置always @(reset_n)if(~reset_n)begin#`DEL;rd_pointer<=4'b0;wr_pointer<=4'b0;counter<=4'b0;endalways @(posedge clock)beginif(~read_n)//只要读信号有效就开始读beginif(counter==0)//code 1,读空了,就停止begin$display("\nERROR at time %0t:",$time);$display("\FIFO Underflow\n");$stop;endif(write_n)//非常重要的信号counter,,通过计数保证不读空不写满 . 时钟到来时,读有效,写无效时减1,读无效,写有效时加一 ,count有点像一个水位仪,要保证不在最高端也不在最底端,只有写时,水位仪上升一格,只有读时水位仪下降一格,有读有写或者不读也不写时,水位仪保持不动)begincounter<=counter-1;enddata_out<=#`DEL fifo_mem[rd_pointer];//把指针所指位置的值送给输出if(rd_pointer==14)rd_pointer<= #`DEL 4'b0;elserd_pointer<=rd_pointer+1;endif(~write_n)//只要出现写使能有效就开始写beginif(counter==15)begin$display("\nERROR at time %0t:",$time);$display("FIFO Overflow\n");$stop;endif(read_n)begincounter<=#`DEL counter+1;endfifo_mem[wr_pointer]<=#`DEL data_in;if(wr_pointer==14)wr_pointer<=#`DEL 4'b0;elsewr_pointer<=#`DEL wr_pointer+1;endendendmodule最妙的是testbench的书写,简直不是人写的,比fifo设计本身还要复杂`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; ///为什么要定义为integer类型呢,常用来表示行为级建模,整数的 reg [7:0] exp_data;//期望值,设定好了是0-1-2-3……reg fast_read,fast_write;//调试读比写快的情况,写比读快的情况. reg filled_flag;reg cycle_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;#20 reset_n=0;#20 reset_n=1;if(empty!==1)//读空时调试begin$display("\nerror at time %0t:",$time);$display("after reset,empty status not asserted\n"); $stop;endif(full!==0)//写满时调试begin$display("\nerror at time %0t:",$time);$display("\nerror at time %0t:",$time);$stop;endendalways #100 clock=~clock;always @(posedge clock)beginif(~write_n && read_n)//只写不读时fifo加1fifo_count=fifo_count+1;else if(write_n && ~read_n)//只读不写时fifo减1fifo_count=fifo_count-1;endalways @(negedge clock)beginif(~read_n && (out_data!==exp_data))//读时,读出数据不对,调试begin$display("\nerror at time %0t:",$time);$display("expected data out=%h",exp_data);$display("actual data out=%h\n",out_data);$stop;endif((fast_write||(cycle_count&1'b1))&&~full)//生成写控制信号write_n,生成输入信号in_databeginwrite_n=0;in_data=in_data+1;endelsewrite_n=1;if((fast_read||(cycle_count&1'b1))&&~empty)//生成读控制信号read_n,生成期望信号;beginread_n=0;exp_data=exp_data+1;endelseread_n=1;if(full)//数据满时,读比写要快,设立满标志beginfast_read=1;fast_write=0;filled_flag=1;endif(filled_flag&&empty)//若曾经写满过,又读空了,则结束仿真begin$display("\nsimulation complete -no errors\n"); $finish;endcycle_count=cycle_count+1;//0101交替endalways@(fifo_count)begin# `DEL;# `DEL;# `DEL;case (fifo_count)0:beginif((empty!==1)||(full!==0))begin$display("\nerror at time %0t:",$time);$display("fifo_count=%h",fifo_count);$display("empty=%h\n",empty);$display("full=%h\n",full);$stop;endif(filled_flag==1)begin$display("\nsimulation complete -no error\n");//程序在写满并读空后就停止仿真$finish;endend15:beginif((empty!==0)||(full!==1))begin$display("\nerror at time %0t:",$time);$display("fifo_count=%h",fifo_count);$display("empty=%h\n",empty);$display("full=%h\n",full);$stop;endfilled_flag=1;fast_write=0;fast_read=1;enddefault:beginif((empty!==0)||(full!==0))//正常读写时出现读空标志和写满标志有效,则调试begin$display("\nerror at time %0t:",$time); $display("fifo_count=%h",fifo_count); $display("empty=%h\n",empty);$display("full=%h\n",full);$stop;endendendcaseendendmodule。
verilog同步和异步FIFO,可直接仿真和综合解读

EDA/SOPC课程设计报告题目:同异步FIFO模块的设计与验证姓名:xxx学号:120260320同组人:xxx指导教师:xxx成绩:目录目录 (II)第1章课程设计的要求 (1)1.1 课程设计的目的 (1)1.2 课程设计的条件 (1)1.3 课程设计的要求 (1)第2章课程设计的内容 (2)2.1 设计思路 (2)2.2 软件流程图 (2)2.3 HDL代码阐述 (2)2.4 ModelSim验证 (2)第3章课程设计的心得 (3)第1章课程设计的要求1.1 课程设计的目的●掌握FIFO设计的基本原理与方法●培养Verilog语言模块化设计的思想意识●完成一个FIFO的设计与验证●掌握较大工程的基本开发技能●培养综合运用Modelsim工具进行硬件开发的能力●培养数字系统设计的基本能力●加强对课堂Verilog语言学习的理解与升华1.2 课程设计的条件●设计条件ISE、Modelsim等开发软件的使用1.3 课程设计的要求●设计要求1 设计同步FIFO并验证(包括仿真验证、FPGA验证)●设计要求2 设计异步FIFO并验证(包括仿真验证、FPGA验证)●设计要求3 采用Design Compiler完成其逻辑综合,评估其面积和时序●设计要求4 完成综合后的SDF反标仿真第2章课程设计的内容2.1 设计思路FIFO(First Input First Output),即先进先出队列。
在计算机中,先入先出队列是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令(指令就是计算机在响应用户操作的程序代码,对用户而言是透明的)。
如下图所示,当CPU在某一时段来不及响应所有的指令时,指令就会被安排在FIFO队列中,比如0号指令先进入队列,接着是1号指令、2号指令……当CPU完成当前指令以后就会从队列中取出0号指令先行执行,此时1号指令就会接替0号指令的位置,同样,2号指令、3号指令……都会向前挪一个位置,这样解释大家清楚了吧?在设计之初,我们只对FIFO有一个模糊的了解,只知道它是一个先入先出的队列,但是对于它是如何组成和如何工作并不了解,于是我们设计的首要任务就是查阅资料,逐步完善我们对于同步FIFO和异步FIFO的了解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告题目:同步FIFO的设计姓名: 贾安乐学号:20105000学院:电子科学与应用物理学院专业:电子科学与技术10-3 组员: 徐健勋、兰伯章指导老师:杨小平、杞宁日期:2014.12.15一.课程设计要求1.课程设计的目的通过运用Verilog语言编写程序,体会程序的逻辑性,掌握基本的程序开发的注意事项。
在实践中,学习掌握简单、周全的编程方法。
掌握较大工程的基本开发技能。
培养综合运用Modelsim,Quartus II工具进行硬件开发的能力。
培养数字系统设计的基本能力。
理解FIFO的定义与功能,掌握FIFO的Verilog编写方法。
2.课程设计的条件FIFO的定义与功能Quartus II仿真工具3.课程设计的要求FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
使用Verilog语言和Quartus II仿真器完成同步FIFO的设计和验证。
使用Quartus II和SOPC实验箱验证设计的正确性。
Verilog代码要符合微电子中心编码标准。
4.Verilog语言Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
Verilogs是由Gateway设计自动化公司的工程师于1983年末创立的。
当时Gateway设计自动化公司还叫做自动集成设计系统(Automated Integrated Design Systems),1985年公司将名字改成了前者。
该公司的菲尔·莫比(Phil Moorby)完成了Verilog的主要设计工作。
1990年代初,开放Verilog国际(Open Verilog International, OVI)组织(即现在的Accellera)成立,Verilog面向公有领域开放。
1992年,该组织寻求将Verilog纳入电气电子工程师学会标准。
最终,Verilog成为了电气电子工程师学会1364-1995标准,即通常所说的Verilog-95。
设计人员在使用这个版本的Verilog的过程中发现了一些可改进之处。
为了解决用户在使用此版本Verilog过程中反映的问题,Verilog进行了修正和扩展,这部分内容后来再次被提交给电气电子工程师学会。
这个扩展后的版本后来成为了电气电子工程师学会1364-2001标准,即通常所说的Verilog-2001。
Verilog-2001是对Verilog-95的一个重大改进版本,它具备一些新的实用功能,例如敏感列表、多维数组、生成语句块、命名端口连接等。
目前,Verilog-2001是Verilog的最主流版本,被大多数商业电子设计自动化软件包支持。
2005年,Verilog再次进行了更新,即电气电子工程师学会1364-2005标准。
该版本只是对上一版本的细微修正。
这个版本还包括了一个相对独立的新部分,即Verilog-AMS。
这个扩展使得传统的Verilog可以对集成的模拟和混合信号系统进行建模。
容易与电气电子工程师学会1364-2005标准混淆的是加强硬件验证语言特性的(电气电子工程师学会1800-2005标准),它是Verilog-2005的一个超集,它是硬件描述语言、硬件验证语言(针对验证的需求,特别加强了面对对象特性)的一个集成。
2009年,IEEE 1364-2005和IEEE 1800-2005两个部分合并为IEEE1800-2009,成为了一个新的、统一的SystemVerilog硬件描述验证语言(hardware description and verification language, HDVL)。
5. Quartus II仿真器Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。
Altera在Quartus II 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。
Quartus II提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片(电路)平面布局连线编辑;LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;自动定位编译错误;高效的期间编程与验证工具;二.课程设计的内容1.功能定义:用RAM实现一个同步先进先出(FIFO)队列设计。
由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。
写入和读出的操作由时钟的上升沿触发。
当FIFO的数据满和空的时候分别设置相应的高电平加以指示。
2.顶层信号定义:3.顶层模块划分及功能实现该同步fifo可划分为如下四个模块:①存储器模块(RAM)——用于存放及输出数据;②读地址模块(rp) ——用于读地址的产生;③写地址模块(wp)——用于写地址的产生④标志模块 ---- 用于产生FIFO当前空满状态。
1)RAM模块本设计中的FIFO的RAM,以循环读写的方式实现;1.根据rd_addr_gen模块产生的读地址,在读使能rd为低电平的时候,将RAM中rp[3:0]地址中的对应单元的数据在时钟下降沿到来的时候,读出到data_out[7:0]中。
2.根据wr_addr_gen产生的写地址和在写使能wr为低电平的时候,将输入数据(din[7:0]) 在时钟下降沿到来的时候,写入wp[3:0]地址对应的单元。
2)wp:该模块用于产生FIFO写数据时所用的地址。
由于RAM单元可以用3位地址线寻址。
本模块用3位计数器(wp [2:0])实现写地址的产生。
l 在复位时(reset=1),写地址值为0。
l 如果FIFO未满(~full)且有写使能(wr)有效,则wp[2:0]加1;否则不变。
3)rp:该模块用于产生FIFO读数据时所用的地址。
由于RAM单元可以用3位地址线寻址。
本模块用3位计数器(rp[2:0])实现读地址的产生。
l 在复位时(rreset=1),读地址值为1。
l 如果FIFO未空(~empty)且有读使能(rd_en)有效,则rp[2:0]加1;否则不变。
4)empty和full标志产生FIFO空满标志。
本模块设计并不用读写地址判定FIFO是否空满。
具体计算如下:1.复位的时候,r_empty=1和w_full=0;2.如果wrn和rd同时有效的时候,表示同时对FIFO进行读写操作的时候,FIFO中的数据个数不变。
3.如果wr有效且full=0,表示写操作且FIFO未满时候,FIFO中的数据个数增加了1;4.如果rd有效且empty=0,表示读操作且FIFO未满时候,FIFO中的数据个数减少了1;5.如果rp==wp-3'b010或者(rp==3'b111)&&(wp==3'b001)或者(rp==3'b111)&&(wp==3'b001)时,表示FIFO空,需要设置empty=1;如果rp==wp的时候,表示FIFO现在已经满,需要设置full=1。
4.实验程序(verilog)module syn_fifo(clk,reset,wr,rd,din,dout,full,empty);input clk,reset,wr,rd;input[7:0] din;output[7:0] dout;output full,empty;wire[7:0] din;wire[7:0] doubt;wire full,empty;reg[2:0] wp,rp;reg w_full,r_empty;reg[7:0] fifo[7:0];assign full=w_full;assign empty=r_empty;assign doubt=fifo[rp]; //output the data rp pointed//data wire in the FIFOalways @ (posedge clk)beginif ((wr==1'b0)&&(w_full==1'b0))fifo[wp]<=din;end//wp(indicate then adress of the coming new data)modifiedalways @(posedge reset or posedge clk)beginif(reset)wp<=1'b0;elsebeginif((wr==1'b0)&&(w_full==1'b0))beginif(wp==3'b111)wp<=3'b000;elsewp<=wp+1'b1;endendend//rp(indicate the address of data which was readout) modefied always @(posedge reset or posedge clk)beginif(reset)rp<=3'b111;elsebeginif((rd==1'b0)&&(r_empty==1'b0))beginif(rp==3'b111)rp<=3'b000;elserp<=rp+1'b1;endendend//generate 'empty' indicationalways @(posedge reset or posedge clk)beginif(reset)r_empty=1'b1;elsebeginif(((rd==1'b0)&&(wr==1'b1))&&((rp==wp-3'b010)||((rp==3'b111)&&(wp==3' b001))||((rp==3'b110)&&(wp==3'b000))))r_empty<=1'b1;else if((r_empty==1'b1)&&(wr==1'b0))r_empty<=1'b0;endend//generate 'full' indicationalways @(posedge reset or posedge clk)beginif(reset)w_full<=1'b0;elsebeginif((rp==wp)&&(wr==1'b0)&&(rd==1'b1))w_full<=1'b1;else if((w_full==1'b1)&&(rd==1'b0))w_full<=1'b0;endendendmodule5.实验仿真图形及结果分析⑴先写后读,仿真图如下:分析:有仿真图知,全局使能端起初为复位状态,从输入为1时才有效;写地址使能端在输入数据位0到8时,处于有效状态,也就是正在写地址,写入8个数据时,full=1,表示已经写满了;而读地址在0到5时为高电平无效,也就是此时没有读,在输入6以后开始读地址,所以此时开始读出输入到队列的0到7。