网站设计大概多少钱,用rp做网站不用写前段代码,网站的服务,西安商城类网站制作前言
本篇文章介绍CPU的核心部件之一#xff1a;桶式移位器#xff0c;简称BS#xff0c;英文全称为Barrel Shifter 桶式移位器最大的特点就是能在单周期内完成多种方式#xff0c;各种位数的移位操作
常见的移位操作
常见的移位操作种类如下#xff1a;
算术右移 是指…前言
本篇文章介绍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 ai a′i:输出的移位的数的二进制位对于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: Cant 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 Sin11所以 i n 1 in1 in1在 a 7 a7 a7的输出为1循环右移 S i n 2 Sin2 Sin21 S i n 2 ‾ \overline {Sin2} Sin20 D 0 / 1 D0/1 D0/1不重要了因为 S i n 2 ‾ \overline {Sin2} Sin20所以 S i n 2 ‾ ⋅ D 0 / 1 \overline {Sin2}\cdot D0/1 Sin2⋅D0/10也就是 i n 2 in2 in2的值完全取决于 a i ai ai右移两位所以 S C 2 SC2 SC21,其余都为0
接下来看流程为了方便我们再次拷贝一下上面的图 i n 1 in1 in1在 a 7 a7 a7的输出 i n 1 in1 in1的值跟着电路走直到到 S C 2 SC2 SC2接触点的时候因为 S C 2 SC2 SC21所以开关接通 a 7 a7 a7的值从 a ′ 5 a5 a′5输出同理 a 7 a7 a7的值从 a ′ 5 a5 a′5输出 a 6 a6 a6的值从 a ′ 4 a4 a′4输出 a 5 a5 a5的值从 a ′ 3 a3 a′3输出 a 4 a4 a4的值从 a ′ 2 a2 a′2输出 a 3 a3 a3的值从 a ′ 1 a1 a′1输出 a 2 a2 a2的值从 a ′ 0 a0 a′0输出然后看 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 SC21所以开关接通 a 1 a1 a1的值从 a ′ 7 a7 a′7输出同理我们可以分析 a 0 a0 a0的值从 a ′ 6 a6 a′6输出这样循环右移便完成了。
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 sin10;// 右移才会为1long sin20;// 左移/循环右移才会为1long sin30;// 右移才会为1long d00; // 右移才有意义逻辑右移为0算术右移为最高位num%(sizeof(long)*8);switch (type) {case 0:// 逻辑左移sin10;sin21;sin30;d00;num (sizeof(long)*8-num);break;case 1:// 逻辑右移sin11;sin20;sin31;d00;break;case 2:// 算术右移sin11;sin20;sin31;d0in_1(sizeof(long)*8-1);break;case 3:// 循环右移sin11;sin21;sin31;d00;break;default:break;}// 每个位都会输出为了左移或者循环右移long a in_1;// 默认输出为0只有发生移动才会有值long in1 0;// 计算in1的输出如果不是右移原样输出// 使用-1来表示位都是1的情况if(sin1!0){unsigned long temp in_1;in1 (tempnum);}// 下面的三步走的in2的电路long in2_1 alu_and(a, sin20?0:-1, sizeof(long)*8);long in2_2 alu_and(sin3, d0, sizeof(long)*8);long in2 alu_or(in2_1, in2_20?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;isizeof(long)*8;i){long r1 bs(1, 0, i);printf(\t1 move left %d:%ld\n,i,r1);}for(int i 0;isizeof(long)*81;i){long r1 bs(-1, 1, i);printf(\t1 move right logic %d:%ld\n,i,r1);}for(int i 0;isizeof(long)*81;i){long r1 bs(-1, 2, i);printf(\t1 move right arithmetic %d:%ld\n,i,r1);}long a 0xAAAAAAAAAAAAAAAA;for(int i 0;isizeof(long)*81;i){long r1 bs(a, 3, i);printf(\t1 move right loop %d:%ld\n,i,r1);}printf(bs test end\n);
}