1.乒乓操作原理
  乒乓操作是一个主要用于数据流控制的处理技巧,典型的乒乓操作如图所示:
  外部输入数据流通过“输入数据选择控制”模块送入两个数据缓冲区中,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM(Dual RAM),SRAM,SDRAM,FIFO等。
 
       在第1个缓冲周期,将输入的数据流缓存到“数据缓冲1”模块,在第2个缓冲周期,“输入数据选择控制”模块将输入的数据流缓存到“数据缓冲2”模块的同时,“输出数据选择控制”模块将“数据缓冲1”模块第一个周期缓存的数据流送到“后续处理”,模块进行后续的数据处理,在第三个缓冲周期,在“输入数据选择控制”模块的再次切换后,输入的数据流缓存到“数据缓冲1”模块,与此同时,“输出数据选择控制”模块也做出切换,将“数据缓冲2”模块缓存的第二个周期的数据送到“后续处理模块”,如此循环。
  这里正是利用了乒乓操作完成数据的无缝缓冲与处理,乒乓操作可以通过“输入数据选择控制”和“输出数据选择控制”按节拍,相互配合地进行来回切换,将经过缓冲的数据流没有停顿的送到“后续处理模块”。

  比如将乒乓操作运用在液晶显示的控制模块上,如图所示。

  对于外部接口传输的图像数据,以一帧图像为单位进行SDRAM的切换控制,当SDRAM1缓存图像数据时,液晶显示的是SDRAM2的数据图像;反之,当SDRAM2缓存图像数据时,液晶显示的是SDRAM1的数据图像,如此反复,这样出路的好处在于液晶显示图像切换瞬间完成,掩盖了可能比较缓慢的图像数据流变换过程。
2.FPGA乒乓操作代码
2.1 FPGA设计代码
 module pingpang
(
input clk ,
input rst_n ,
input [:] data_in , // 输入数据
output reg [:] data_out // 输出数据
); // ------------------------------------------------------ //
reg [:] buffer1 ; // 缓存1
reg [:] buffer2 ; // 缓存2
reg wr_flag ; // 写标志,wr_flag=0,写buffer1,wr_flag=1,写buffer2
reg rd_flag ; // 读标志,rd_flag=0,读buffer2,rd_flag=1,读buffer1
reg state ; // 状态机,0:写1读2,1:写2读1,状态转移和输出分开编码
// ------------------------------------------------------ //
// 状态转移
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 'b0)
begin
state <= 'b0;
end
else
begin
state <= !state;
//case(state)
// 1'b0 : state <= 1'b0; // 写1读2->写2读1
// 1'b1 : state <= 1'b1; // 写2读1->写1读2
// default : state <= 1'b0;
//endcase
end
end
// ------------------------------------------------------ //
// 状态输出
always @ (state)
begin
case(state)
'b0:
begin
wr_flag = 'b0; // 写1
rd_flag = 'b0; // 读2
end
'b1:
begin
wr_flag = 'b1; // 写2
rd_flag = 'b1; // 读1
end
default:
begin
wr_flag = 'b0;
rd_flag = 'b0;
end
endcase
end
// ------------------------------------------------------ //
// 写buffer数据
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 'b0)
begin
buffer1 <= 'b0;
buffer2 <= 'b0;
end
else
begin
case(wr_flag)
'b0 : buffer1 <= data_in; // wr_flag = 0,写buffer1
'b1 : buffer2 <= data_in; // wr_flag = 1,写buffer2
default :
begin
buffer1 <= 'b0;
buffer2 <= 'b0;
end
endcase
end
end
// ------------------------------------------------------ //
// 读buffer数据
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 'b0)
begin
data_out <= 'b0;
end
else
begin
case(rd_flag)
'b0 : data_out <= buffer2; // rd_flag=0,读buffer2
'b1 : data_out <= buffer1; // rd_flag=1,读buffer1
default : data_out <= 'b0;
endcase
end
end
// ------------------------------------------------------ //
endmodule

2.2 FPGA仿真代码

`timescale 1ns / 1ps

module pingpang_tb();

    reg            clk        ;
reg rst_n ;
reg [:] data_in ; wire[:] data_out; always # clk = ~clk; initial
begin
rst_n <= 'b0 ;
clk <= 'b0 ;
#;
rst_n <= 'b1 ;
end always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
data_in <= 'd0;
else
data_in <= data_in + 'b1;
end pingpang dut
(
.clk (clk ),
.rst_n (rst_n ),
.data_in (data_in ), .data_out (data_out )
); endmodule

3.仿真结果

  

最新文章

  1. 检测WCF服务是否在线(动态执行WCF服务)
  2. wpf arcgis engine 当前没有或未启用Spatial Analyst许可解决办法
  3. mysql中profile的使用
  4. [算法] Manacher算法线性复杂度内求解最长回文子串
  5. 如何在Ubuntu下使用TF/SD 卡制作Exynos 4412 u-boot启动盘
  6. StreamCQL
  7. USACO3.44Raucous Rockers
  8. HQL(Hibernate Query language)语言
  9. Linux对于录音
  10. Codeforces Round #349 (Div. 2) C. Reberland Linguistics (DP)
  11. 12.21-Android WebService(基于KSOAP2)
  12. [Swift]LeetCode983. 最低票价 | Minimum Cost For Tickets
  13. java中 &amp; ^ ~ 的运算
  14. C# 处理文件的压缩与解压
  15. java实现两个不同list对象合并后并排序
  16. 【Fiddler学习】Fiddler教程,比较经典全面(转)
  17. Navicat连接mysql备份数据库提示:1577 – Cannot proceed because system tables used by Event Scheduler where found damaged at server start
  18. Subarray Sum &amp; Maximum Size Subarray Sum Equals K &amp;&amp; Subarray Sum Equals K
  19. 【转】Source Insight中文注释为乱码的解决办法
  20. 【读书笔记】Data_Mining_with_R---Chapter_2_Predicting Algae Blooms

热门文章

  1. 阿里云智能数据构建与管理 Dataphin公测,助力企业数据中台建设
  2. @AGC037 - E@ Reversing and Concatenating
  3. Javascript用正则表达式replace替换父串中所有符合条件的子串
  4. Android 字体库的使用
  5. SuperSocket AppServer 的两个事件: NewSessionConnected 和 SessionClosed
  6. ip地址库 与浏览器的关系
  7. Educational Codeforces Round 11、A B题
  8. Educational Codeforces Round 10 A B题、
  9. set_time_limit(0)是什么意思?
  10. mybatis 一对多查询 集合创建空对象的问题