当前位置: 首页 > news >正文

「Verilog学习笔记」数据累加输出

专栏前言

本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

在data_out准备好,valid_b拉高时,如果下游的ready_b为低,表示下游此时不能接收本模块的数据,那么,将会拉低ready_a,以反压上游数据输入;

当下游ready_b拉高,且valid_b为高,表示模块与下游握手成功,valid_b在下一个时钟周期拉低;

当下游ready_b拉高,本来由于之前ready_b为低而反压上游的ready_a立即拉高,开始接收上游数据,注意,此细节,也是体现了题目要求的数据传输无气泡。如果ready_a不是立即拉高,而是在下一个时钟周期拉高,那么本模块将会在下游握手成功后空一个时钟周期,才能开始接收上游数据,这样是不满足题目要求的;

要实现4个输入数据的累加,要用1个寄存器将先到达的数据累加之后进行缓存。当上游握手成功,将输入数据累加进寄存器;当累加完4个输入数据,且下游握手成功,将新的输入数据缓存进寄存器。注意,之所以这样设计,是为了不造成性能损失,而之前的累加结果,已经传给了下游。

需要计数器来计数接收到的数据数量,计数器在0-3之间循环。计数器初始值是0,每接收一个数据,计数器加1,当计数器再次循环到0时,表示已经接收到4个数据,可以输出累加结果。

对于ready_a输出信号的产生,如果下游ready_b拉高,表示下游可以接收模块输出数据,那么此时ready_a应拉高,即本模块可以接收上游数据;如果没有接收够4个数据,即valid_b未拉高,那么表示本模块仍可以接收上游数据此时ready_a应拉高。所以综上所述,ready_a信号的产生采用组合逻辑产生。

`timescale 1ns/1nsmodule valid_ready(input 				clk 		,   input 				rst_n		,input		[7:0]	data_in		,input				valid_a		,input	 			ready_b		,output		 		ready_a		,output	reg			valid_b		,output  reg [9:0] 	data_out
);reg [1:0] data_cnt ; assign ready_a = !valid_b | ready_b ; always @ (posedge clk or negedge rst_n) begin if (~rst_n) data_cnt <= 1'd0 ; else if (valid_a && ready_a) data_cnt <= (data_cnt == 2'd3) ? 1'd0 : (data_cnt + 1'd1) ;endalways @ (posedge clk or negedge rst_n) begin if (~rst_n) valid_b <= 1'd0 ; else if (data_cnt == 2'd3 && valid_a && ready_a) valid_b <= 1'd1 ; else if (valid_b && ready_b) valid_b <= 1'd0 ; endalways @ (posedge clk or negedge rst_n) begin if (~rst_n) data_out <= 1'd0 ; else if (ready_b && valid_a && ready_a && (data_cnt == 2'd0)) data_out <= data_in ; else if (valid_a && ready_a) data_out <= data_out + data_in ; endendmodule

相关文章:

  • WIN10系统自带硬盘测速工具使用
  • 2023.11.28 使用tensorflow进行“三好“权重分析
  • LeetCode(34)有效的数独【矩阵】【中等】
  • 【PyTorch】(三)模型的创建、参数初始化、保存和加载
  • html实现360度产品预览(附源码)
  • 使用electron工具打包web端到PC端应用程序
  • PLC通过lora网关采集温室大棚温湿度数据
  • antDesignPro a-table样式二次封装
  • Redis总结
  • 简历上的工作经历怎么写
  • YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)
  • 解决Linux Visual Studio Code显示字体有问题/Liunx下Visual Studio Code更换字体
  • 【brpc学习实践十一】session-local与thread-local应用与brpc抽象工厂模式实践
  • Linux设置Nginx开机自启
  • 【Openstack Train安装】九、Nova安装
  • Java多线程(4):使用线程池执行定时任务
  • JS 面试题总结
  • MySQL数据库运维之数据恢复
  • mysql外键的使用
  • PermissionScope Swift4 兼容问题
  • PHP那些事儿
  • Selenium实战教程系列(二)---元素定位
  • Vue小说阅读器(仿追书神器)
  • Windows Containers 大冒险: 容器网络
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 微信小程序实战练习(仿五洲到家微信版)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Linux权限管理(week1_day5)--技术流ken
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​用户画像从0到100的构建思路
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (done) 两个矩阵 “相似” 是什么意思?
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (WSI分类)WSI分类文献小综述 2024
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计高校学生选课系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)80c52学习之旅-起始篇
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)C#调用WebService 基础
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Micro Framework初体验(二)
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net反混淆脱壳工具de4dot的使用
  • @media screen 针对不同移动设备
  • [acm算法学习] 后缀数组SA
  • [Android学习笔记]ScrollView的使用