“ 乒乓操作” 是一个常常应用于数据流控制的处理技巧
其主要特点有:
1、 实现数据的无缝缓冲和处理;
2、 可节约缓冲区空间;
3、 可实现低速模块处理高速模块。
应用场景:数据流输入速度较快,数据流运算处理速度较慢
核心方法:输入缓存到1时,处理2;输入缓存到2时,处理1;按等时间间隔的节拍切换;整体上看数据流是不间断传输的
具体来说, 在第 1个缓冲周期,将输入的数据流缓存到“ 数据缓冲模块1” ;
在第2 个缓冲周期, 通过“ 输入数据选择单元” 的切换, 将输入的数据流缓存到“ 数据缓冲模块2” , 同时将“ 数据缓冲模块1” 缓存的第1 个周期数据通过“ 输入数据选择单元” 的选择, 送到“ 数据流运算处理模块” 进行运算处理;
在第3 个缓冲周期通过“ 输入数据选择单元” 的再次切换,将输入的数据流缓存到“ 数据缓冲模块1” ,同时将“ 数据缓冲模块2”缓存的第2 个周期的数据通过“ 输入数据选择单元” 切换,送到“ 数据流运算处理模块” 进行运算处理。 如此循环。
通过乒乓操作实现低速模块处理高速数据的实质是:通过缓存单元实现了数据流的串并转换, 并行用“ 数据预处理模块1” 和“ 数据预处理模块2” 处理分流的数据, 是面积与速度互换原则的体现。
用寄存器做缓存
module pingpang( clk ,
rst_n ,
data_in , //输入数据
data_out //输出数据
);
input clk ;
input rst_n ;
input [7:0] data_in ;
output [7:0] data_out;
reg [7:0] data_out;
reg [7:0] buffer1 ; //缓存1
reg [7:0] buffer2 ; //缓存2
reg wr_flag ; //写标志, wr_flag = 0,写buffer1,wr_flag = 1,写buffer2
reg rd_flag ; //读标志, rd_flag = 0,读buffer2,wr_flag = 1,读buffer1
reg state ; //状态机, 0:写1读2, 1:写2读1 ,状态转移和输出分开编码
always @ (posedge clk or negedge rst_n) //状态转移
begin
if(rst_n == 1'b0) state <= 1'b0;
else
begin
case(state)
1'b0 : state <= 1'b1;
1'b1 : state <= 1'b0;
default : state <= 1'b0;
endcase
end
end
always @ (state ) //状态输出
begin
case(state)
1'b0 : begin
wr_flag = 1'b0; //写1
rd_flag = 1'b0; //读2
end
1'b1 : begin
wr_flag = 1'b1; //写2
rd_flag = 1'b1; //读1
end
default : begin
wr_flag = 1'b0;
rd_flag = 1'b0;
end
endcase
end
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
buffer1 <= 8'b0;
buffer2 <= 8'b0;
end
else
begin
case(wr_flag)
1'b0 : buffer1 <= data_in; //wr_flag = 0 ,写buffer1
2'b1 : buffer2 <= data_in; //wr_flag = 1 ,写buffer2
default : begin
buffer1 <= 8'b0;
buffer2 <= 8'b0;
end
endcase
end
end
always @ (posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0) data_out <= 8'b0;
else
begin
case(rd_flag)
1'b0 : data_out <= buffer2; //rd_flag = 0,读buffer2
1'b1 : data_out <= buffer1; //rd_flag = 1,读buffer1
default : data_out <= 8'b0 ;
endcase
end
end
endmodule
http://blog.sina.com.cn/s/blog_9f5cdb210100z2b4.html