【Verilog】乒乓操作

news2024/11/24 9:43:49

文章目录

      • 乒乓操作
        • 乒乓操作简单介绍
          • 乒乓操作的处理流程
          • 代码参考
            • 功能代码
            • testbench
            • 波形文件
        • 乒乓操作应用场景
          • 何时考虑使用乒乓操作
          • 乒乓操作的三个优点
          • 具体实现分析
            • 不间断地处理数据,无缝缓冲与处理
            • 可以节约缓冲区空间
            • 用低速模块处理高速数据流

乒乓操作

乒乓操作简单介绍

  • 乒乓操作常用于数据流的控制处理,在流水处理中,完成数据的无缝缓冲和处理
  • 典型乒乓操作示例图
    乒乓操作
乒乓操作的处理流程
  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
波形文件

波形文件

乒乓操作应用场景

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

优点1

  • 资源使用情况

    • 两个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/

优点2

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

  • 整体需要处理数据量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原理的具体操作不做过多说明)
    • 此处利用读写空间的时钟间隙与数据写入读出的方式,实现了一块大小的空间存储大量数据的功能,从而节约了缓冲区空间
用低速模块处理高速数据流

优点3

  • 资源使用情况
    • 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的数据量,并且时时刻刻都在读,无间断读
  • 从两侧吞吐量来看,单位时间内输入输出比特数相等,并且实现了低速处理高速数据情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光电器件的种类、原理和应用

光电器件是指能够将光信号转换成电信号或者将电信号转换成光信号的器件。它们广泛应用于通信、计算机、医疗、能源和环保等领域。本文将从光电器件的种类、原理和应用三个方面进行论述。 一、光电器件的种类 根据其功能和结构特点&#xff0c;光电器件可以分为多种类型&#…

【基于CentOS 7 的iscsi服务】

目录 一、概述 1.简述 2.作用 3. iscsi 4.相关名称 二、使用步骤 - 构建iscsi服务 1.使用targetcli工具进入到iscsi服务器端管理界面 2.实现步骤 2.1 服务器端 2.2 客户端 2.2.1 安装软件 2.2.2 在认证文件中生成iqn编号 2.2.3 开启客户端服务 2.2.4 查找可用的i…

Spring Boot-3

学习笔记&#xff08;今天又读了好多篇的博客&#xff0c;做个今天的总结&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff09; PS&#xff1a;快到中伏了&#xff0c;今天还是好热 使用阿里巴巴 FastJson 的设置 1、jackson 和 fastJson 的对比 有很多人已经…

spmvc基本要求

Mvc第一天 今天目标就是将所有的接口相关的注解理解,并且所有的注解都举例写出代码(cdsn上查) 1 mvc的基本概念: mvc: model,view,Controller,简单解释就是模型,视图,控制器.面试会问,md文档这些描述很到位,你可以看看 2 接口注解: (1) Controller/RestController表示当前…

【100天精通python】Day12:面向对象编程_属性和继承的基本语法与示例

目录 1 属性&#xff08;Attributes&#xff09; 1.1 属性的基本语法 1.2 创建用于计算的属性 1.3 属性的安全保护机制 2 继承&#xff08;Inheritance&#xff09; 2.1 继承的基本语法 2.2 方法的重写 2.3 派生类中调用基类的_init_()方法 3 总结 属性是类的特征或数…

记录WordPress安装后我常用的插件

记录WordPress安装后我常用的插件 一、WordPress安装二、插件使用1.添加Astra主题2.Easy Updates Manager2.WP Githuber MD3.WP-Optimize – Cache, Clean, Compress4. WP-PostViews或Post Views Counter5. Easy Table of Contents5. UpdraftPlus Backup/Restore6.WP Super Cac…

【开源项目】低代码数据可视化开发平台-Datav

Datav 基本介绍 Datav是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 它的技术栈为&#xff1a;Vue3 TypeScript4 Vite2 ECharts5 Axios Pinia2 在线预览 账号: admin 密码: 123123预…

4.1 Bootstrap UI 编辑器

文章目录 1. Bootstrap Magic2. BootSwatchr3. Bootstrap Live Editor4. Fancy Boot5. Style Bootstrap6. Lavish7. Bootstrap ThemeRoller8. LayoutIt!9. Pingendo10. Kickstrap11. Bootply12. X-editable13. Jetstrap14. DivShot15. PaintStrap 以下是 15 款最好的 Bootstrap…

Zabbix监控安装grafana并配置图形操作

第三阶段基础 时 间&#xff1a;2023年7月20日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控安装grafana 目录 安装并配置grafana 一、安装Grafana 二、下载安装插件 三、配置grafana 四、Web访问并配置&#xff1a; 安装并配置grafana 一、安装Graf…

微服务之服务注册与发现原理

1. 前言 在传统的开发中&#xff0c;由于提供服务的地址是相对静态的&#xff0c;所以我们只需要找到对应服务的开发人员&#xff0c;然后了解到对应的服务接口地址就可以了。 而在微服务架构开发过程中&#xff0c;如果我们需要调用一个RESTFul风格的API接口&#xff0c;我们…

deep a wavelet 深度自适应小波网络

深度自适应小波网络 1.  原理说明 1.1 the Lifting scheme 提升方案&#xff0c;也称为第二代小波[25]&#xff0c;是定义与第一代小波[6]具有相同属性的小波的一种简单而强大的方法。 提升方案将信号x作为输入&#xff0c; 生成小波变换的近似分量C, 和细节分量d 这两类…

网络安全基础知识解析:了解常见的网络攻击类型、术语及其防范方法

目录 1、网络安全常识和术语 1.1资产 1.2网络安全 1.3漏洞 1.4 0day 1.5 1day 1.6后门 1.7exploit 1.8攻击 1.9安全策略 1.10安全机制 1.11社会工程学 2、为什么会出现网络安全问题&#xff1f; 2.1网络的脆弱性 2.4.1缓冲区溢出攻击原理&#xff1a; 2.4.2缓冲…

NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档问答助手

在文章NLP&#xff08;六十&#xff09;Baichuan-13B-Chat模型使用体验中&#xff0c;我们介绍了Baichuan-13B-Chat模型及其在向量嵌入和文档阅读上的初步尝试。   本文将详细介绍如何使用Baichuan-13B-Chat模型来构建智能文档问答助手。 文档问答流程 智能文档问答助手的流…

手机+App=电脑静音无线鼠标 - WiFimouse初体验

应用情景 大晚上的别人在睡觉&#xff0c;自己又不得不使用电脑&#xff08;台式&#xff09;&#xff0c;鼠标点点点又吵。 专门买个静音鼠标又没钱&#xff0c;咋办~ 效果图 手机app 电脑无线触控板&#xff0c;零噪音&#xff01; 可以单击、移动鼠标光标、可以上下滚动…

什么是Redis?

什么是Redis 什么是Redis一、特性1. 支持多种数据结构2. 读/写速度快&#xff0c;性能高。3. 支持持久化。4. 实现高可用主从复制&#xff0c;主节点做数据副本。5. 实现分布式集群和高可用。 二、基本数据类型string&#xff08;字符串&#xff09;list(双向链表)set(集合)zse…

22matlab数据分析 拉格朗日插值(matlab程序)

1.简述 第一部分&#xff1a;问题分析 &#xff08;1&#xff09;实验题目&#xff1a;拉格朗日插值算法 具体实验要求&#xff1a;要求学生运用拉格朗日插值算法通过给定的平面上的n个数据点&#xff0c;计算拉格朗日多项式Pn(x)的值&#xff0c;并将其作为实际函数f(x)的估…

文心千帆为你而来

1. 前言 3月16号百度率先发布了国内第一个人工智能大语言模型—文心一言。文心一言的发布在业界引起了不小的震动。而文心一言的企业服务则由文心千帆大模型平台提供。文心千帆大模型平台是百度智能云打造出来的一站式大模型开发与应用平台&#xff0c;提供包括文心一言在内的…

文件被识别为病毒,被删除,如何解决

我们的文件有时候有用&#xff0c;但是电脑却识别为病毒&#xff0c;直接给我删除掉了&#xff0c;这让人是真的很XX&#xff0c;那该怎么办呐。 我最近用了这个方法很多次&#xff0c;蛮好用&#xff0c;分享给大家&#xff01; 1、先找到安全中心 2、找不到排除项 3、点击添…

工程矩阵理论复习线路推荐

文章目录 写在前面复习线路推荐前期中期后期其他资料 写在前面 本篇博客仅适用于东南大学研究生 工程矩阵理论科目复习 对不少人来说&#xff0c;研究生的课程成绩相较于本科成绩不是那么重要了。但是由于工程矩阵还是比较有难度的&#xff0c;又很长时间没接触过数学&#x…

7-22练习

题目1 链接5071 不难发现通过A的范围可以缩小B的范围进而减少循环次数 通过B可以消除A的循环 这个是一个很巧妙的地方。这个题还有一个比较容易引起歧义的地方就是i:n每一次循环都要符合条件 这样我们不难构造出一个函数 f(B+x) = 1000*A+x 试验1 运行超时-- 需要减少复杂度…