赞
踩
“ 乒乓操作” 是一个常常应用于数据流控制的处理技巧
其主要特点有:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。