数字IC手撕代码-握手信号(READY-VALID)

2023-10-27

 前言:

        本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

1.数字IC手撕代码-分频器(任意偶数分频)

2.数字IC手撕代码-分频器(任意奇数分频)

3.数字IC手撕代码-分频器(任意小数分频)

4.数字IC手撕代码-异步复位同步释放

5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

6.数字IC手撕代码-序列检测(状态机写法)

7.数字IC手撕代码-序列检测(移位寄存器写法)

8.数字IC手撕代码-半加器、全加器

9.数字IC手撕代码-串转并、并转串

10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

11.数字IC手撕代码-有限状态机FSM-饮料机

12.数字IC手撕代码-握手信号(READY-VALID)

13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

14.数字IC手撕代码-泰凌微笔试真题

15.数字IC手撕代码-平头哥技术终面手撕真题

16.数字IC手撕代码-兆易创新笔试真题

17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

18.数字IC手撕代码-双端口RAM(dual-port-RAM)

        ...持续更新

为了方便可以收藏导览博客: 数字IC手撕代码-导览目录


目录

握手信号

接口解释

代码

testbench 

波形


握手信号

握手信号,就是为了模块之间的数据交互正确才衍生出来的信号。其无非就是三种可能

        一、上游master提供的valid 信号随数据一起拉高,但下游slave过一段时间才准备好的valid先高为敬。 

        二、下游slave一直准备好,但上游数据过段时间才有效的ready先高为敬。

        三、上游master的valid信号和下游slave的ready同时为高。 

        当我第一次接触握手信号的时候,其实是很清楚上面的三条握手原则的,但是具体的,master和slave之间的握手信号该怎么写代码却迷迷糊糊。就利用这篇文章简单的讲一下master和slave之间是怎么通过握手信号来解决数据交互问题的。同时也为下一篇文章《多级流水线握手》打下基础。下一篇文章会讲解如何利用握手信号,解决流水线因为上流断流及下游反压导致的流水线停滞问题。
        好,回到本篇文章来。

        对于master来说,master发出一个数据,如果数据有效,master就会把传送给slave的valid信号拉高,即告诉slave数据有效可以接收!如果slave准备好了,slave就把传送给master的ready信号拉高,告诉master我准备好了,如果你数据有效,我就可以接收!所以当master传输的数据有效,且slave也准备好时,数据就会在下一个周期被slave取走,master可以接着传下一个数据。

接口解释

        对于你写的模块来说,如果要跟上下做数据握手,那么对于上游,你是一个slave,对于下游,你又是一个master了,所以接口应该如下:

module handshake(
  input         clk       ,
  input         rstn      ,

  input [7:0]   data_i    ,
  input         valid_i   ,
  input         ready_o   ,

  output [7:0]  data_o    ,
  input         ready_i   ,
  output        valid_o
);

        data_i为输入的数据,如果valid_i为1,则数据有效,ready_o是slave发送给上游master的准备信号,如果ready_o准备好了,则为1。

        data_o为该模块输出给下游的数据,如果输出的数据有效,则valid_o为1。下游也会有准备好和没准备好的时候,所以还需要一个下游提供给本模块的ready_i信号,来告诉我们下游是否准备完毕。 

代码

module handshake(
  input         clk       ,
  input         rstn      ,

  input [7:0]   data_i    ,
  input         valid_i   ,
  output        ready_o   ,

  output [7:0]  data_o    ,
  input         ready_i   ,
  output        valid_o
);

reg [7:0] data_o_r;
reg valid_o_r;

assign ready_o = ready_i;     //如果下游准备好了,那我就准备好了

always @(posedge clk)begin
  if(ready_i && valid_i)begin //如果下游准备好了,并且上游数据有效,那就把输入的数据乘以二输出
    data_o_r <= data_i * 2;   
  end
end

always @(posedge clk)begin
  if(!rstn)begin
    valid_o_r <= 1'b0;
  end
  else if(ready_o)begin
    valid_o_r <= valid_i;     //如果我准备好了,我就把上游的valid传递给下游。
  end
end

assign data_o  = data_o_r;
assign valid_o = valid_o_r;

endmodule

代码编写如上,关键就在于注释:

        1.如果下游准备好了,并且上游输入的数据有效的话, 把输入数据乘以二赋值给输出数据。

        2.如果下游准备好可以接收数据了,那本模块就可以处理数据了。

        3.如果本模块准备好了,就把上游的valid_i传递给下游valid_o.

这里的testbench也很重要。

testbench 

module handshake_tb();

reg clk,rstn;

always #5 clk = ~clk;

reg valid_i,ready_i;
wire ready_o,valid_o;

reg  [7:0] data_i;
wire [7:0] data_o;

initial begin
  clk   <= 1'b0;
  rstn  <= 1'b0;
  #25
  rstn    <= 1'b1;
  ready_i <= 1'b1;    //下游准备好了
  valid_i <= 1'b0;    //上游数据无效
  data_i  <= 8'b0000_1000;
  #10
  data_i  <= 8'b0111_1000;
  valid_i <= 1'b1;    //上游数据有效
  #10
  data_i  <= 8'b0100_0100;
  #10
  valid_i <= 1'b0;
  #10
  data_i  <= 8'b0010_0100;
  valid_i <= 1'b1;    //虽然上游数据有效,但下游没准备好
  ready_i <= 1'b0;
  #20
  ready_i <= 1'b1;    //上游数据有效,下游准备好了
  #10
  valid_i <= 1'b0;
  #500
  $stop();
end

handshake u_handshake(
  .clk      (clk)     ,
  .rstn     (rstn)    ,
  .data_i   (data_i)  ,
  .data_o   (data_o)  ,

  .ready_i  (ready_i) ,
  .ready_o  (ready_o) ,
  .valid_i  (valid_i) ,
  .valid_o  (valid_o)

);

endmodule

        我们用tb来模拟本模块的上游master和下游slave,用tb给本模块提供上游数据data_i和valid_i信号。分别模拟了上游断流,即valid_i中途拉低,以及下游反压,即ready_i中途为低的情况。都通过。 

波形

        当输出数据有效的时候,本模块输出的valid_o为高,均符合要求。不熟悉的小伙伴,多看看波形理解一下,整个module也在上面分为两部分贴出来了,感兴趣可以自己动手打一下,上面的是完整代码。tb省略了端口例化和变量定义。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数字IC手撕代码-握手信号(READY-VALID) 的相关文章

  • [keil5] 中有关“TOOLS.INI-Section ‘[C51]‘ : missing ‘PATH‘ enty “错误

    在安装vdmagdi后 打开keil5 uVision5出现 gt gt gt TOOLS INI Section C51 missing PATH enty lt lt lt 错误 原因如下 双击运行vdmagdi exe文件 选择了AG
  • 【ESP32】反复重启

    ESP32开发 反复重启 串口输出如下所示 rst 0xc SW CPU RESET boot 0x13 SPI FAST FLASH BOOT configsip 188777542 SPIWP 0xee clk drv 0x00 q d
  • 变频器典型电路原理图文分析,了解变频器的内在。进线端用RST表示ABC三相,出线端用UVW表示ABC三相。应该只是相邻的字母表示三相,没有具体的物理意义

    变频器典型电路原理图文分析 了解变频器的内在 要想做好变频器维修 当然了解变频器基础知识是相当重要的 也是迫不及待的 下面我们就来分享一下变频器维修基础知识 大家看完后 如果有不正确地方 望您指正 如果觉得还行支持一下 给我一些鼓动 可以简
  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 串口通信知识点总结

    串口是串行接口 serial port 的简称 也称为串行通信接口或COM接口 串口通信是指采用串行通信协议 serial communication 在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式 串口按电气标准及协议来划分
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • 关于DC电源模块有哪些常见的输入和输出参数?

    关于DC电源模块有哪些常见的输入和输出参数 BOSHIDA DC电源模块是一种用于将交流电转换为直流电的设备 广泛应用于电子设备 通信设备 工业控制 仪器仪表等各个领域 在选择和使用DC电源模块时 了解其常见的输入和输出参数是很重要的 输入
  • SH367309芯片

    博主 主要纪录自己常用的几种模式 以及自己觉得需要注意的点 具体的请看数据手册 且大部分都是从数据手册中截取 1 烧写模式 VPRO管脚外接EEPROM烧写电压V PRO 且延时10mS SH367309进入烧写模式 关闭充放电MOSFET
  • 嵌入式培训机构到底怎么选?培训了能找到工作吗

    嵌入式作为一种广泛应用于企业级开发的编程语言 对于想要从事软件开发行业的人来说 掌握嵌入式技能是非常重要的 而参加嵌入式培训机构是一个快速提升技能的途径 然而 很多人可能会担心 参加嵌入式培训了能找到工作吗 如何选择靠谱的嵌入式培训机构 要
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • allegro画PCB如何更新元件的PCB封装

    allegro画PCB如何更新元件的PCB封装 一 更新单个器件的PCB封装 首先菜单栏选择Place gt Update Symbols 如下图 注意此案例是更新了C0805封装 中更新封装 就将上图第二个红色方框中的勾选即可 二 更新某
  • 【MCU简单且容易理解的工作原理】

    SOC是啥 System on Chip 一个芯片 但是片上有好多东西的意思 市面上的AI芯片 包括你知道的麒麟xxx 骁龙xxx等等一些列手机芯片都是SOC 对于SOC设计者来讲 显然要知道码农们码出来的一行行代码是如何在SOC上跑起来的
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作

随机推荐

  • Go语言学习笔记——jwt跨域鉴权

    文章目录 Golang jwt跨域鉴权 jwt介绍 JWT 到底是什么 JWT 和 OAuth 选择签名方法 签名方法和密钥类型 安装jwt 简单使用 生成JWT 解析jwt 测试 生成token并解析token jwt在项目中的使用 第一
  • Java学习 时间类 Period类与Duration类 / LocalDate类与Instant类 用法详解

    Java学习 时间类 Period类与Duration类 LocalDate类与Instant类 用法详解 前言 java 8 中引入的两个与日期相关的新类 Period 和 Duration 两个类看表示时间量或两个日期之间的差 两者之间
  • 交易日均千万订单的存储架构设计与实践

    一 订单系统概述 1 1 业务范围 服务业务线 快递 快运 中小件 大件 冷链 国际 B2B合同物流 CLPS 京喜 三入三出 采购入 退货入 调拨入 销售出 退供出 调拨出 等 1 2 订单中心价值 1 解耦 提升系统稳定性 原系统 交易
  • ERP现状及未来发展趋势分析?

    经过多年发展 ERP作为最重要的管理软件为国内外各类型企业所普遍接受 在我国 ERP行业已经进入成熟期 随着云计算 物联网等技术的推进 国内外竞争环境日益加剧 后ERP时代 表现出以下发展趋势 第一 商业智能化建设加强 经过多年运用 ERP
  • Linux下psql的使用(一):安装、建库、建表、数据载入、删除

    Linux下psql的使用 一 安装 建库 建表 数据载入 删除 一 Install PostgreSQL Database 安装Postgresql sudo apt get install postgresql 登录PostgreSQL
  • Java-类中代码块的使用

    Java 类中代码块的使用 1 概念 代码块 初始化块 代码块用来初始化类和对象 代码块如果有修饰的话 只能使用static 静态代码块和非静态代码块的区别 静态 内部可以有输出语句 随着类的加载而运行 初始化类的属性 一个类中定义了多个静
  • Java编程思想之《一切都是对象》理解

    前言 Java编程思想 中提到 Java是基于C 的 但相比之下 Java是一种 纯粹 的面向对象的程序设计语言 Java中不再使用指针来操作内存中的元素 而是采用对象的 引用 这个引用是作者提出的一种为了简化概念上的理解和C 语言的引用有
  • android 检查fragment是否已绑定到activity

    if isAdded 确定fragment是否绑定到Activity mPhotoRecyclerView adapter PhotoAdpter mItems
  • Linux初步入门学习 1

    一基础入门 command options partment1 partment2 命令 选项 参数1 参数2 cd 返回上一级目录 cd Desktop 进入桌面目录 cd usr bin 进入一般目录 ls 列出所有文件 lp line
  • 蓝桥杯大写变小写C语言,小写数字转化为大写数字(小米OJ题与蓝桥杯题)

    import java util public class Main public static void main String args Scanner scan new Scanner System in String str Str
  • Git本地仓库文件的创建、修改和删除

    目录 基本信息设置 1 设置用户名 2 设置用户名邮箱 Git仓库操作介绍 1 创建一个新的文件夹 2 在文件内初始化git仓库 创建git仓库 3 向仓库中添加文件 1 创建一个文件 2 将文件添加到暂存区 3 将暂存区添加到仓库 4 修
  • JavaScript贪心算法

    贪心算法 贪心算法有 霍夫曼编码 prim和kruskal最小生成树算法 Dijkstra最短路径算法 什么是贪心算法 1 针对一组数据 问题有限制值和期望值 希望从中选出几个数据 在满足限制值的情况下 期望值最大 2 每次选择当前情况下
  • UVA1601 The Morning after Halloween

    UVA1601 The Morning after Halloween 题目链接 做这道题的时候看到一个写的很好的代码 在这里保存下来 以便以后学习 题目分析 这道题和普通的bfs有所不同 解题方法也有些差别 主要是这里有三个移动的 小鬼
  • ant打包提示找不到文件解决办法

    运行ant打包时如果出现提示找不到tools目录下某些jar或者bat文件的错误 是因为新版android sdk目录结构产生了变化 原本在sdk tools目录下的文件被转移到sdk build tools 各个版本号文件夹中 需要复制里
  • matlab将数据输出到excel中,matlab数据输出为excel表格-如何把matlab中的数据导到excel表格中...

    如何将matlab工作空间的数据导出到excel 1 很简单的用xlswrite函数就可以了 首先打开matlab 输入你的代码 2 找到你要存放文件的位置复制绝对路径 致谢文件名的话就会存放在当前目录中 如图以f盘根目录为例 3 然后写x
  • 微信小程序集成和使用mqtt(同时支持uniapp和原生)

    前言 在集成mqtt到小程序的开发过程中 确实走了不少弯路 下了许许多多的示例 一步步踩坑到现在终于完美解决了小程序引入mqtt的方法 该方法原生和uniapp均适用 1 小程序网页配置 先登录微信公众平台 找到开发 开发管理 开发设置页面
  • 记录--MMDeploy安装、python API测试及C++推理

    目录 1 前言 2 MMDeploy安装 2 1 下载代码仓库 2 2 安装构建和编译工具链 2 3 创建Conda虚拟环境 2 4 安装MMDeploy SDK依赖 2 5 安装推理引擎 2 6 设置PATH 2 7 编译安装依赖库 3
  • EleAtt-RNN: Adding Attentiveness to Neurons in Recurrent Neural Networks

    EleAtt RNN Adding Attentiveness to Neurons in Recurrent Neural Networks EleAtt RNN 在循环神经网络的神经元当中加入注意力 1 创新点 现在研究者研究RNN 把
  • 关于JAVA输入输出流造成的Runtime线程阻塞问题【新人笔记】

    萌新最近搬砖遇到一个问题 上面让我做一个dump文件的自动解析系统 至于解析的工具 准备用的是google的breakpad 项目部署环境是linux jdk1 8 其他的无关紧要也就不谈了 一开始写了一个demo放到测试机上面跑 最初代码
  • 数字IC手撕代码-握手信号(READY-VALID)

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代