如何实现乒乓操作.docx_第1页
如何实现乒乓操作.docx_第2页
如何实现乒乓操作.docx_第3页
如何实现乒乓操作.docx_第4页
如何实现乒乓操作.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

乒乓操作介绍乒乓操作是通过“输入数据选择单元”和“输出数据选择单元按节拍的切换,将经过缓冲的数据流没有停顿地送到“数据流运算处理模块”进行运算处理。把乒乓操作当作一个整体,站在这个模块的两端看数据,输入数据和输出数据都是连续不断的,因此非常适合对数据流进行流水线式处理,完成数据的无缝缓冲与处理。处理流程:输入数据流通过 “ 输入数据选择单元 ” 将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM) 、 FIFO 等。在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 1” ;在第 2 个缓冲周期,通过 “ 输入数据选择单元 ” 的切换,将输入的数据流缓存到 “ 数据缓冲模块 2” ,同时将 “ 数据缓冲模块 1” 缓存的第 1 个周期数据通过 “ 输入数据选择单元 ” 的选择,送到 “ 数据流运算处理模块 ” 进行运算处理;在第 3 个缓冲周期通过 “ 输入数据选择单元 ” 的再次切换,将输入的数据流缓存到 “ 数据缓冲模块 1” ,同时将 “ 数据缓冲模块 2” 缓存的第 2 个周期的数据通过 “ 输入数据选择单元 ” 切换,送到 “ 数据流运算处理模块 ” 进行运算处理。如此循环。举个栗子:输入数据存储区域分为buffer1 和buffer1 ,各256个地址,为防止读写冲突,分两个状态:state0读buffer2时,写buffer1;state1读buffer1时,写buffer2;当buffer存满,进行状态切换。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 255:0 ; /缓存区1 reg 7:0 buffer2 255:0 ; /缓存区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 ,状态转移和输出分开编码 reg 7:0 cnt; parameter state0=1b0; parameter state1=1b1; always (posedge clk or negedge rst_n) /状态转移 begin if(rst_n = 1b0) cnt = 0; else cnt = cnt + 1;end always (posedge clk or negedge rst_n) /状态转移 begin if(rst_n = 1b0) state = 1b0; else begin case(state) state0 : if(cnt=8hff) state = 1b1; state1 : if(cnt=8hff) state = 1b0; default : state = 1b0; endcase end end always (state ) /状态输出 begin case(state) state0 : begin wr_flag = 1b0; /写1 rd_flag = 1b0; /读2 end state1 : begin wr_flag = 1b1; /写2 rd_flag = 1b1; /读1 end default : begin wr_flag = 1b0; rd_flag = 1b0; end endcase end always (posedge clk) begin case(wr_flag) 1b0 : buffer1cnt = data_in; /wr_flag = 0 ,写buffer1 1b1 : buffer2cnt = data_in; /wr_flag = 1 ,写buffer2 default : begin buffer1cnt = 8b0; buffer2cnt = 8b0; end endcase end always (posedge clk or negedge rst_n) begin if(rst_n = 1b0) data_out = 8b0; else begin case(rd_flag) 1b0 : data_out = buffer2cnt; /rd_flag = 0,读buffer2 1b1 : data_out = buffer1cnt; /rd_flag = 1,读buffer1 default : data_out = 8b0 ; endcase end end endmoduleTB代码如下:timescale 100ns / 10nsmodule pingpang_tb_v; / Inputs reg clk ; reg rst_n ; reg 7:0 data_in; / Outputs wire 7:0 data_out; / Instantiate the Unit Under Test (UUT) pingpang uut ( .clk (clk ), .rst_n (rst_n ), .data_in (data_in ), .data_out(data_out) ); initial begin / Initialize Inputs clk = 0; rst_n = 0; data_in = 0; #100; rst_n = 1; end always #10 clk = clk; always (posedge clk or negedge rst_n) begin if(rst_n = 1b0) data_in = 8b0; else data_in = data_in + 1b1; end endmodule仿真波形如图:当state进行状态切换后,数据读写存储区域发生了变化,实现乒乓的操作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论