FPGA学习之乒乓操作
乒乓操作学习记录如下:
乒乓操作” 是一个常常应用于数据流控制的设计思想, 典型的乒乓操作方法如下图 所示: 乒乓操作的处理流程为:输入数据流通过“ 输入数据选择单元”将数据流等时分配到两个“数据缓冲模块”, 数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM (DPRAM)、单口RAM (SPRAM)、FIFO等。 在第2个缓冲周期, 通过“ 输入数据选择单元” 的切换, 将输入的数据流缓存到“ 数据缓冲模块2”,同时将“数据缓冲模块1”缓存的第1个周期数据通过“输入数据选择单元”的选择,送到“数据流运算处理模块” 进行运算处理。

乒乓操作最大的特点是,通过 数据输入流选择单元和输出数据流选择单元,按照节拍,相互配合的切换,将经过的缓存数据流没有停顿时间地送到 数据流运算处理模块。
乒乓操作优点如下:
1、实现数据的无缝缓冲和处理,按照节拍配合。
2、节约缓冲区空间。
3、可实现低速模块处理高速模块(实质:通过DPRAM这种缓存单元实现数据流的串并转换)。
根据功能画出时序图:

代码实现:
1 module pingpang(
2 input wire clk ,
3 input wire rst_n ,
4 input wire [7:0] data_in ,
5 output reg [7:0] data_out
6 );
7 reg [7:0] buffer1;
8 reg [7:0] buffer2;
9 reg wr_flag;
10 reg rd_flag;
11 reg state ;
12
13 always@(posedge clk or negedge rst_n)
14 begin
15 if(rst_n==1'b0)
16 state<=1'b0;
17 else
18 state<=~state;
19 end
20
21 always@(*)
22 begin
23 case(state)
24 1'b0 : begin wr_flag<=0; rd_flag<=0; end
25 1'b1 : begin wr_flag<=1; rd_flag<=1; end
26 default : begin wr_flag<=0; rd_flag<=0; end
27 endcase
28 end
29
30 always@(posedge clk or negedge rst_n)
31 begin
32 if(rst_n==1'b0)
33 begin
34 buffer1<=8'b0;
35 buffer2<=8'b0;
36 end
37 else
38 begin
39 case(wr_flag)
40 0 : buffer2<=data_in;
41 1 : buffer1<=data_in;
42 default : begin buffer1<=8'b0; buffer2<=8'b0; end
43 endcase
44 end
45 end
46
47
48 always@(posedge clk or negedge rst_n)
49 begin
50 if(rst_n==1'b0)
51 data_out<=8'b0;
52 else
53 begin
54 case(rd_flag)
55 0 : data_out <= buffer1;
56 1 : data_out <= buffer2;
57 default : data_out<=8'b0;
58 endcase
59 end
60 end
61
62 endmodule
63
注 : state 控制两个缓冲器读写状态切换。wr_flag=1,buffer1 写;wr_flag=0,buffer2 写;rd_flag=0,buffer1 读;wr_flag=1,buffer2 读;
RTL视图:

测试代码:
1 `timescale 1ns/1ps
2
3 module tb_pingpang();
4 reg clk ;
5 reg rst_n ;
6 reg [7:0] data_in ;
7 wire [7:0] data_out ;
8
9 initial
10 begin
11 clk = 0;
12 rst_n = 0;
13 #50 rst_n = 1;
14 #1000000 $finish;
15 end
16
17 always #10 clk=~clk;
18
19 always@(posedge clk or negedge rst_n)
20 begin
21 if(rst_n==1'b0)
22 data_in<=8'b0;
23 else
24 data_in<=data_in+1;
25 end
26 pingpang pinpang_inst
27 (
28 .clk (clk) ,
29 .rst_n (rst_n) ,
30 .data_in (data_in) ,
31 .data_out(data_out)
32 );
33
34 endmodule
modelsim 仿真波形:

拓展: 也可以每个缓冲区后跟一个预处理模块,通过乒乓操作可以降低预处理模块的处理速率。如下图所示:

参考资料:
1、Intel FPGA/CPLD设计
2、(105条消息) FPGA设计——verilog实现乒乓操作并modelsim仿真_Fighting_XH的博客-CSDN博客_乒乓操作verilog
FPGA学习之乒乓操作的更多相关文章
- FPGA之乒乓操作
1.乒乓操作原理 乒乓操作是一个主要用于数据流控制的处理技巧,典型的乒乓操作如图所示: 外部输入数据流通过“输入数据选择控制”模块送入两个数据缓冲区中,数据缓冲模块可以为任何存储模块,比较常用的存储单 ...
- 【FPGA技巧篇一】FPGA设计的四种常用思想与技巧之一 :乒乓操作
本文篇章将讨论一下的四种常用 FPGA 设计思想与技巧: 乒乓操作. 串并转换. 流水线操作. 数据接口同步化, 都是 FPGA 逻辑设计的内在规律的体现, 合理地采用这些设计思想能在FPGA设计工作 ...
- FPGA SD 卡 之 乒乓操作 、同步fifo
这里记录一个实际的需要使用乒乓操作的例子:读sd卡数据的时,在spi的模式下.发送单数据块的读取命令,在回应之后会有 512字节的数据.使用乒乓操作,可以用两个八位的寄存器,就可以完成连续的512字节 ...
- FPGA学习的一些误区
转载自网络,作者不详. 我常年担任多个有关FPGA学习研讨的QQ群管理员,长期以来很多新入群的菜鸟们总是在重复的问一些非常简单但是又让新手困惑不解的问题.作为管理员经常要给这些菜鸟们普及基础知识,但是 ...
- [整理]FPGA学习资料汇总
01.特权同学倾情奉献海量FPGA学习资料 http://pan.baidu.com/s/1pJIb32F
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
- 芯航线FPGA学习套件之4*4矩阵键盘模块测试手册
芯航线FPGA学习套件之4*4矩阵键盘模块测试手册 本手册以简明扼要的方式介绍芯航线FPGA学习套件提供的矩阵键盘模块的测试方法: 连接开发板,如下所示: 2.将矩阵键盘模块与开发板按如下图所 ...
- 芯航线FPGA学习套件之多通道串行ADDA(TLV1544,TLC5620)模块测试手册
芯航线FPGA学习套件之多通道串行ADDA模块测试手册 本手册以简明扼要的方式介绍芯航线FPGA学习套件提供的ADDA模块的测试方法: 连接开发板,如下所示: 2.将ADDA V1.1模块与开 ...
- FPGA学习之基本结构
如何学习FPGA中提到第一步:学习.了解FPGA结构,FPGA到底是什么东西,芯片里面有什么,不要开始就拿个开发板照着别人的东西去编程.既然要开始学习FPGA,那么就应该从其基本结构开始.以下内容是我 ...
- Hbase深入学习(六) Java操作HBase
Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...
随机推荐
- 新概念英语(New Concept English),前言
本书向读者提供了一套完整的,经过实践检验的英语学习体系,使得学生能够发挥自己的最大潜能. 听力 口语 阅读 写作 学习语言不在于掌握一套规则和积累大量词汇. 而在于如何运用所学的知识. 学习单词,必须 ...
- 【Docker】安装及部署
一.Ubuntu使用apt安装Docker 官方安装文档:https://docs.docker.com/engine/install/ubuntu/ 1.准备安装环境 [root@Docker-Ub ...
- 案例:自来水厂项目PM编制问题-检查记录
1.策划书部分 选择错误.缺失数据 编的太假了 工期对不上.就算按合同实际也没这么长 合同才210天,当然你算上现在可以编远点,但是编合理点 一些瞎编 这瞎编我信了 但是后面空的表是干啥捏?而且数也不 ...
- 自建CA和公共CA有什么不同?
据统计,全球有数百个公共CA,通常它们是按国家地区进行划分的.这类CA受大众的广泛认可和使用,也被称为公共信任的证书颁发机构.但是由于一些大型企业拥有许多站点,为了更轻松高效的管理以及考虑到维护成本, ...
- 2022-10-31:以下go语言代码输出什么?A:map[];B:nil;C:Panic;D:编译错误。 package main import “fmt“ func main() {
2022-10-31:以下go语言代码输出什么?A:map[]:B:nil:C:Panic:D:编译错误. package main import "fmt" func main( ...
- 2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹
2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处.若小球在编号为 i 的弹 ...
- 2022-04-28:有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,
2022-04-28:有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始, ...
- 2022-03-02:k8s安装minio,yaml如何写?
2022-03-02:k8s安装minio,yaml如何写? 答案2022-03-02: yaml如下: apiVersion: apps/v1 kind: Deployment metadata: ...
- 一个.Net Core开发的开源动态壁纸软件
推荐一个Github上Start超过10.8K的超火.好用.强大的.内置很多优美的动态壁纸软件. 项目简介 这是基于.Net Core+WPF开发的.开源的动态壁纸软件,壁纸设置支持任何文件形式,包括 ...
- 用rust 写一个jar包 class冲突检测工具
Rust很适合写命令行工具,特别是使用clap crate 更加方便,这篇文章介绍使用rust写一个jar包class冲突检测的工具.项目地址: https://github.com/Aitozi/j ...