在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3936|回复: 6

[原创] 乒乓操作

[复制链接]
发表于 2021-1-23 11:20:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
1.乒乓操作原理
  乒乓操作是一个主要用于数据流控制的处理技巧,典型的乒乓操作如图所示:
70.jpg
  外部输入数据流通过“输入数据选择控制”模块送入两个数据缓冲区中,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM(Dual RAM),SRAM,SDRAM,FIFO等。

       在第1个缓冲周期,将输入的数据流缓存到“数据缓冲1”模块,在第2个缓冲周期,“输入数据选择控制”模块将输入的数据流缓存到“数据缓冲2”模块的同时,“输出数据选择控制”模块将“数据缓冲1”模块第一个周期缓存的数据流送到“后续处理”,模块进行后续的数据处理,在第三个缓冲周期,在“输入数据选择控制”模块的再次切换后,输入的数据流缓存到“数据缓冲1”模块,与此同时,“输出数据选择控制”模块也做出切换,将“数据缓冲2”模块缓存的第二个周期的数据送到“后续处理模块”,如此循环。
  这里正是利用了乒乓操作完成数据的无缝缓冲与处理,乒乓操作可以通过“输入数据选择控制”和“输出数据选择控制”按节拍,相互配合地进行来回切换,将经过缓冲的数据流没有停顿的送到“后续处理模块”。

  比如将乒乓操作运用在液晶显示的控制模块上,如图所示。
70.jpg
  对于外部接口传输的图像数据,以一帧图像为单位进行SDRAM的切换控制,当SDRAM1缓存图像数据时,液晶显示的是SDRAM2的数据图像;反之,当SDRAM2缓存图像数据时,液晶显示的是SDRAM1的数据图像,如此反复,这样出路的好处在于液晶显示图像切换瞬间完成,掩盖了可能比较缓慢的图像数据流变换过程。
2.FPGA乒乓操作代码
2.1 FPGA设计代码
module pingpang(
    input            clk,
    input            rst_n,
    input      [7:0] data_in,
    output reg [7:0] data_out
    );

    reg [7:0] buffer0,buffer1;
    reg write_flag;  //write_flag=0 写buffer0, write_flag=1 写buffer1
    reg read_flag;   //read_flag=0  读buffer0, read_flag=1  读buffer1
    reg state;       //state=0 写buffer0,读buffer1 ; state=1 写buffer1,读buffer0

always@(posedge clk or negedge rst_n)
  begin
    if(!rst_n)
  state <= 1'b0;
    else
  state <= !state;
  end

  always@(state)   //状态输出
  begin
     case(state)
       1'b0:
       begin
            write_flag <= 1'b0;
            read_flag  <= 1'b1;
        end
       1'b1:
       begin
            write_flag <= 1'b1;
            read_flag  <= 1'b0;
       end
      default:
     begin
       write_flag <= 1'b0;
       read_flag  <= 1'b1;
     end
     endcase
   end

   //写buffer
always@(posedge clk or negedge rst_n)
begin
      if (!rst_n)
   begin
      buffer0 <= 8'b0;
      buffer1 <= 8'b0;
    end
      else
   begin
     case(write_flag)
        1'b0: buffer0 <= data_in;
        1'b1: buffer1 <= data_in;
     default:
     begin
              buffer0 <= 8'b0;
              buffer1 <= 8'b0;
     end   
     endcase
   end
end

    //读buffer
always@(posedge clk or negedge rst_n)
begin
    if (!rst_n)
begin
    data_out <= 8'b0;
  end
    else
begin
   case(read_flag)
      1'b0: data_out <= buffer0;
      1'b1: data_out <= buffer1;
   default: data_out <= 8'b0;
   endcase
end
end   
endmodule

2.2仿真代码
module pingpang_test;
reg          clk;
reg          rst_n;
reg    [7:0] data_in;
wire   [7:0] data_out;

initial
begin
clk   = 1'b0;
rst_n = 1'b0;
#100
rst_n = 1'b1;
forever #10 clk = ~clk;
#100000  $stop;
end

always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
       data_in <= 8'b0;
    else
       data_in <= data_in + 1'b1;
end

pingpang  u_pingpang(
    .clk(clk),
    .rst_n(rst_n),
    .data_in(data_in),
    .data_out(data_out)
);
endmodule

2.3仿真结果
image.png

发表于 2021-1-23 21:47:18 | 显示全部楼层
you're very strong...
发表于 2021-11-12 13:51:53 | 显示全部楼层
棒棒的帖子
发表于 2021-11-20 10:06:08 | 显示全部楼层
介绍的很好
发表于 2021-11-20 10:33:59 | 显示全部楼层
不错不错,讲的很清楚
发表于 2022-2-15 11:13:02 | 显示全部楼层
人才
发表于 2022-8-19 13:07:06 | 显示全部楼层
厉害了,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 03:20 , Processed in 0.021768 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表