对于异步FIFO。最基本的两个方面是地址控制和空、满标志位的产生。首先地址控制分别为读地址和写地址,每次读写时能读写地址应该加1.计数次数为ram深度的2倍。当读写地址相等时则空标志位有效,当读写地址最高位互补其余位相等时则满标志位有效。

存储部分採用双口RAM实现。

以下是详细的Verilog代码:

module afifo(r_clk,w_clk,rst_n,data_in,data_out,we,re,empty,full);

input r_clk,w_clk,rst_n,re,we;

output empty,full;

input [7:0] data_in;

output[7:0] data_out;

wire[4:0] waddr,raddr;

wire [4:0] g_waddr,g_raddr;

// empty full

assign empty=(raddr==waddr);

assign full=((raddr[3:0]==waddr[3:0])&&(raddr[4]==(~waddr[4])));





wire wenable=we&&(~full);

wire renable=re&&(~empty);





afifo_control afifo_control1(

.r_clk(r_clk),

.w_clk(w_clk),

.rst_n(rst_n),

.we(wenable),

.re(renable),

.raddr(raddr),

.waddr(waddr)

);





dualram dualram_inst (

.data ( data_in ),

.rdaddress ( raddr[3:0] ),

.rdclock ( r_clk ),

.wraddress ( waddr[3:0] ),

.wrclock ( w_clk ),

.wren ( wenable ),

.q ( data_out )

);





endmodule

module afifo_control(r_clk,w_clk,rst_n,we,re,raddr,waddr);

input r_clk,w_clk,rst_n,we,re;

output reg[4:0] raddr,waddr;





always @(posedge r_clk or negedge rst_n)

if(!rst_n) begin

raddr<=3'd0;

end

else if(re) begin

raddr<=raddr+1'b1;

end

always @(posedge w_clk or negedge rst_n)

if(!rst_n) begin

waddr<=3'd0;

end

else if(we) begin

waddr<=waddr+1'b1;

end

endmodule

testbench例如以下:

`timescale 1 ns/ 1 ps

module afifo_vlg_tst();

// constants                                           

// general purpose registers

//reg eachvec;

// test vector input registers

reg [7:0] data_in;

reg r_clk;

reg re;

reg rst_n;

reg w_clk;

reg we;

// wires                                               

wire [7:0]  data_out;

wire empty;

wire full;





// assign statements (if any)                          

afifo i1 (

// port map - connection between master ports and signals/registers   

.data_in(data_in),

.data_out(data_out),

.empty(empty),

.full(full),

.r_clk(r_clk),

.re(re),

.rst_n(rst_n),

.w_clk(w_clk),

.we(we)

);

initial                                                

begin                                                  

#0; rst_n=1;data_in=100;re=0;we=0;

#50;rst_n=0; 

#50;rst_n=1;  

#20;re=1;

#20;re=0; 

#20;we=1;

#60;data_in=180;

#2000;we=0;re=1;

#3000;re=0;

#100;$stop();

                   

end                                                    

always                                                 

// optional sensitivity list                           

// @(event1 or event2 or .... eventn)                  

begin                                                  

// code executes for every event on sensitivity list   

// insert code here --> begin                          

   #10 r_clk=1; w_clk=0;

   #10 r_clk=0; w_clk=1;

//@eachvec;                                              

// --> end                                             

end                                                    

endmodule

异步FIFO的编程的更多相关文章

  1. 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

    一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...

  2. 异步fifo的设计

    本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据)           ...

  3. 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】

    欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...

  4. 异步FIFO为什么用格雷码

    异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于 ...

  5. 异步FIFO的verilog实现与简单验证(调试成功)

    最近在写一个异步FIFO的时候,从网上找了许多资料,文章都写的相当不错,只是附在后面的代码都多多少少有些小错误. 于是自己写了一个调试成功的代码,放上来供大家参考. 非原创 原理参考下面: 原文 ht ...

  6. 怎么用Verilog语言描述同步FIFO和异步FIFO

    感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...

  7. Verilog设计异步FIFO

    转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...

  8. 异步fifo的Verilog实现

     一.分析 由于是异步FIFO的设计,读写时钟不一样,在产生读空信号和写满信号时,会涉及到跨时钟域的问题,如何解决? 跨时钟域的问题:由于读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO ...

  9. 异步FIFO空满设计延迟问题

    由于设计的时候读写指针用了至少两级寄存器同步,同步会消耗至少两个时钟周期,势必会使得判断空或满有所延迟,这会不会导致设计出错呢? 异步FIFO通过比较读写指针进行满空判断,但是读写指针属于不同的时钟域 ...

随机推荐

  1. Java 斜杠 与 反斜杠

    除号 /(数字键盘的斜杠)网址 /(数字键盘的斜杠)文件地址 \转义 \正则表达式 \

  2. 最小生成树Prim算法 Kruskal算法

    Prim算法(贪心策略)N^2 选定图中任意定点v0,从v0开始生成最小生成树 树中节点Va,树外节点Vb 最开始选一个点为Va,其余Vb, 之后不断加Vb到Va最短距离的点 1.初始化d[v0]=0 ...

  3. 获取当前时间(日期格式) && 获取当前加一年的时间(日期格式)

    获取当前时间,日期格式function currentDate() { var date = new Date(); var y = date.getFullYear(); var m = date. ...

  4. 记录一次通过命令行方式来使用svn碰到的一系列问题

    由于使用Xcode自带的svn管理碰到很多问题,搞得头昏脑胀,找资料时看到小码哥这方面的视频,看完就开始折腾了. 准备:1.远程仓库地址及授权账号(用户名和密码) 2.一份项目代码,之所以要有这份代码 ...

  5. oracle将一个字段拆分成多个值 (regexp_substr函数)

    select regexp_substr(p.attributename, '[^,]+',1,level) c1from tablename p connect by level <= len ...

  6. [SCOI2011]棘手的操作(可并堆/并查集/线段树)

    我懒死了 过于棘手 但这题真的很水的说 毕竟写啥都能过 常见思路: ①:由于不强制在线,所以重新编号之后线段树维护 ②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的 讲一种无脑算法: 对于 ...

  7. sql分组和连接

    SELECT mr.member_id, mr.username, GROUP_CONCAT(DISTINCT jb.company,jb.start_time,jb.end_time)company ...

  8. [Python3网络爬虫开发实战] 2.4-会话和Cookies

    在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录.还有一些网站,在打开浏览器时就自动登录了,而且 ...

  9. [Python3网络爬虫开发实战] 1.9.1-Docker的安装

    Docker是一种容器技术,可以将应用和环境等进行打包,形成一个独立的.类似于iOS的App形式的“应用”.这个应用可以直接被分发到任意一个支持Docker的环境中,通过简单的命令即可启动运行.Doc ...

  10. linux与linux之间共享目录

    1.安装必要的包 nfs-utils           rpcbind (nfs是基于sun公司的rpc通信实现的,所以要装rpcbind) 这2包,在服务端和客户端都需要安装,并启动服务. 启动 ...