乒乓操作

同步FIFO实现乒乓

fifo1进行写,fifo2进行读(第一次没有可读,考虑数据流入的第一个周期很短)
fifo控制模块,写完fifo1指定深度后,拉低写使能,转而拉高fifo2的写使能
两块fifo,前提是一个fifo存储不够,或者写速率大于读速率

module fifo_pingpang(input rst_n,input clk,input [7:0]data_in,input wr_en,output reg fifo1_wr_en,output reg fifo2_wr_en,output reg fifo1_rd_en,output reg fifo2_rd_en,output [7:0]data_out
);wire [8:0] fifo_cnt1;
wire [8:0] fifo_cnt2;wire [7:0]data_out1;
wire [7:0]data_out2;
assign data_out=fifo1_rd_en?data_out1:data_out2;parameter idle = 4'b0000,start = 4'b0001,ping = 4'b0010,pang = 4'b0100;reg[3:0]state;
reg[3:0]next_state;
//
always@(posedge clk or negedge rst_n)begin
if(!rst_n) state<= idle;
else state <= next_state;
end
//
always@(posedge clk)begincase(state)idle:if(wr_en) next_state <= start;else next_state <= idle;start:if(fifo_cnt1 == 9'd500)next_state <= ping;else next_state <= start;ping:if(fifo_cnt2 == 9'd500)next_state <= pang;else next_state <= ping;pang:if(fifo_cnt1 == 9'd500)next_state <= ping;else next_state <= pang;default: next_state <= idle;       endcase
end//
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginfifo1_wr_en <= 0;fifo2_wr_en <= 0;endelse case(state)idle:beginfifo1_wr_en <= 0;fifo2_wr_en <= 0;fifo2_rd_en <= 0;fifo1_rd_en <= 0;endstart:beginfifo1_wr_en <= 1;fifo2_wr_en <= 0;fifo2_rd_en <= 1;fifo1_rd_en <= 0;end  ping:beginfifo1_wr_en <= 0;fifo2_wr_en <= 1;fifo2_rd_en <= 0;fifo1_rd_en <= 1;endpang:beginfifo1_wr_en <= 1;fifo2_wr_en <= 0;fifo2_rd_en <= 1;fifo1_rd_en <= 0;enddefault:beginfifo1_wr_en <= 0;fifo2_wr_en <= 0;fifo2_rd_en <= 0;fifo1_rd_en <= 0;endendcase
endsyn_fifo syn_fifo_1(.wr_en(fifo1_wr_en),.rd_en(fifo1_rd_en),.data_in(data_in),.rst_n(rst_n),.clk(clk),.data_out(data_out1),.wr_full(),.rd_empty(),.fifo_cnt(fifo_cnt1)
);syn_fifo syn_fifo_2(.wr_en(fifo2_wr_en),.rd_en(fifo2_rd_en),.data_in(data_in),.rst_n(rst_n),.clk(clk),.data_out(data_out2),.wr_full(),.rd_empty(),.fifo_cnt(fifo_cnt2)
);endmodule

同步FIFO

module syn_fifo(input wr_en,input rd_en,input [7:0] data_in,input rst_n,input clk,output reg [7:0] data_out,output reg [8:0]fifo_cnt,output wr_full,output rd_empty
);reg [8:0] rd_ptr,wr_ptr;
reg [7:0]fifo[0:512];//
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginrd_ptr <= 0;wr_ptr <= 0;endelse beginif(!rd_empty && rd_en)beginif(rd_ptr == 500) rd_ptr <= 0;else rd_ptr <= rd_ptr + 1;endif(!wr_full && wr_en)begin if(wr_ptr == 500) wr_ptr <= 0;else wr_ptr <= wr_ptr + 1;endend
endalways@(posedge clk or negedge rst_n)beginif(!rst_n) fifo_cnt <= 0;else if((!rd_empty && rd_en)&&(!wr_full && wr_en)) fifo_cnt <= fifo_cnt;else if(!rd_empty && rd_en) fifo_cnt <= fifo_cnt - 1;else if(!wr_full && wr_en) fifo_cnt <= fifo_cnt + 1;else fifo_cnt <= fifo_cnt;
endalways@(posedge clk or negedge rst_n)beginif(!rst_n) data_out <= 0; else if(!rd_empty && rd_en) data_out <= fifo[rd_ptr];else if(!wr_full && wr_en) fifo[wr_ptr] <= data_in;
endassign wr_full = (fifo_cnt == 500);
assign rd_empty = (fifo_cnt == 0);endmodule

测试文件

`timescale 1 ps/ 1 ps
module fifo_pingpang_vlg_tst();
// constants
// general purpose registersreg clk;
reg [7:0]data_in;
reg rst_n;
reg wr_en;
// wires
wire [7:0]  data_out;
wire fifo1_rd_en;
wire fifo1_wr_en;
wire fifo2_rd_en;
wire fifo2_wr_en;// assign statements (if any)
fifo_pingpang i1 (
// port map - connection between master ports and signals/registers   .clk(clk),.data_in(data_in),.data_out(data_out),.fifo1_rd_en(fifo1_rd_en),.fifo1_wr_en(fifo1_wr_en),.fifo2_rd_en(fifo2_rd_en),.fifo2_wr_en(fifo2_wr_en),.rst_n(rst_n),.wr_en(wr_en)
);
initial
begin
clk=0;
rst_n=0;
data_in=0;
wr_en=0;
#50 rst_n=1;
#50 wr_en=1;
#200000 $stop;
end  always #10 clk=~clk;                                                always #18 data_in=data_in+1;endmodule

很清楚从上图看出两块FIFO的读写使能在循环往复。


从上图可以看出写进去地址1是9,读出来地址1也是9,单一FIFO读写无误。

两块同步FIFO实现乒乓操作相关推荐

  1. IIC总线随机读VHDL实现FIFO实现乒乓操作HM62256测试定制IP核

    博客简介 本博客是本人大二上学期数字系统实验硬件描述3的内容,在此记录以防丢失.目录如下: IIC串行总线时序分析 VHDL编程设计专门状态机与2片异步FIFO来实现乒乓操作 设计HM62256测试电 ...

  2. 芯片设计概念:乒乓操作,串并转换,流水线操作

    乒乓操作 乒乓操作"是一个常常应用于数据流控制的处理技巧.通过乒乓操作实现低速模块处理高速数据的实质是:通过 DPRAM 这种缓存单元实现了数据流的串并转换,并行用 " 数据预处理 ...

  3. 同步FIFO和异步FIFO总结

    文章目录 1. FIFO简介 2. 使用场景 3. 分类 4. FIFO的常见参数 5. FIFO设计 5.1 空满标志生成 5.2 异步FIFO的设计还要注意跨时钟域问题 5.3 gray码如何判断 ...

  4. 数字IC设计系列----单端口RAM、双端口RAM、同步FIFO、异步FIFO

    目录​​​​​​​ 一.单端口RAM原理及实现 1.1.原理 1.2.Verilog实现 1.3.优缺点分析 2.双端口RAM原理及实现 2.1.原理 2.2.Verilog实现 2.3.优缺点分析 ...

  5. HP存储raid5两块硬盘离线lvm下vxfs文件系统恢复数据过程

    故障描述 HP FC MSA2000存储,由于RAID5阵列中出现2块硬盘损坏并离线,而此时只有一块热备盘成功激活,因此导致RAID5阵列瘫痪,上层LUN无法正常使用,用户联系联系北亚数据,整个存储空 ...

  6. FPGA基础知识极简教程(3)从FIFO设计讲起之同步FIFO篇

    博文目录 写在前面 正文 FPGA/ASIC中的FIFO 同步FIFO的设计 参考资料 交个朋友 写在前面 个人博客首页 注:学习交流使用! 正文 FPGA/ASIC中的FIFO FIFO缓冲区如何用 ...

  7. java中同步_在Java中的方法同步和语句同步(块同步) - Break易站

    Java 多线程 线程主要通过共享对字段的访问和参考字段引用的对象进行通信.这种通信形式非常有效,但可能出现两种错误:线程干扰和内存一致性错误.需要一些同步构造来防止这些错误.以下示例显示了我们需要同 ...

  8. 可能是最简单的同步fifo 的设计

    文章目录 可能是最简单的同步fifo 设计 什么是FIFO FIFO的分类 设计FIFO的关键 FIFO空满判断方法 本次同步FIFO设计的基本参数 具体代码实现过程 可能是最简单的同步fifo 设计 ...

  9. 同步fifo的串并_同步FIFO设计Spec(示例代码)

    为什么要写Spec文档: 记得刚进公司实习的时候,导师安排我写一个SM4算法AHB接口模块,要求写代码前 写出详细的设计文档,详细到什么程度呢,看着文档就能把代码写好,作为一个只 在学校写过数字钟的小 ...

  10. 7 centos 时钟跟物理机同步_同步FIFO和异步FIFO

    1.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出 ...

最新文章

  1. ICLR 2020 九篇满分论文!!!
  2. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
  3. Source Insight主题推荐和显示属性设置方法
  4. maven中servlet报错:不识别此servlet问题的解决办法
  5. PowerDesigner 教程篇 - 概念数据模型
  6. 互联网元年:如何提升自己?
  7. python列表的复制,扯一下浅拷贝与深拷贝的区别
  8. css中定义超级链接的样式
  9. 上海有哪些计算机技术专科学校,上海计算机专业大学排名,第一名居然是这所大学!...
  10. (转)几种常用存储过程分页方法
  11. Egg Node.js 从小工坊走向企业级开发 #20
  12. jmeter中控制器其中一个访问不到_Jmeter你所不知道的知识点!
  13. Mozilla 的 Flash 杀手 'Shumway' 已经现身
  14. vue常用的按键修饰符
  15. Spring定时任务@Scheduled提前一秒执行
  16. PAT-A1025 PAT Ranking
  17. Java、JSP网上花店系统
  18. Ubuntu安装opencv的扩展模块-viz模块
  19. 微信小程序框架介绍以及项目目录结构
  20. 幼儿园体育游戏电子计算机教案,幼儿园体育游戏活动教案8篇

热门文章

  1. import oracle utility_Oracle DBMS_UTILITY 用法例子
  2. MySQL入门系列:MySQL数据类型
  3. 202209-GitModel Task05-分类分析
  4. Spring boot启动报错ERROR 5208 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter
  5. matlab识别中国象棋棋盘,c – 使用OpenCV在棋盘中检测中国象棋棋子
  6. 模电学习笔记(十三)——控制直流偏执电路
  7. 计算机如何添加usb平板电脑,平板电脑没有usb接口怎么办
  8. FFT:介绍奈奎斯特限制(2倍频)
  9. V4.0系列软件如何替换授权文件
  10. Body estimation 代码复现之:结合 keras 对 Stack Hourglass 网络架构分析(全网最详细分析)