桶式移位器

前言

本篇文章介绍CPU的核心部件之一:桶式移位器,简称BS,英文全称为Barrel Shifter
桶式移位器最大的特点就是能在单周期内完成多种方式,各种位数的移位操作

常见的移位操作

常见的移位操作种类如下:

  • 算术右移
    是指数据向右移位,左侧用符号位补齐
  • 逻辑右移
    是指数据向右移位,左侧用0补齐
  • 算术左移和逻辑左移
    是指数据向左移动,右侧用0补齐
  • 循环右移
    是指数据向右移动,左侧用用测移出的位补齐
    比如1011 0101,循环右移两位就会变成 0110 1101
    注意:循环左移可以通过循环右移来实现,对于n位数据,循环左移m位就相当于循环右移n-m位

桶形移位器的实现方式

下面这张图是我从网上找的,链接地址在这里
在这里插入图片描述

这张图可以非常形象的说明桶形移位器的电路逻辑,先对里面的各种值进行一下说明:

  • S C i SCi SCi:表示移位的位数,对于支持n位移位的移位器来说,有n个 S C i SCi SCi,如果想要移动m位,只需要 S C m SCm SCm设置为1,别的 S C i SCi SCi为0即可。
  • a i ai ai:输入的待移位的数的二进制位,对于64位的移位器,需要64个输入
  • a ′ i a'i ai:输出的移位的数的二进制位,对于64位的移位器,需要64个输出
  • S i n 1 Sin1 Sin1:输入的移位标志,右移为1,左移为0
  • i n 1 in1 in1:一个逻辑与门,输入端为 a i ai ai S i n 1 Sin1 Sin1,表示的意思是右移时输出为 a i ai ai,左移时输出为0
  • D 0 / 1 D0/1 D0/1:右移时左侧填补的位,如果是算术右移就连接的是 a i ai ai的最高位,逻辑右移就是0
  • S i n 2 Sin2 Sin2:左移或者循环右移的时候为1,否则为0
  • S i n 2 ‾ \overline {Sin2} Sin2: S i n 2 Sin2 Sin2的非
  • i n 2 in2 in2:由两个与门一个或门组成的逻辑电路,如下图所示:
    在这里插入图片描述

用公式表示输出$$KaTeX parse error: Can't use function '$' in math mode at position 5: in2i$̲为: in2i = Sin2 \cdot ai+\overline {Sin2}\cdot D0/1$$

i n 2 in2 in2的作用可以描述如下:

  • 右移时为0或者符号位,去填补左侧移出的空位
  • 左移时为输入值,用于实现左移,在到达 i n 2 in2 in2之前没有左移的逻辑

案例分析: 循环右移两位

我们按照上图的标记进行分析,以 a 7 a7 a7位为例,因为是循环右移,所以我们先把对应的值确定一下:

  • 循环右移, S i n 1 Sin1 Sin1=1,所以 i n 1 in1 in1 a 7 a7 a7的输出为1
  • 循环右移, S i n 2 Sin2 Sin2=1, S i n 2 ‾ \overline {Sin2} Sin2=0, D 0 / 1 D0/1 D0/1不重要了,因为 S i n 2 ‾ \overline {Sin2} Sin2=0,所以 S i n 2 ‾ ⋅ D 0 / 1 \overline {Sin2}\cdot D0/1 Sin2D0/1=0,也就是 i n 2 in2 in2的值完全取决于 a i ai ai
  • 右移两位,所以 S C 2 SC2 SC2==1,其余都为0

接下来看流程,为了方便,我们再次拷贝一下上面的图:
在这里插入图片描述

  • i n 1 in1 in1 a 7 a7 a7的输出 i n 1 in1 in1的值
  • 跟着电路走,直到到 S C 2 SC2 SC2接触点的时候,因为 S C 2 SC2 SC2=1,所以开关接通
  • a 7 a7 a7的值从 a ′ 5 a'5 a5输出
  • 同理
    a 7 a7 a7的值从 a ′ 5 a'5 a5输出
    a 6 a6 a6的值从 a ′ 4 a'4 a4输出
    a 5 a5 a5的值从 a ′ 3 a'3 a3输出
    a 4 a4 a4的值从 a ′ 2 a'2 a2输出
    a 3 a3 a3的值从 a ′ 1 a'1 a1输出
    a 2 a2 a2的值从 a ′ 0 a'0 a0输出
  • 然后看 a 1 a1 a1,虽然在 i n 1 in1 in1也输出了 a 1 a1 a1的值,但是没有到 S C 2 SC2 SC2就已经跑出电路了,另一条输出到了上面的 a 1 a1 a1,进入 i n 2 in2 in2电路,此时根据上面的数值我们知道 i n 2 in2 in2电路输出 a 1 a1 a1的值,然后该值沿着电路往左下方走,直到到 S C 2 SC2 SC2,因为 S C 2 SC2 SC2=1,所以开关接通, a 1 a1 a1的值从 a ′ 7 a'7 a7输出
  • 同理,我们可以分析 a 0 a0 a0的值从 a ′ 6 a'6 a6输出
  • 这样,循环右移便完成了。

C语言描述

下面给出桶式移位器的C语言描述,git地址

extern long bs(long in_1,long type,long num);
extern void bs_test(void);
#include "alu.h"
long bs(long in_1,long type,long num)
{long sin1=0;// 右移才会为1long sin2=0;// 左移/循环右移才会为1long sin3=0;// 右移才会为1long d0=0;  // 右移才有意义,逻辑右移为0,算术右移为最高位num%=(sizeof(long)*8);switch (type) {case 0:// 逻辑左移sin1=0;sin2=1;sin3=0;d0=0;num =(sizeof(long)*8-num);break;case 1:// 逻辑右移sin1=1;sin2=0;sin3=1;d0=0;break;case 2:// 算术右移sin1=1;sin2=0;sin3=1;d0=in_1>>(sizeof(long)*8-1);break;case 3:// 循环右移sin1=1;sin2=1;sin3=1;d0=0;break;default:break;}// 每个位都会输出,为了左移或者循环右移long a = in_1;// 默认输出为0,只有发生移动才会有值long in1 = 0;// 计算in1的输出,如果不是右移,原样输出// 使用-1来表示位都是1的情况if(sin1!=0){unsigned long temp = in_1;in1 = (temp>>num);}// 下面的三步走的in2的电路long in2_1 = alu_and(a, sin2==0?0:-1, sizeof(long)*8);long in2_2 = alu_and(sin3, d0, sizeof(long)*8);long in2 = alu_or(in2_1, in2_2==0?0:-1, sizeof(long)*8);in2 <<=(sizeof(long)*8-num);return in2|in1;
}

下面是一个测试例子:

void bs_test(void)
{printf("bs test start:\n");for(int i = 0;i<sizeof(long)*8;i++){long r1 = bs(1, 0, i);printf("\t1 move left %d:%ld\n",i,r1);}for(int i = 0;i<sizeof(long)*8+1;i++){long r1 = bs(-1, 1, i);printf("\t1 move right logic %d:%ld\n",i,r1);}for(int i = 0;i<sizeof(long)*8+1;i++){long r1 = bs(-1, 2, i);printf("\t1 move right arithmetic %d:%ld\n",i,r1);}long a = 0xAAAAAAAAAAAAAAAA;for(int i = 0;i<sizeof(long)*8+1;i++){long r1 = bs(a, 3, i);printf("\t1 move right loop %d:%ld\n",i,r1);}printf("bs test end\n");
}

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

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

相关文章

实验笔记之——基于windows复现Instant-NGP

之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。 学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客文章浏览阅读851次&#xff0c;点赞22次&#xff0c;收藏21次。NeRF 所做的任务是 Novel View Synthesis&#xff08;…

在前端开发中,如何优化网站的加载速度?

在前端开发中&#xff0c;网站的加载速度是一个至关重要的因素&#xff0c;它直接影响着用户体验和搜索引擎优化&#xff08;SEO&#xff09;。一个快速、响应迅速的网站不仅能让用户更加满意&#xff0c;还能提高网站的排名和流量。那么&#xff0c;如何优化网站的加载速度呢&…

el-radio-button自适应充满盒子的写法

业务场景&#xff1a;当盒子较宽时&#xff0c;希望 el-radio-button 自适应充满盒子。 el-radio-button 自适应充满盒子的写法 <el-form :inline"true" :model"searchForm"><el-form-item style"display: flex; align-items: center;"…

【Java EE初阶七】多线程案例(阻塞队列与生产者消费者模型)

1. 阻塞队列 队列是先进先出的一种数据结构&#xff1b; 阻塞队列&#xff0c;是基于队列&#xff0c;做了一些扩展&#xff0c;适用于多线程编程中&#xff1b; 阻塞队列特点如下&#xff1a; 1、是线程安全的 2、具有阻塞的特性 2.1、当队列满了时&#xff0c;就不能往队列里…

串口通信要点解析

目录 简介&#xff1a; UART 协议解析&#xff1a; 串口协议工作过程&#xff1a; 简介&#xff1a; 串行通信协议包括&#xff1a; UART通用异步收发传输器 (Universal Asynchronous ReceiverTransmitter) 是一种串行异步收发协议 (异步是指通信双方使用各自的时钟控制数据…

fineBI web组件传参

1、fineBI web组件传参 1.1、 Web组件- FineBI帮助文档 FineBI帮助文档1. 概述1.1 版本FineBI 版本HTML5移动端展现功能变动6.0--V11.0.83web组件适配移动端效果优化6.0.13-web组件支持传递参数 ${过滤组件https://help.fanruan.com/finebi/doc-view-143.html 1.2、自己做的例…

分布式(6)

目录 26.雪花算法如何实现的&#xff1f; 27.雪花算法有什么问题&#xff1f;有哪些解决思路&#xff1f; 28.有哪些方案实现分布式锁&#xff1f; 29.基于数据库如何实现分布式锁&#xff1f;有什么缺陷&#xff1f; 30.基于Redis如何实现分布式锁&#xff1f;有什么缺陷&…

VS 2022 控制台程序运行时不显示控制台

Visual Studio 2022&#xff0c;C#控制台程序运行时不显示控制台。此外&#xff0c;C#程序修改运行时的程序名。 文章目录 不显示控制台修改运行时的程序名打包成.exe 文件 不显示控制台 1 选中需要项目&#xff0c;右击属性&#xff0c;选中常规。 2 将输出类型从控制台改为…

微服务-@FeignClient 与 Feign 隔离

FeignClient 扫描 FeignClientsRegistrar#registerBeanDefinitions public void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) { // 注册默认配置 registerDefaultConfiguration(metadata, registry); registerFeignClients(metada…

服务异步通讯---RabbitMQ实用篇

目录 一、初识MQ 一、同步调用 1、同步通讯和异步通讯 2、同步调用的问题 3.同步调用总结 二、异步调用 1、优势&#xff1a; ​编辑 2、异步总结 二、什么是MQ 一、RabbitMQ快速入门 1、RabbitMQ的结构和概念 2、常见消息模型 2.1、基础消息队列模型 2.2、总结 二…

Sharding-JDBC快速使用【笔记】

1 引言 最近在使用Sharding-JDBC实现项目中数据分片、读写分离需求&#xff0c;参考官方文档&#xff08;Sharding官方文档&#xff09;感觉内容庞杂不够有条理&#xff0c;重复内容比较多&#xff1b;现结合项目应用整理笔记如下供大家参考和自己回忆使用&#xff1b; 在…

为什么要太空探索?未来万亿人口 人类移居太空是不可避免的。大语言模型是发现 贝索斯

管理的思考 「最以客户为中心」「果断」「如何决策」 贝索斯给亚马逊的使命是「世上最以客户为中心的公司」(以客户需求为起点&#xff0c;反向推动工作)。贝索斯给蓝色起源的使命是「世上最果断的公司」(我们将变得非常擅长在技术上恰当地冒险&#xff0c;并快速地作出那些决…

一篇了解springboot3请求参数种类及接口测试

SpringBoot3数据请求&#xff1a; 原始数据请求&#xff1a; //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParame…

钉钉-蓝牙打卡和平台打卡的区别

钉钉的群是部门概念。 你的账号归属到哪个群&#xff0c;就是哪个群的员工。 -------------------------------------------------------------------- 蓝牙打卡是对账号归属进行打卡的。 平台打卡是只对属于自己平台内的账号打卡的。 ----------------------------------…

【MATLAB】PSO粒子群优化BiLSTM(PSO_BiLSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于PSO粒子群优化的BiLSTM的时间序列预测算法的基本原理如下&#xff1a; 「双向长短时记忆&#xff08;BiLSTM&#xff09;模型」&#xff1a;这是一种深度学习模型&#xff0c;特别适用…

感恩客户相伴23载,泛微2024持续向上!

2023年&#xff0c;国家大力推动数字经济发展&#xff0c;各行各业在加速数字化转型&#xff0c;在这一年&#xff0c;泛微保持持续增长&#xff0c;引领行业发展&#xff0c;为组织的数字化转型助力。感恩客户与伙伴朋友的支持与信任&#xff01; 01.泛微中大客户总量突破8万余…

Unity中Shader的Reversed-Z(DirectX平台)

文章目录 前言一、在对裁剪坐标归一化设置NDC时&#xff0c;DirectX平台Z的特殊二、在图形计算器中&#xff0c;看一下Z值反转前后变化1、在图形计算器创建两个变量 n 和 f 分别 控制近裁剪面 和 远裁剪面2、带入公式得到齐次裁剪空间下Z值3、进行透视除法4、用 1 - Z 得出Z值反…

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库&#xff0c;将其配置好&#xff0c;具体不在此展开说明。 2、文件结构如下图&#xff1a; 3、绘制棋盘代码&#xff0c;如下&#xff1a; void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…

【响应式编程-01】Lambda表达式初体验

一、简要描述 Lambda初体验Lambda表达式的语法格式Lambda表达式应用举例Lambda表达式底层实现 二、什么是Lambda表达式 Java8新特性&#xff0c;来源于数学中的λ[l:mdə]演算 是一套关于函数(f(x))定义、输入量、输出量的计算方案 Lambda表达式 -> 函数 使代码变得简洁…

维生素B5和琥珀酰辅酶A可以改善SF3B1基因突变引起无效造血过程

今天给同学们分享一篇实验文章“Vitamin B5 and succinyl-CoA improve ineffective erythropoiesis in SF3B1-mutated myelodysplasia”&#xff0c;这篇文章发表在Sci Transl Med期刊上&#xff0c;影响因子为17.1。 结果解读&#xff1a; SF3B1突变导致MDS-RS患者COASY异构体…