【Verilog】乒乓操作

这篇具有很好参考价值的文章主要介绍了【Verilog】乒乓操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

乒乓操作

乒乓操作简单介绍
  • 乒乓操作常用于数据流的控制处理,在流水处理中,完成数据的无缝缓冲和处理
  • 典型乒乓操作示例图
    【Verilog】乒乓操作,数字芯片研发,# Verilog,fpga开发,数字芯片,乒乓操作,Verilog
乒乓操作的处理流程
  1. 输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲区,数据缓冲区可以为任何存储模块(双口RAM、单口RAM、FIFO等)
  2. 在第n个缓冲周期,将输入的数据流缓存到“数据缓冲模块1”
  3. 在第n+1个缓冲周期,通过对“输入数据选择单元”的切换,将输入的数据流缓存到“数据缓冲模块2”,同时将“数据缓冲模块1”缓存的第n个周期的数据通过“输出数据选择单元”的切换,送到“数据流运算处理模块”
  4. 在第n+2个缓冲周期,通过对“输入数据选择单元”的切换,将输入的数据流缓存到“数据缓冲模块1”,同时将“数据缓冲模块2”缓存的第n+1个周期的数据通过“输出数据选择单元”的切换,送到“数据流运算处理模块”
  5. 如此循环
代码参考
功能代码
// 乒乓操作
// 输入数据的存储区域分为buffer1和buffer2,分为两个状态,state = 0和state = 1
// state = 0, 读buffer2,写buffer1
// state = 1, 读buffer1,写buffer2

module pinpong (
  input            clk      ,
  input            rst_n    ,
  input      [7:0] data_in  ,
  output reg [7:0] data_out
  );

// 定义两块存储区域
reg [7:0] buffer1;
reg [7:0] buffer2;
reg       wr_flag; // 写标志 wr_flag=0 写buffer1;wr_flag=1 写buffer2
reg       rd_flag; // 读标志 rd_flag=0 读buffer2;rd_flag=1 读buffer1
reg       state;
 
// 时序逻辑描述状态转换
always @ (posedge clk or negedge rst_n) begin
  if (!rst_n) begin
    state = 1'b0;
  end else begin
    case (state)
      1'b0    : state <= 1'b1;
      1'b1    : state <= 1'b0;
      default : state <= 1'b0;
    endcase
  end
end

// 输出逻辑
always @(*) begin
  if (!rst_n) begin
    wr_flag <= 1'd0;
	rd_flag <= 1'd0;
  end else begin
    case (state)
			1'b0    : begin
			            wr_flag <= 1'd0;//写1读2
			            rd_flag <= 1'd0;
			          end
			1'b1    : begin
			            wr_flag <= 1'd1;//写2读1
			            rd_flag <= 1'd1;
			          end
			default : begin
			            wr_flag <= 1'd0;//写1读2
			            rd_flag <= 1'd0;
			          end
		endcase
	end
end

always @ (posedge clk or negedge rst_n) begin
  if (!rst_n) 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) begin
    data_out <= 8'b0;
  end 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
testbench
`timescale  1ns / 1ps
`include "pingpong.v"

module tb_pinpong;     

// pinpong Parameters  
parameter PERIOD  = 10;


// pinpong Inputs
reg   clk                                  = 0 ;
reg   rst_n                                = 0 ;
reg   [7:0]  data_in                       = 0 ;

// pinpong Outputs
wire  [7:0]  data_out                      ;


initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin
    #(PERIOD) rst_n  =  1;
end

initial
begin
  forever #(PERIOD) data_in = data_in + 1'd1;
end

pinpong  u_pinpong (
    .clk                     ( clk             ),
    .rst_n                   ( rst_n           ),
    .data_in                 ( data_in   [7:0] ),

    .data_out                ( data_out  [7:0] )
);

initial
begin
    $dumpfile("./build/pingpong.vcd");
    $dumpvars;

    #1000
    $finish;
end

endmodule
波形文件

【Verilog】乒乓操作,数字芯片研发,# Verilog,fpga开发,数字芯片,乒乓操作,Verilog

乒乓操作应用场景
  • 学习乒乓操作的处理流程之后,会很明显地想到FIFO操作,因为类似的逻辑想法,从输入端观测,FIFO同样可以对输入数据进行一定的缓存,从输出端观测,从FIFO读出的数据需要按照当前指针按序“选择”读出的数据
  • 那在使用时,究竟如何对乒乓操作和FIFO进行选择
何时考虑使用乒乓操作
  1. 异步FIFO跨时钟域
  2. 效率第一的场景
  3. 非空即读的场景
  4. 不间断读、不间断写的场景
  5. 数据流接口
乒乓操作的三个优点
  1. 不间断地处理数据,无缝缓冲与处理
  2. 可以节约缓冲区空间
  3. 用低速模块处理高速数据流
具体实现分析
不间断地处理数据,无缝缓冲与处理

【Verilog】乒乓操作,数字芯片研发,# Verilog,fpga开发,数字芯片,乒乓操作,Verilog

  • 资源使用情况

    • 两个1K大小的FIFO1和FIFO2
    • 数据输入1K
  • 时序分析

    • 第n缓冲周期,data1写入FIFO1
    • 第n+1缓冲周期,data2写入FIFO2,并data1从FIFO1读出
    • 第n+2缓冲周期,data3写入FIFO1,并data2从FIFO2读出
    • 第n+3缓冲周期,data4写入FIFO2,并data3从FIFO1读出
  • 观测

    • 写侧:n~n+3缓冲周期,无间断写入数据
    • 读侧:n+1~n+3缓冲周期,无间断读出数据
  • 此时思考一个问题:为何在此处使用两个1K大小的FIFO进行乒乓操作,为何不直接使用1个2K大小的FIFO?

    • 若处于同步状态,不存在跨时钟域
      • 2个1K大小的FIFO进行乒乓操作,和使用1个2K大小FIFO是一样的
      • 因为当前为同步状态,同步状态的FIFO不存在任何安全风险,并且此时无论是缓存空间大小的使用,还是模块的使用,乒乓和FIFO没有本质上的区别
      • 这种情况下,可以使用2个1K大小的FIFO配合乒乓操作,同样可以直接使用1个2K大小的FIFO
    • 若处于异步状态,存在跨时钟域
      • 对于使用2个1K大小FIFO乒乓操作来讲,不存在同时对读写地址进行比较判断空满的情况,因为同一个时间段内,一个FIFO只进行写另一个FIFO只进行读,对于单个FIFO来讲,无需将读侧指针同步到写侧判满或将写侧指针同步到读侧判空,则不存在安全风险问题
      • 对于使用1个2K大小的异步FIFO操作来讲,存在同时对读写指针进行比较判断空满的情况,同一个时间段内,既要将读侧指针同步到写侧判满,又需要将写侧指针同步到读侧判空,就有概率出现误判,即误判空或误判满,此时就不能保证数据的无间断
      • 故使用1个2K的异步FIFO会出现对同时读写的地址跨时钟同步判断,会引入不可忽视的安全风险,此处2个1K大小FIFO的乒乓操作优于1个2K大小的异步FIFO
    • 此处也对应“何时考虑使用乒乓操作”的几种场景
可以节约缓冲区空间
  • 节约缓冲区空间就是能对一片缓冲区空间进行循环利用
  • 这里我们借用OpenZR+中ofec中的操作,具体ofec流程在本篇中不做解释,有兴趣可以官网下载文档学习,关注章节7
    • https://www.openzrplus.org/documents/

【Verilog】乒乓操作,数字芯片研发,# Verilog,fpga开发,数字芯片,乒乓操作,Verilog

  • 简单说明此处数据操作就是:按照列优先写入数据,最终按照行优先读出数据

  • 整体需要处理数据量32 * 111bits

    • 输入端:32 * 111bits = 16 * 2 * 111bits,按照列优先将数据写入寄存器,一次写入222bits,总共需要16clk将整块数据写入完毕
    • 输出端:32 * 111bits = 16 * 2 * 111bits = 16 * 2 * (16 * 6+15)bits,按照行优先将数据从寄存器读出,一次读出222bits,总共需要16clk将整块数据读出完毕
  • 如何用到乒乓操作思想

    • 由于数据的写入与读出的结构差异,最先写入的数据并不能立马读出,因为对于要读出的结构来讲,数据并没有填充完毕,则基础操作方式可以为:开辟两片同等大小的缓冲区存储数据,当第一大块数据写入完毕,数据可以按序读出时,读出的同时新到来的数据写入第二片缓冲区,以此类推
    • 进一步地,我们可以按照结构重新审视缓冲空间的利用程度
      • 数据列优先地写入存储器,连续14clk之后,会发现当前首两行的数据已经填充完毕
      • 在第15clk,数据列优先地写入存储器的同时,可以按照行优先的方式读出首两行111bits数据,此时第一块32 * 111bits数据还未完全写入但已可以读出
      • 在第16clk,数据列优先地写入存储器的同时,可以按照行优先的方式读出首两行111bits数据,此时第一块数据32 * 111bits已完全写入,并已经读出两次数据
      • 从第17clk开始,新的整块数据到来时,无需重新开辟新的存储空间,只需将新到来数据写入已读出的位置中即可(不可直接写入,需要按照协议重新排列后写入,但此处关注乒乓操作,ofec原理的具体操作不做过多说明)
    • 此处利用读写空间的时钟间隙与数据写入读出的方式,实现了一块大小的空间存储大量数据的功能,从而节约了缓冲区空间
用低速模块处理高速数据流

【Verilog】乒乓操作,数字芯片研发,# Verilog,fpga开发,数字芯片,乒乓操作,Verilog文章来源地址https://www.toymoban.com/news/detail-603926.html

  • 资源使用情况
    • 4个1K大小的FIFO
  • 时序说明
    • 为方便计算与演示,输入端一次输入1K大小数据,周期为1S,即1Kbits/s
    • 输出端周期为2S
  • 时序分析
    • 使用有限的寄存器处理读侧写侧时钟频率不匹配的情况,可以考虑并行度的调整,让两侧吞吐量一致,2 * 1024bits = 1 * 2048bits
    • 由于读写频率差异,首先对并行度进行调整后,前后吞吐量一致,单位时间内数据的写入读出平衡,需要开辟4个1K大小的缓冲区空间
    • 分析
      • 1~2S内数据以1K大小写了两次,分别按顺序写入FIFO1和FIFO
      • 3~4S内数据以1K大写写了两次,分别按顺序写入FIFO3和FIFO4,与此同时数据从FIFO1与FIFO2取出拼成1个2K大小的数据读出
      • 5~6S内数据以1K大写写了两次,分别按顺序写入FIFO1和FIFO2,与此同时数据从FIFO3与FIFO4取出拼成1个2K大小的数据读出
  • 观测
    • 写侧:在4S的时间内进行4次写入,共写入4 * 1K的数据量,并且时时刻刻都在写,写无间断
    • 读侧:在4S的时间内进行2次读出,共读出2 * 2K的数据量,并且时时刻刻都在读,无间断读
  • 从两侧吞吐量来看,单位时间内输入输出比特数相等,并且实现了低速处理高速数据情况

到了这里,关于【Verilog】乒乓操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Quartus乒乓球游戏电路verilog代码DE2-115开发板

    名称:Quartus乒乓球游戏电路verilog代码DE2-115开发板(文末下载) 软件:Quartus 语言:Verilog 代码功能: 乒乓球游戏电路 设计任务 设计一个数字系统,模拟 选手 A(左方)和选手 B(右方) 的乒乓球比赛游戏,要求具有 如下功能: 1 裁判按开始键后开始 比赛,首先左方 A 发球,每方 发5个

    2024年02月01日
    浏览(36)
  • FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)

    一、实现功能 1. 能正常完成时钟的时、分、秒走时; 2. 使用 LED 闪烁或者改变颜色等方式实现秒的指示,要求闪烁频率或者颜色切换频率为 1Hz ; 3. 使用两位七段数码管显示时和分,其切换方式为:默认显示“分钟”,按住 K4 键显示“小时”,按下 K3 显示秒针; 4. 关上开关

    2024年02月11日
    浏览(43)
  • 【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

    1.1 索引目的 本篇索引旨在 收藏CSDN全站中有关数字IC领域高价值文章 ,在数字芯片领域中,就算将架构,设计,验证,DFT,后端诸多岗位加在一起的数量,都不及软件类一个细分方向的岗位数量多,反映在社区氛围或是开源资料的丰富度而言,数字IC领域相较于软件/互联网领

    2024年02月03日
    浏览(108)
  • FPGA_学习_11_IP核_RAM_乒乓操作

    本篇博客学习另一个IP核,RAM。 用RAM实现什么功能呢? 实现 乒乓操作。 乒乓操作是什么呢? 参考: FPGA中的乒乓操作思想_fpga中乒乓操作的原因_小林家的龙小年的博客-CSDN博客 何为乒乓操作_fanyuandrj的博客-CSDN博客 以下是本人理解: 乒乓操作可以实现低速模块处理高速数据

    2024年02月09日
    浏览(33)
  • FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019   级    电子科学与技术   专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。

    2024年02月03日
    浏览(36)
  • m基于FPGA的数字下变频verilog设计

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 整个数字下变频的基本结构如下所示 NCO使用CORDIC算法,CIC采用h结构的CIC滤波器,HBF采用复用结构的半带滤波器,而FIR则采用DA算法结构。     这里,我们首先假设不考虑中频信号输入的载波频偏问题,即发送的中频

    2024年02月21日
    浏览(38)
  • 【数字IC/FPGA】Verilog中的force和release

    在Verilog中,将 force 用于variable会覆盖掉 过程赋值 ,或者assign引导的 连续(procedural assign)赋值 ,直到 release 。 下面通过一个简单的例子展示其用法: 加法器代码 测试平台代码(主要用于产生激励) 如上所示,正常情况下,u_adder模块的a和b端口由testbench中的a和b信号驱动,

    2024年02月09日
    浏览(34)
  • 年轻人的第一个数字钟!适用于FPGA的数字钟Verilog实现

    因为闲。 当然也不是很闲,初衷是因为本科时上过的数电实验课最后的大作业就是在 FPGA 上实现一个数字钟,这个作业当时困扰了我们班的诸多同学(难以置信,我们只是学材料的弱小可怜又无助{{{(_)}}}。最终,大部分同学在 拷贝一位学长的代码 一位学长的帮助下顺利通过

    2024年02月11日
    浏览(32)
  • Verilog语言fpga小脚丫数字时钟(整点报时,调时,显示秒钟等功能)

    学弟加油!                                                                       ———来自科大焯人 最近刚好学习了数电有关知识,就做了这个项目(闹钟过于繁琐就没有做了) 希望给还在学习的大伙一点参考,完整代码在最后 在这里先附上两串代码分别是d

    2024年02月07日
    浏览(38)
  • 【FPGA显示驱动(Display)】- 使用Verilog实现8位数字显示器

    【FPGA显示驱动(Display)】- 使用Verilog实现8位数字显示器 FPGA是一种可编程的逻辑器件,它可以通过不同的配置来实现多种应用。在本文中,我们将探讨如何使用Verilog语言在FPGA上实现8位数字显示器。 硬件环境 Xilinx ISE Design Suite 14.7 FPGA开发板 八段数码管 设计实现 在Verilog代

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包