吃透Chisel语言.23.Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解

2023-11-15

Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解

上一篇文章介绍了Chisel计数器以及一些高级用法,内容很多,学下来肯定收获也会很多。除了计数器以外,还有一种寄存器的应用十分广泛,那就是移位寄存器。这一篇文章就详细介绍移位寄存器和Chisel中的移位寄存器,还会囊括并行输出、并行加载的移位寄存器。

移位寄存器

移位寄存器是顺序连接的一组触发器,每个寄存器(触发器)的输出都作为下一个寄存器的输入。下图就是一个4级移位寄存器的示意图:

在这里插入图片描述

移位寄存器电路会在每个时钟tick将数据从左到右移动,那么上面示意图中的4级移位寄存器电路就实现了从dindout的四拍的延时输出。需要注意的是,上面的示意图中使用了四个寄存器,但其实实现中等价于一个移位寄存器,后面两种移位寄存器也是如此。

下面的Chisel代码就实现了一个移位寄存器:

val shiftReg = Reg(UInt(4.W))
shiftReg := Cat(shiftReg(2, 0), din)
val dout = shiftReg(3)

这个代码需要解释一下,它做了这么些事:

  1. 创建了一个4位的寄存器shiftReg
  2. 将移位寄存器的低3位和输入dinCat拼接起来,作为寄存器的下一个输入;
  3. 寄存器的值的最高有效位(Most Significant Bit,MSB)作为dout输出。

还是很好理解的。移位寄存器通常用于将串行数据转换为并行数据或将并行数据转换为串行数据,下面的两个小节就分别介绍这两种移位寄存器。

并行输出移位寄存器

串行输入并行输出配置的移位寄存器可以将一个串行的输入流转换为并行的字,这种移位寄存器可能用于串口(UART)的接收功能。下图就是个4位的并行输出移位寄存器,它的每个触发器的输出都连接到一个单比特输出:

在这里插入图片描述

在四个时钟周期后,电路会将一个4位的串行数据字转换成一个4位的并行数据字q。在这个例子中,我们假设第0位(最低位)首先输入因此在读取完整的字的时候它是到达了最后一个寄存器的。下面的代码就实现了这样一个4位并行输出的移位寄存器:

val outReg = RegInit(0.U(4.W))
outReg := Cat(serIn, outReg(3, 1))
val q = outReg

这个移位寄存器outReg初始化为0,然后我们从MSB开始移入,也就是寄存器值右移,4个周期后,并行输出的结果q就寄存器outReg的值。

并行输入移位寄存器

并行输入串行输出配置的移位寄存器可以将一个并行的输入字(字节)流转换为一个串行的输出流,这种移位寄存器可能用于串口(UART)的发送功能。下图就是一个4位并行输入的移位寄存器的示意图:

在这里插入图片描述

可以看到,每个移位寄存器的输入都有一个Mux来选择加载哪个数据,如果load信号被设置,那就加载d,否则加载0或上一个寄存器的值,也就是移位,简单地说就是load有效时加载,load无效时移位输出。用Chisel代码实现如下:

val loadReg = RegInit(0.U(4.W))
when(load) {
    loadReg := d
} .otherwise {
    loadReg := Cat(0.U, loadReg(3, 1))
}
val serOut = loadReg(0)

注意看otherwise语句块中的Cat调用,在移位的时候最高有效位会填充0,被移出的最低有效位则作为输出连接到serOut上。

结语

这一篇文章介绍了移位寄存器的实现和两种常用的移位寄存器,在实现串口通信的时候会很有用,对后面的高速接口设计可能又会有一定启发。寄存器相关的内容到这里就结束了,不过在数字设计中,不仅仅有寄存器可以保存电路的状态信号,内存(Memory)也是可以保存状态信息的,在处理器设计中内存还用于程序代码和数据的存放,因此十足重要。下一篇文章我们将会用较长的篇幅详细讲述Chisel中的内存实现,敬请期待。

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

吃透Chisel语言.23.Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解 的相关文章

  • Chisel(四)Scala语法 操作符

    学习更多相关知识 关注博主知乎账号 用户名Trustintruth https www zhihu com people suo yi xin 90 activities Scala追求的是纯粹的面向对象 不推荐不属于面向对象的基本类型及其
  • chisel使用自定义/标准库中的函数简化设计(更新)

    主体内容摘自 https blog csdn net qq 34291505 article details 87905379 函数是编程语言的常用语法 即使是Verilog这样的硬件描述语言 也会用函数来构建组合逻辑 对于Chisel这样
  • 第十七章 Chisel基础——数据类型

    一 Chisel的常见问题 在学习Chisel前 应该熟悉一些常见问题 这些问题在编写Chisel的任何时候都应该牢记 Chisel是寄宿在Scala里的语言 所以它本质还是Scala 为了从Chisel转变成Verilog 语言开发人员开
  • RISC-V MCU开发 (七):代码调试

    RISC V MCU开发 七 代码调试 MounRiver Studio MRS 配合GD Link WCH Link JLink等在线调试下载器 可支持GDVFx系列 CH56x CH57x CH58x CH32Fx CH32Vx等RIS
  • chisel-book-chinese

    chisel book chinese 蓝奏云地址 https wwu lanzoue com isdim08x8x5i
  • 详细介绍如何在linux中配置chisel环境

    一 安装java和scala 1 安装java 安装java sudo apt install openjdk 11 jre headless 安装javac sudo apt install openjdk 11 jdk headless
  • 单周期RISC-V架构CPU的设计---设计篇

    目录 一 模块设计 1 pc reg v 1 1 功能说明 1 2 整体框图 1 3 接口列表 1 4 内部信号说明 1 5 关键电路 2 id v 2 1 功能说明 2 2 整体框图 2 3 接口列表 2 4 内部信号说明 2 5 关键电
  • 第二章 Scala入门——让你的代码跑起来

    一 Scala的安装方法 要使用Scala 首先需要保证已经安装好了Java 8 对于Linux操作系统 Java 8已经默认安装了 而使用Windows操作系统的用户 则需要在Java官网下载安装包进行安装 请在CMD PowerShel
  • 和你一起从零开始写RISC-V处理器(2)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 上期回顾 一 正片开始 编写各个模块 pc reg模块 if模块 rom模块 if id模块 id模块 regs模块 id ex模块 ex模块 二 顶层模块搭建 三 测试文件
  • 从零开始设计CPU——DEILT_RISCV

    目录 前言 相关资料参考 Deilt RISC Introduction 1 feature 2 Architecture 3 工程目录文件说明 4 仿真编译环境及工具 进程 2023 03 01 2023 03 08 03 13 2023
  • 玄铁C910总览

    一 开源玄铁C910简介 玄铁C910是由平头哥设计并开源的高性能CPU 基于开源的RISC V指令集 主要面向对性能要求严格的边缘计算领域 如边缘服务器 边缘计算卡 高端机器视觉 高端视频监控 自动驾驶 移动智能终端 5G 基站等 玄铁C
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • 【MACOS(M1)编译Risc-v版OpenOCD】

    MACOS编译Risc v版OpenOCD 准备 1 执行顺序 常见问题 问题1 AC PROG CC C99 告警 2 问题2 texinfo 版本不匹配 问题2 libtool版本不匹配 问题3 编译错误 验证一下 准备1 Instal
  • Chisel手册之Types

    本文是Chisel手册第二篇Types Types 表示硬件设计的Chisel图包含原始节点和类型节点 Chisel类型系统与底层Scala类型系统分开维护 因此类型节点散布在原始节点之间 以允许Chisel检查并响应Chisel类型 Ch
  • 如何制作模块向量?

    我想实例化一个一维元素数组 并且元素扩展模块 我该怎么做 如果我说我最好的猜测 那就是 val elements Vec 64 new element 我收到以下错误消息 error Users mykland work chisel ar
  • 了解用于函数调用的 auipc+jalr 序列

    我试图阅读RISC V生成的程序集gcc我发现gcc创建序列auipc jalr对于某些函数调用 我不明白它是如何工作的 这是一个简单的例子 考虑以下C源文件 unsigned long id unsigned long x return
  • 为什么 $ra 被调用者保存在 RISC-V 中

    我发现在 RISC V 中 ra调用者是否已保存 以 MIPS 为单位 ra是被调用者 这意味着在 RISC V 中被调用者可以直接更改ra没有保存 但自从ra已经改变了 被调用者如何返回调用者 无论名称如何 RISC V ra 和 MIP
  • RISC-V指令集中的FENCE指令是什么意思?

    在浏览 RISC V ISA 时 我在内存模型部分看到了一条指令 FENCE 指令 它到底是什么意思 RISC V ISA 使用宽松的内存模型 其中一个线程执行的加载和存储的顺序在另一个线程看到时可能不同 这样做是为了启用提高内存系统性能的
  • RISC-V 规范引用了“hart”一词 - “hart”是什么意思?

    我找到了参考文献hart在第 35 页RISC V 2 1 规范 https content riscv org wp content uploads 2016 06 riscv spec v2 1 pdf 但是 我找不到它的定义hart在
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以

随机推荐

  • 异地多活paxos实现:Multi-Master-Paxos-3

    Background 200行代码实现paxos kv 中介绍了一款非常简洁的分布式kv存储实现 它是基于 classic paxos 实现分布式一致性 在 paxos的直观解释 中我们提到 每次写入 也就是每个 paxos 实例需要2轮
  • .net 中间件的使用 Use,Run,Map,MapWhen,UseWhen

    net 中间件的使用 Use Run Map MapWhen UseWhen net 提供了几种添加自定义中间件的方法Use Run Map MapWhen UseWhen Use app Use async context next gt
  • 20210208-mmdetection模型转为tensorrt(trt)

    1 下载下载对应的的cuda 由于本机装的是10 1 所以下了个cuda 10 0 130 410 48 linux run 2 下载配置tensorrt 我下的是 TensorRT 7 0 0 11 配置如下 export TR PATH
  • 光纤通道速率查看_光纤好坏如何区分,OM1234多模光纤有何区别?

    1 OM1 颜色为橙色 核心尺寸 62 5um 数据速率 1GB 850nm 距离 高达300米 应用 短程网络 局域网 LAN 和专用网络 2 OM2 颜色为橙色 核心尺寸 50um 数据速率 1GB 850nm 距离 高达600米 通常
  • Linux中用root用户打开vscode

    先打开终端切换到root用户 su root 接着输入 sudo code user data dir vscode root
  • 对数器

    对数器的作用 对数器可以说是验证算法是否正确的一种方式 尤其是在笔试的时候 用贪心算法写出的程序 暂时无法用数学公式严格推导证明 只能通过大量的数据集验证算法的正确性 而大量的数据集当中要包括各种情况 各个方面都要考虑到 对我们自己来说 有
  • WDK_学习笔记_区块链+ViT和Swin transformer

    文章目录 摘要 一 項目 Hyperledger fabric技术的深入学习 1 1 安装 2 2 0 只记录问题 其余按文档操作即可 二 深度学习 Version Transformer ViT 和Swin Transformer 2 1
  • 【Unity从零开始制作空洞骑士】①制作人物的移动跳跃转向以及初始的动画制作

    事情的起因 首先我之前在b站的时候突然发现有个大佬说复刻了空洞骑士 点进去一看发现很多场景都福源道非常详细 当时我除了觉得大佬很强的同时也想自己试一下 而且当时对玩家血条设计等都很模糊 就想着问up主 结果因为制作的时间过了很久了 大佬也有
  • Mock入门

    关键参数 name 唯一标识 return value 当被调用时 返回的值 可为函数 side effct 当存在时 return value不生效 返回side effect 导入库 from unittest import mock
  • 用户画像-标签体系

    1 前言 最近在学习用户画像 翻看了 彭友会 的七十多份资料 简单过了一遍赵宏田老师的书 最近又看了许多微信公众号里的文章 整体感受就是 资料太杂 内容太乱 重复的太多 相互间也会有些冲突 但大致可以归为两类 赵宏田老师的一套 另外其它的一
  • PDF文件复制文字

    最近在看电子书时 发现有的一些 PDF 文件看起来像是扫描的 但能直接复制文字 有的则不能 查找相关资料后明白了 不能复制的pdf文件 01 pdf文件加密了 02 扫描和图形格式做的PDF文件 PDF文件如果加密了 对于一些不允许做修改
  • Android关于AutoService、Javapoet讲解

    AutoService会自动在META INF文件夹下生成Processor配置信息文件 该文件里就是实现该服务接口的具体实现类 而当外部程序装配这个模块的时候 就能通过该jar包META INF services 里的配置文件找到具体的实
  • ChatGPT不能代替人类写作的四个原因

    近期留学圈最火的C位当属ChatGPT 作为一款OpenAI开发的语言模型 ChatGPT在文本生成上的优秀表现大大助力了母语非当地语言的留学生们 写邮件 翻译并理解文本乃至写代码 ChatGPT似乎所向披靡 不少同学也产生了这个想法 用它
  • pageHelper分页失效解决方案

    前言 pageHelper是一款优秀的Mybatis分页插件 在项目中可以非常便利的使用 使开发效率得到很大的提升 但不支持一对多结果映射的分页查询 所以在平时的使用时 对于一对多分页会出现分页错误 这篇文章主要对pageHelper分页错
  • activiti学习之服务任务

    写在前面 对于工作流 我们使用最多的是用户任务节点 用户任务节点就是给用户来生成任务的 需要人来手动的处理 而与之对应的还有服务任务节点 这种类型的节点需要人手动的参与而是程序来执行 即执行某个类的某个方法 这个类一般是org activi
  • Java 实现 MD5 加密算法

    1 MD5 加密算法 1 1 MD5 算法介绍 MD5 消息摘要算法 英文 MD5 Message Digest Algorithm 一种被广泛使用的密码散列函数 可以产生出一个128位 16字节 的散列值 hash value 用于确保信
  • 子图匹配算法——VF2算法讲解

    讲的很通透了 https zhuanlan zhihu com p 259393192
  • CSS五款超好用的布局网站

    CSS Grid Generator https cssgrid generator netlify app CSS Layout https csslayout io Flexbox Generator https loading io
  • vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK

    目录 0 结果展示 1 cmake要点 2 编译报错解决 3 参考链接 0 结果展示
  • 吃透Chisel语言.23.Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解

    Chisel时序电路 三 Chisel移位寄存器 Shift Register 详解 上一篇文章介绍了Chisel计数器以及一些高级用法 内容很多 学下来肯定收获也会很多 除了计数器以外 还有一种寄存器的应用十分广泛 那就是移位寄存器 这一