verilog 流水线控制

news2025/7/31 21:34:38

文章目录

  • Verilog 流水线控制
    • 1、关键问题、实现方式及其对比
    • 2、实现方式
      • 2.1、控流水线输入:根据每一拍的 din_en_d* 打拍,没有最终的 else block
      • 2.2、控流水线输入:根据每一拍的 din_en_d* 打拍,有最终的 else block
      • 2.3、控流水线每一级:根据每一拍的 din_en_d* 和 o_dout_rdy 打拍,没有最终的 else block
      • 2.4、控流水线每一级:根据每一拍的 din_en_d* & o_dout_rdy 打拍,有最终的 else block

Verilog 流水线控制

1、关键问题、实现方式及其对比

1、控流水输入:o_dout_rdy 为低时,没有新数据进入,流水线中剩余的数据继续运算完成
2、控流水线每一级:用 o_dout_rdy 控制每一级,o_dout_rdy 为低时,每一级的end、data、flag 保持,直到 o_dout_rdy 为高时,再继续流水

2、实现方式

2.1、控流水线输入:根据每一拍的 din_en_d* 打拍,没有最终的 else block

din_en = i_din_vld & o_dout_rdy;

reg 				din_en_d0, din_en_d1, din_en_d2, din_en_d3;
reg [4-1:0] 	din_d0, din_d1, din_d2, din_d3;
reg 				din_flag_d0, din_flag_d1, din_flag_d2, din_flag_d3;
always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d0 <= 'd0;
		din_d0 <= 'd0;
		din_flag_d0 <= 'd0;
	end
	else if(din_en) begin
	    din_en_d0 <= din_en;
		din_d0 <= din;
		din_flag_d0 <= din_flag;
	end
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d1 <= 'd0;
		din_d1 <= 'd0;
		din_flag_d1 <= 'd0;
	end
	else if(din_en_d0) begin
		din_en_d1 <= din_en_d0;
		din_d1 <= din_d0;
		din_flag_d1 <= din_flag_d0;
	end	
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d2<= 'd0;
		din_d2 <= 'd0;
		din_flag_d2 <= 'd0;
	end
	else if(din_en_d1) begin
		din_en_d2<= din_en_d1;
		din_d2 <= din_d1;
		din_flag_d2 <= din_flag_d1;
	end	
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d3 <= 'd0;
		din_d3 <= 'd0;
		din_flag_d3<= 'd0;
	end
	else if(din_en_d2) begin
		din_en_d3 <= din_en_d2;
		din_d3 <= din_d2;
		din_flag_d3 <= din_flag_d2;
	end	
end

控流水线输入+dout_en_d*+no_else
存在问题:
1、若下一级没有握手信号,与 din_en_d3 握手得到有效 enable 信号,即输出 din_en_d3 为高时,数据就有效,就会导致输出数据重复且被标记为有效数据的情况
2、对于标志位 din_flag_d* ,由于没有复位,则可能出现最后输出的 din_flag_d3 一直为高的问题,同上面的错误数据一起输出多个错误的标志位

2.2、控流水线输入:根据每一拍的 din_en_d* 打拍,有最终的 else block

din_en = i_din_vld & o_dout_rdy;

reg 				din_en_d0, din_en_d1, din_en_d2, din_en_d3;
reg [4-1:0] 	din_d0, din_d1, din_d2, din_d3;
reg 				din_flag_d0, din_flag_d1, din_flag_d2, din_flag_d3;
always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d0 <= 'd0;
		din_d0 <= 'd0;
		din_flag_d0 <= 'd0;
	end
	else if(din_en) begin
	    din_en_d0 <= din_en;
		din_d0 <= din;
		din_flag_d0 <= din_flag;
	end
	else begin
		din_en_d0 <= 'd0;
		din_d0 <= 'd0;
		din_flag_d0 <= 'd0;
	end
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d1 <= 'd0;
		din_d1 <= 'd0;
		din_flag_d1 <= 'd0;
	end
	else if(din_en_d0) begin
		din_en_d1 <= din_en_d0;
		din_d1 <= din_d0;
		din_flag_d1 <= din_flag_d0;
	end
	else begin
		din_en_d1 <= 'd0;
		din_d1 <= 'd0;
		din_flag_d1 <= 'd0;
	end	
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d2<= 'd0;
		din_d2 <= 'd0;
		din_flag_d2 <= 'd0;
	end
	else if(din_en_d1) begin
		din_en_d2<= din_en_d1;
		din_d2 <= din_d1;
		din_flag_d2 <= din_flag_d1;
	end	
	else begin
		din_en_d2<= 'd0;
		din_d2 <= 'd0;
		din_flag_d2 <= 'd0;
	end
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d3 <= 'd0;
		din_d3 <= 'd0;
		din_flag_d3<= 'd0;
	end
	else if(din_en_d2) begin
		din_en_d3 <= din_en_d2;
		din_d3 <= din_d2;
		din_flag_d3 <= din_flag_d2;
	end
	else begin
		din_en_d3 <= 'd0;
		din_d3 <= 'd0;
		din_flag_d3<= 'd0;
	end	
end

控流水线输入+dout_en_d*+else
可以看到,数据可以不用复位,只复位din_en_d* 和 din_flag_d* 有正确的标志位即可,即

...
else begin
		din_en_d* <= 'd0;
		din_flag_d* <= 'd0;
end
...

2.3、控流水线每一级:根据每一拍的 din_en_d* 和 o_dout_rdy 打拍,没有最终的 else block

din_en = i_din_vld & o_dout_rdy;

reg 				din_en_d0, din_en_d1, din_en_d2, din_en_d3;
reg [4-1:0] 	din_d0, din_d1, din_d2, din_d3;
reg 				din_flag_d0, din_flag_d1, din_flag_d2, din_flag_d3;
always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d0 <= 'd0;
		din_d0 <= 'd0;
		din_flag_d0 <= 'd0;
	end
	else if(din_en) begin
	    din_en_d0 <= din_en;
		din_d0 <= din;
		din_flag_d0 <= din_flag;
	end
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d1 <= 'd0;
		din_d1 <= 'd0;
		din_flag_d1 <= 'd0;
	end
	else if(din_en_d0 & o_dout_rdy) begin
		din_en_d1 <= din_en_d0;
		din_d1 <= din_d0;
		din_flag_d1 <= din_flag_d0;
	end	
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d2<= 'd0;
		din_d2 <= 'd0;
		din_flag_d2 <= 'd0;
	end
	else if(din_en_d1 & o_dout_rdy) begin
		din_en_d2<= din_en_d1;
		din_d2 <= din_d1;
		din_flag_d2 <= din_flag_d1;
	end	
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d3 <= 'd0;
		din_d3 <= 'd0;
		din_flag_d3<= 'd0;
	end
	else if(din_en_d2 & o_dout_rdy) begin
		din_en_d3 <= din_en_d2;
		din_d3 <= din_d2;
		din_flag_d3 <= din_flag_d2;
	end	
end

控流水线输入+dout_en_d* & rdy+no_else

可以看到,依然存在2.1 的两个问题:
1、若下一级没有握手信号,与 din_en_d3 握手得到有效 enable 信号,即输出 din_en_d3 为高时,数据就有效,就会导致输出数据重复且被标记为有效数据的情况
2、对于标志位 din_flag_d* ,由于没有复位,则可能出现最后输出的 din_flag_d3 一直为高的问题,同上面的错误数据一起输出多个错误的标志位

优点:
1、实现了目标功能:用 o_dout_rdy 控制流水线的每一级
2、在有效数据的数量(5个)范围内,din_flag_d3 & o_dout_rdy 就是输出数据有效的enable 信号

2.4、控流水线每一级:根据每一拍的 din_en_d* & o_dout_rdy 打拍,有最终的 else block

din_en = i_din_vld & o_dout_rdy;

reg 				din_en_d0, din_en_d1, din_en_d2, din_en_d3;
reg [4-1:0] 	din_d0, din_d1, din_d2, din_d3;
reg 				din_flag_d0, din_flag_d1, din_flag_d2, din_flag_d3;
always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d0 <= 'd0;
		din_d0 <= 'd0;
		din_flag_d0 <= 'd0;
	end
	else if(din_en) begin
	    din_en_d0 <= din_en;
		din_d0 <= din;
		din_flag_d0 <= din_flag;
	end
	else begin
		din_en_d0 <= 'd0;
		din_d0 <= 'd0;
		din_flag_d0 <= 'd0;
	end
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d1 <= 'd0;
		din_d1 <= 'd0;
		din_flag_d1 <= 'd0;
	end
	else if(din_en_d0) begin
		din_en_d1 <= din_en_d0;
		din_d1 <= din_d0;
		din_flag_d1 <= din_flag_d0;
	end
	else begin
		din_en_d1 <= 'd0;
		din_d1 <= 'd0;
		din_flag_d1 <= 'd0;
	end	
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d2<= 'd0;
		din_d2 <= 'd0;
		din_flag_d2 <= 'd0;
	end
	else if(din_en_d1) begin
		din_en_d2<= din_en_d1;
		din_d2 <= din_d1;
		din_flag_d2 <= din_flag_d1;
	end	
	else begin
		din_en_d2<= 'd0;
		din_d2 <= 'd0;
		din_flag_d2 <= 'd0;
	end
end

always@(posedge i_clk or negedge i_rstn) begin
	if(!i_rstn) begin
		din_en_d3 <= 'd0;
		din_d3 <= 'd0;
		din_flag_d3<= 'd0;
	end
	else if(din_en_d2) begin
		din_en_d3 <= din_en_d2;
		din_d3 <= din_d2;
		din_flag_d3 <= din_flag_d2;
	end
	else begin
		din_en_d3 <= 'd0;
		din_d3 <= 'd0;
		din_flag_d3<= 'd0;
	end	
end

控流水线输入+dout_en_d* & rdy+else
可以看到,功能和数据基本完全错误
原因:else 复位信号后,下一级无法再获取有效信号

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

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

相关文章

真香!宝藏学习方式还可以这样,家人们绝不能错过

文 / 谷雨&#xff08;微信公众号&#xff1a;王不留&#xff09; 《谷雨&#xff1a;告诉大家一个小秘密》一文&#xff0c;辛苦码字半夜&#xff0c;阅读量却扑街&#xff0c;我想根本原因是标题名字起得太差。 前几天看了一个不知真假的截屏&#xff0c;说到小红书上的关键词…

Linux挂载Windows端NFS服务(实现板端Linux与PC互传文件)

Linux挂载Windows端NFS服务&#xff08;实现板端Linux与PC互传文件&#xff09; 1. kernel编译时打开NFS客户端服务 在宿主机打开kernel文件夹&#xff0c;先make clean&#xff0c;然后make menuconfig&#xff0c;进入配置界面&#xff1a; 使用/查找NFS&#xff0c;找到Ne…

终于有阿里P8从开发、运维两个角度总结出了Redis实战手册

从开发、运维两个角度总结了Redis实战经验&#xff0c;深入浅出地剖析底层实现&#xff0c;包含大规模集群开发与运维的实际案例、应用技巧。 前言Redis作为基于键值对的NoSQL数据库&#xff0c;具有高性能、丰富的数据结构、持久化、高可用、分布式等特性&#xff0c;同时Redi…

Windows10安装Docker(基于WSL2,包含WSL2安装教程)

WSL2 wsl是windows自带的功能&#xff0c;只需要开启Windows功能即可安装子系统 可以通过以下命令获取发行版名字 wsl --list --online通过以下命令安装 wsl --install -d ${发行版名字} 如 wsl --install -d Ubuntu-20.04安装后会弹出来子系统设置用户名密码 运行以下命令…

matlab解下列微分方程

解下列微分方程 &#xff08;1&#xff09;ydsolve(‘Dyxy’,‘y(0)1’,‘x’) y -x-12exp(x) x[1 2 3] x 1 2 3 -x-12exp(x) ans 3.4366 11.7781 36.1711 &#xff08;2&#xff09;x’2x3y,y’2xy,x(0)-2,y(0)2.8,0<t<10,做相平面图 新建M函数 function dyweifen1(…

d盘不见了怎么恢复?数据恢复,一键操作

d盘是我们日常生活中常用的一种硬盘&#xff0c;平时我们会用到 d盘来存储我们平时要用到的文件资料&#xff0c;如文档、图片、视频等。而由于我们日常使用它时都是在 Windows系统下&#xff0c;所以就很容易忽略 d盘的重要性了。当遇到 d盘不见的情况&#xff0c; d盘不见了怎…

php宝塔部署实战ptcms小说管理系统源码带采集规则

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发消息跟我说&#xff0c;他下载了一套ptcms的小说系统&#xff0c;在搭建的时候一直部署不好&#xff0c;这套系统还带有采集功能的&#xff0c;让我帮他看看&#xff0c;我抽空看了并测试了一下&#x…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-梯度下降求解逻辑回归

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 我们以最著名也最常用的梯度下降法为例。 现在有一个带两个特征并且没有截距的逻辑回归y(x1,x2)y(x_{1},x_{2})y(x1​,x2​)&#xff0c;两个特征…

【java】 对命名规范的思考——VO,BO,PO,DO,DTO是什么

作为Java开发人员免要接触VO&#xff0c;BO&#xff0c;PO&#xff0c;DO&#xff0c;DTO&#xff0c;但很多朋友对这些概念一直以来都是云里雾里&#xff0c;本来是规范性的东西&#xff0c;使用起来却反而导致更加混乱了。先附上我自己常用的命名习惯&#xff1a; 数据对象&…

IVIF:multi-scale densenet

UNFusion: A unified multi-scale densely connected network for infrared and visible image fusion &#xff08;UNFusion: 用于红外和可见光图像融合的统一多尺度密集连接网络&#xff09; 大多数基于深度学习的方法主要侧重于卷积操作来提取局部特征&#xff0c;但没有充…

推荐系统最通俗介绍

文章目录1.推荐系统概念2.推荐系统发展历史3.个性化推荐系统框架4.部分案例4.1 搜狐视频个性化推荐架构4.2 今日头条推荐系统架构4.3 Netflix推荐系统架构图5. 视频推荐系统流程设计总结资料整理&#xff0c;来源于北大刘宏志教授讲座内容。 在介绍推荐系统前&#xff0c;我们先…

【目标检测】池化层(pooling)的反向传播是怎么实现的

目录&#xff1a;池化层的反向传播是怎么实现的一、前言二、平均池化二、最大池化四、最大池化的数学原理一、前言 卷积神经网络中一个不可导的环节就是Pooling池化操作&#xff0c;因为Pooling池化操作使得feature map的尺寸发生变化&#xff0c;假如做222\times 222的池化&a…

一.node的事件处理;二.node的全局对象;三.node的readline模块;四.node的Web编程

目录 一.node的事件处理 1.node采用的事件驱动模式来进行事件处理的&#xff1a;只有当事件被触发时才执行相关程序 2.node是单线程运行的&#xff1a;采用事件轮询方式&#xff0c;不断的查询事件队列中的消息&#xff0c;然后根据消息执行对应的回调函数 3.node事件机制中…

硬核Vue3响应式原理解析,为你保驾护航渡过寒冬

前言 大家好&#xff0c;我是落叶小小少年&#xff0c;虽然比较菜&#xff0c;虽然才开始写作分享&#xff0c;我始终相信 核心demo更容易理解深的技术点每一次基础的学习都是对知识的巩固 因为从年初就开始使用Vue3了&#xff0c;现在才来学习Vue3&#xff0c;但是也不算晚…

yolo5 训练无人人机识别系统

环境搭建&#xff1a; 安装驱动 点击鼠标右键&#xff0c;如果出现NVIDIA图标&#xff0c;点开&#xff0c;出现如下图片 我的显卡是1650&#xff0c;根据显卡的型号去官网找相应的驱动下载就好了。驱动官网 安装好之后&#xff0c;打开命令行cmd&#xff0c;输入如下指令&a…

登录功能(基于SpringBoot+MP+Vue实现的功能)

目录 前言 一、UserMapper层代码分析 二、UserService层代码分析 1.UserService接口 2.UserServiceImpl实现类 3.UserController层代码分析 4.拦截器设置 5.展示效果图 总结 前言 登录功能是web开发中常见的功能&#xff0c;也是学后端必须要练得一个功能&#xff0c;本…

【JavaWeb】手写一个Servlet+JSP+JavaBean分页

✅✅作者主页&#xff1a;&#x1f517;孙不坚1208的博客 &#x1f525;&#x1f525;精选专栏&#xff1a;&#x1f517;JavaWeb从入门到精通&#xff08;持续更新中&#xff09; &#x1f4cb;&#x1f4cb; 本文摘要&#xff1a;本篇文章主要分享如何使用ServletJSPJavaBean…

C++对象拷贝

前言&#xff1a;本教程使用到的工具是vs2010&#xff1b;能用VC6就用VC6&#xff0c;因为vs2010生成的汇编代码可能有点乱&#xff1b;此外&#xff0c;文章中涉及的汇编&#xff0c;我都会予以解释&#xff0c;所以放心观看。 目录 一、什么是对象拷贝&#xff1f; 二、C对…

【微服务】SpringCloud微服务剔除下线源码解析

&#x1f496; Spring家族及微服务系列文章 ✨【微服务】SpringCloud微服务续约源码解析 ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现&#xff1f;RPC调用&#xff1f;重试机制&#xff1f; ✨【微服务】Nacos通知客户端服务变更以及重试机制 ✨【…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.4 Redis 下载安装与基本使用

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.4 Redis 下载安装与基本使用4.4.1 问题引入4.4.2 …