ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:57.25KB ,
资源ID:23980085      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23980085.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一个异步FIFO的设计示例.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一个异步FIFO的设计示例.docx

1、一个异步FIFO的设计示例 一、异步FIFO技术规范1.总体描述1.1.功能定义异步FIFO ( First In First Out)指的是在两个相互独立的时钟域下, 数据从一个时钟域写入FIFO而另一个时钟域又从这个FIFO 中将数据读出。本设计用8*256的RAM实现异步FIFO。具体功能:1写使能有效,且FIFO不为满时,在写时钟的上升沿向FIFO中写入数据。2读使能有效,且FIFO不为空时,在读时钟的上升沿从FIFO中读出数据。3当FIFO写满时产生满信号,当FIFO读空时产生空信号。1.2.应用范围异步FIFO 是用来作为缓冲的存储器, 它能对数据进行快速、顺序的存储和发送, 主要

2、用来解决不同速率器件间的速率匹配问题。2.引脚描述图12.1.引脚功能描述信号名输入/输出功能描述r_clk输入读数据时钟信号w_clk输入写数据时钟信号data_in7:0输入8位的输入数据r_en输入读使能,高电平有效,在FIFO非空时,clk上升沿读入数据;w_en输入写使能,高电平有效,在FIFO非满时,clk上升沿写入数据;rst输入异步清零,低电平有效,低电平时读地址,写地址,计数器都清零。empty输出空信号,高电平有效,当FIFO读空时其值为1full输出满信号,高电平有效,当FIFO写满时其值为1data_out7:0输出8位的输出数据2.2.引脚时序描述当写满时full由低

3、变高,当读空时empty由低变高。只要不为满full就为低,不为空empty就为低。3.顶层模块划分图2顶层模块说明:1ram_fifo :存储器模块,用于存放及输出数据;2w_addr_reg : 保存访问RAM的写地址;3r_addr_reg : 保存访问RAM的读地址;4w_addr_adder : 计算RAM下一个写地址;5r_addr_adder: 计算RAM下一个读地址;6cmp : 将读地址和写地址进行比较产生空满标志。设计思想说明:FIFO满空的判定:当读地址的值加1之后等于写地址的值时,表明FIFO写满,当写地址的值加一之后等于读地址的值时,表明FIFO读空。在初始状态时FI

4、FO的读地址在RAM的中间位置,写地址在RAM的开始位置,所以初始状态FIFO不满也不空。空满信号的产生由组合电路产生。4.功能模块描述4.1.ram_fifo模块ram_fifo:RAM存储器。用8*256双口RAM实现。4.2.w_addr_reg模块 w_addr_reg模块:写地址寄存器。用来寄存写地址加法器输出的地址。4.3.r_addr_reg模块 r_addr_reg模块:读地址寄存器。用来寄存读地址加法器输出的地址。4.4.w_addr_adder模块 w_addr_adder模块:写地址加法器。把写地址寄存器的输出加一,即表示当前写 地址的下一地址位。当w_en为低时停止累加

5、。4.5.r_addr_adder模块r_addr_adder模块:读地址加法器。把读地址寄存器的输出加一,即表示当前读地址的下一地址位。当r_en为低时停止累加。4.6.cmp模块 cmp模块:读地址和写地址进行比较,产生满空标志。二、异步FIFO总体设计方案1.概述 异步FIFO有高速、可靠性好等特点。由于异步FIFO 在两个不同时钟系统之间能够快速而方便地传输实时数据, 因此在网络接口、图像处理等方面, 异步FIFO 得到了广泛的应用。异步FIFO 指的是在两个相互独立的时钟域下, 数据从一个时钟域写入FIFO 而另一个时钟域又从这个FIFO 中将数据读出。异步FIFO 通常被用来将数据

6、从一个时钟域安全地传送到另外一时钟域。2.功能模块设计2.1.ram_fifo模块2.1.1.ram_fifo模块描述ram_fifo:RAM存储器。用8*256双口RAM实现。2.1.2.管脚描述信号名称输入 / 输出源功能描述w_clk输入PIN写时钟信号w_en输入PIN写使能信号w_addr7:0输入w_addr_reg写地址信号r_clk输入PIN读时钟信号r_en输入PIN读使能信号r_addr7:0输入w_addr_reg读地址信号data_in7:0输入PIN输入数据data_out7:0输出输出数据表22.1.3.实现说明应使用双口RAM,双地址输入,并且带有读写使能,异步的

7、读写时钟。RAM宽度为8bit,深度为256个存储单元。2.2.w_addr_reg模块2.2.1.w_addr_reg模块描述 w_addr_reg模块:写地址寄存器。用来寄存写地址加法器输出的地址。2.2.2.管脚描述信号名称输入 / 输出源目标功能描述W_clk 输入PIN写时钟信号Rst输入PIN复位信号,低电平有效W_addr_nt 7:0输入W_addr_addr输入数据W_addr7:0 输出RAMW_addr输出数据表32.2.3.实现说明在时钟的上升沿将8位的输入数据锁存输出。2.3.r_addr_reg模块2.3.1.r_addr_reg模块描述 r_addr_reg模块:

8、读地址寄存器。用来寄存读地址加法器输出的地址。2.3.2.管脚描述信号名称输入 / 输出源目标功能描述R_clk 输入PIN读时钟信号Rst输入PIN复位信号,低电平有效R_addr _nt7:0输入R_addr_adder输入数据R_addr7:0 输出RAMR_addr输出数据表42.3.3.实现说明在时钟的上升沿将8位的输入数据所存输出。2.4.w_addr_adder模块2.4.1.w_addr_adder模块描述 w_addr_adder模块:写地址加法器。把写地址寄存器的输出加一,即表示当前写地址的下一地址位。当w_en为低时停止累加。2.4.2.管脚描述信号名称输入 / 输出源目

9、标功能描述w_en 输入PIN1-允许地址加1;0-禁止地址加1;w_addr7:0输入W_addr_reg输入数据W_addr_nt7:0 输出W_addr_reg加一后输出数据表52.4.3.实现说明以w_addr为输入,输出为 w_addr+1。2.5.r_addr_adder模块2.5.1.r_addr_adder模块描述r_addr_adder模块:读地址加法器。把读地址寄存器的输出加一,即表示当前读地址的下一地址位。当r_en为低时停止累加。2.5.2.管脚描述信号名称输入 / 输出源目标功能描述r_en 输入PIN1-允许地址加1;0-禁止地址加1;r_addr7:0输入r_ad

10、dr_reg输入数据r_addr_nt7:0 输出r_addr_reg加一后输出数据表62.5.3.实现说明以r_addr为输入,输出为 r_addr+1。2.6.cmp模块2.6.1.cmp模块描述cmp模块:读地址和写地址进行比较,产生满空标志。2.6.2.管脚描述信号名称输入 / 输出源目标功能描述W_addr7:0输入W_addr_regFIFO当前的写地址R_addr7:0输入R_addr_reFIFO当前的读地址empty输出PIN0-FIFO未空1-FIFO读空full输出PIN0-FIFO未满1-FIFO写满表72.6.3.实现说明将w_addr加一与r_addr对比,相等则f

11、ull为1否则为0;将r_addr加一与w_addr对比,相等则empty为1否则为0;三、异步FIFO验证方案总体验证方案1.1.测试FIFO在正常状态下,是否能写入和读出;full和empty的标志位均为0;1.2.测试FIFO在写满时,full是否能变为高;当满时读出一个数,full能否由高变低。1.3.测试FIFO在读空时,empty是否能变为高;当空时写入一个数,empty能否由高变低。1.4.异步复位后,FIFO是否可以正常工作。另外,在编写激励时,FIFO读空后,则将读使能禁止,FIFO写满后,则将写使能禁止,以保证读出和写入数据的正确性。四、电路设计源代码及仿真激励(1)异步F

12、IFO源代码:module fifo( data_in, data_out, r_en, w_en, r_clk, w_clk, full, empty, rst ); input 7:0data_in;input r_en;input w_en;input r_clk;input w_clk;input rst;output 7:0data_out;output empty;output full;wire 7:0w_addr;wire 7:0r_addr;wire 7:0w_addr_nt;wire 7:0r_addr_nt;ram u1( .data_out(data_out), .da

13、ta_in(data_in), .w_clk(w_clk), .r_clk(r_clk), .w_en(w_en), .r_en(r_en), .w_addr(w_addr), .r_addr(r_addr) );w_addr_reg u2( .w_addr(w_addr), .w_addr_nt(w_addr_nt), .w_clk(w_clk), .rst(rst) );r_addr_reg u3( .r_addr(r_addr), .r_addr_nt(r_addr_nt), .r_clk(r_clk), .rst(rst) );w_addr_adder u4( .w_en(w_en),

14、 .w_addr(w_addr), .w_addr_nt(w_addr_nt) );r_addr_adder u5( .r_en(r_en), .r_addr(r_addr), .r_addr_nt(r_addr_nt) );cmp u6( .w_addr(w_addr), .r_addr(r_addr), .full(full), .empty(empty) ); endmodulemodule ram( data_out, data_in, w_clk, r_clk, w_en, r_en, w_addr, r_addr );input 7:0data_in;input w_clk;inp

15、ut r_clk;input w_en;input r_en;input 7:0w_addr;input 7:0r_addr;output 7:0data_out;reg 7:0ram_f255:0;reg 7:0data_out;always(posedge r_clk) begin if(!r_en) data_out = 8hzz; else begin data_out = ram_fr_addr; end endalways(posedge w_clk) begin if(!r_en) ram_fw_addr = ram_fw_addr; else begin ram_fw_addr

16、 = data_in; end endendmodule/w_addr_regmodule w_addr_reg( w_addr, w_addr_nt, w_clk, rst );input 7:0w_addr_nt;input w_clk;input rst;output 7:0w_addr;reg 7:0w_addr;always(posedge w_clk or negedge rst) begin if(!rst) w_addr = 8h1f; else w_addr = w_addr_nt; endendmodule/r_addr_regmodule r_addr_reg( r_ad

17、dr, r_addr_nt, r_clk, rst );input 7:0r_addr_nt;input r_clk;input rst;output 7:0r_addr;reg 7:0r_addr;always(posedge r_clk or negedge rst) begin if(!rst) r_addr = 8h00; else r_addr = r_addr_nt; endendmodule/w_addr_addermodule w_addr_adder( w_en, w_addr, w_addr_nt );input w_en;input 7:0w_addr;output 7:

18、0w_addr_nt;assign w_addr_nt = w_en ? (w_addr + 8h01) : w_addr;endmodule/r_addr_addermodule r_addr_adder( r_en, r_addr, r_addr_nt );input r_en;input 7:0r_addr;output 7:0r_addr_nt;assign r_addr_nt = r_en ? (r_addr + 8h01) : r_addr;endmodule/cmpmodule cmp ( w_addr, r_addr, empty, full );input 7:0w_addr

19、;input 7:0r_addr;output empty;output full;assign empty = r_addr + 1 = w_addr;assign full = w_addr + 1 = r_addr;endmodule见fifo_tb.vtimescale 1ns/100psmodule fifo_tb;reg 7:0data_in;reg r_en;reg w_en;reg r_clk;reg w_clk;reg rst;wire 7:0data_out;wire full;wire empty;reg 7:0count;fifo u( .data_in(data_in

20、), .data_out(data_out), .r_en(r_en), .r_clk(r_clk), .w_en(w_en), .w_clk(w_clk), .rst(rst), .full(full), .empty(empty) );initial begin r_clk = 0; w_clk = 0; endalwaysbegin#100 r_clk = !r_clk;endalwaysbegin#2 if(empty) r_en = 0; else r_en = 1; if(full) w_en = 0; else w_en = 1;endalwaysbegin#5 if(count

21、) w_clk = !w_clk; else w_clk = 0;endinitial begin r_en = 1; w_en = 1; rst = 0; #100 rst =1; #100 count = 8hff; repeat(255) begin #10 data_in = count; count = count - 1; end #60000/ #100 r_en = 1; w_en = 1; count = 8h04; repeat(4) begin #10 data_in = count; count = count - 1 ; end #10000/ rst = 0; #1000 rst = 1; r_en = 1; w_en = 1; #10 count = 8hff; repeat(300) begin #10 data_in = count; count = count - 1; end count = 8h00; #60000 $stop; endEndmodule

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1