简单移位器结构介绍

news2024/11/14 14:27:29

移位器

一位可控移位器

其实是一个复杂的多路开关电路,根据不同控制信号,将输入左移或右移或不变。多位的移位可以简单串联这样的单元实现,但移位位数多时,该方法过于复杂,不实用并且速度很慢。

桶形移位器

由晶体管阵列构成,行数等于数据字长,列数等于最大移位宽度。
在这里插入图片描述

特点

  • Sh0-Sh3 只能有一位是高电平,分别控制A右移0位-3位
  • 自动支持符号位扩展
  • 信号最多只需要通过一个传输门,也就是说传播延时理论上是常数,与位数和规模无关(实际上因为缓冲器输入电容会随着移位宽度线性增加,所以延时不会是常数)
  • 版图尺寸不由晶体管决定,而是通过布线数目或者所金属线的间距决定。
  • 适用于移位数较小的移位器。

在这里插入图片描述

3.3 对数移位器

桶形移位器实现为传输管的单个阵列,而对数移位器采用分级的方法。移位值分解为几个2的指数值。

在这里插入图片描述

  • 对数移位器的速度取决于移位宽度,一个M位的移位器需要 l o g 2 M log_2M log2M
  • 适用于较大的移位值,在速度和面积上都更有效,且容易参数化。

版图:

在这里插入图片描述

代码简易实现

Verilog实现

针对16位数据进行左移位,使用对数桶形结构

module log_barrel_shifter_left(input [15:0]ip, input [3:0]shift, output [15:0]op);
wire [15:0] st1, st2, st3;

assign st1[0] = shift[0]? 1'b0: ip[0];
assign st1[1] = shift[0]? ip[0]: ip[1];
assign st1[2] = shift[0]? ip[1]: ip[2];
assign st1[3] = shift[0]? ip[2]: ip[3];
assign st1[4] = shift[0]? ip[3]: ip[4];
assign st1[5] = shift[0]? ip[4]: ip[5];
assign st1[6] = shift[0]? ip[5]: ip[6];
assign st1[7] = shift[0]? ip[6]: ip[7];
assign st1[8] = shift[0]? ip[7]: ip[8];
assign st1[9] = shift[0]? ip[8]: ip[9];
assign st1[10] = shift[0]? ip[9]: ip[10];
assign st1[11] = shift[0]? ip[10]: ip[11];
assign st1[12] = shift[0]? ip[11]: ip[12];
assign st1[13] = shift[0]? ip[12]: ip[13];
assign st1[14] = shift[0]? ip[13]: ip[14];
assign st1[15] = shift[0]? ip[14]: ip[15];

assign st2[0] = shift[1]? 1'b0: st1[0];
assign st2[1] = shift[1]? 1'b0: st1[1];
assign st2[2] = shift[1]? st1[0]: st1[2];
assign st2[3] = shift[1]? st1[1]: st1[3];
assign st2[4] = shift[1]? st1[2]: st1[4];
assign st2[5] = shift[1]? st1[3]: st1[5];
assign st2[6] = shift[1]? st1[4]: st1[6];
assign st2[7] = shift[1]? st1[5]: st1[7];
assign st2[8] = shift[1]? st1[6]: st1[8];
assign st2[9] = shift[1]? st1[7]: st1[9];
assign st2[10] = shift[1]? st1[8]: st1[10];
assign st2[11] = shift[1]? st1[9]: st1[11];
assign st2[12] = shift[1]? st1[10]: st1[12];
assign st2[13] = shift[1]? st1[11]: st1[13];
assign st2[14] = shift[1]? st1[12]: st1[14];
assign st2[15] = shift[1]? st1[13]: st1[15];

assign st3[0] = shift[2]? 1'b0: st2[0];
assign st3[1] = shift[2]? 1'b0: st2[1];
assign st3[2] = shift[2]? 1'b0: st2[2];
assign st3[3] = shift[2]? 1'b0: st2[3];
assign st3[4] = shift[2]? st2[0]: st2[4];
assign st3[5] = shift[2]? st2[1]: st2[5];
assign st3[6] = shift[2]? st2[2]: st2[6];
assign st3[7] = shift[2]? st2[3]: st2[7];
assign st3[8] = shift[2]? st2[4]: st2[8];
assign st3[9] = shift[2]? st2[5]: st2[9];
assign st3[10] = shift[2]? st2[6]: st2[10];
assign st3[11] = shift[2]? st2[7]: st2[11];
assign st3[12] = shift[2]? st2[8]: st2[12];
assign st3[13] = shift[2]? st2[9]: st2[13];
assign st3[14] = shift[2]? st2[10]: st2[14];
assign st3[15] = shift[2]? st2[11]: st2[15];

assign op[0] = shift[3]? 1'b0: st3[0];
assign op[1] = shift[3]? 1'b0: st3[1];
assign op[2] = shift[3]? 1'b0: st3[2];
assign op[3] = shift[3]? 1'b0: st3[3];
assign op[4] = shift[3]? 1'b0: st3[4];
assign op[5] = shift[3]? 1'b0: st3[5];
assign op[6] = shift[3]? 1'b0: st3[6];
assign op[7] = shift[3]? 1'b0: st3[7];
assign op[8] = shift[3]? st3[0]: st3[8];
assign op[9] = shift[3]? st3[1]: st3[9];
assign op[10] = shift[3]? st3[2]: st3[10];
assign op[11] = shift[3]? st3[3]: st3[11];
assign op[12] = shift[3]? st3[4]: st3[12];
assign op[13] = shift[3]? st3[5]: st3[13];
assign op[14] = shift[3]? st3[6]: st3[14];
assign op[15] = shift[3]? st3[7]: st3[15];
endmodule

tb代码:

`timescale  1ns / 1ps

module tb_log_barrel_shifter_left;

// log_barrel_shifter_left Parameters
parameter PERIOD  = 10;

// log_barrel_shifter_left Inputs
reg   [15:0]  ip                           = 0 ;
reg   [3:0]  shift                         = 0 ;

// log_barrel_shifter_left Outputs
wire  [15:0]  op                           ;

initial
begin
    #(PERIOD*2) ip    =  16'd5;
    #(PERIOD*2) shift =  2;
    #(PERIOD*2) shift =  3;
    #(PERIOD*2) shift =  4;
    #(PERIOD*2) shift =  5;
    #(PERIOD*2) shift =  6;
    #(PERIOD*2) shift =  7;
    #(PERIOD*2) shift =  9;
end

log_barrel_shifter_left  u_log_barrel_shifter_left (
    .ip                      ( ip     [15:0] ),
    .shift                   ( shift  [3:0]  ),

    .op                      ( op     [15:0] )
);

initial
begin
    #1000
    $finish;
end

endmodule

仿真结果

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

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

相关文章

C.12 军事领域关系抽取:UIE Slim最新升级版含数据标注、serving部署、模型蒸馏、可视化高亮展示等,助力工业应用场景快速落地

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

Linux内核漏洞提权

目录 Linux提权辅助工具 内核漏洞本地用户提权 - linux-exploit-suggester测试 内核漏洞Web用户提权 - 利用脏牛dcow 内核漏洞本地用户提权 - 利用DirtyPipe(脏管) 配置安全SUID提权 Linux提权辅助工具 这些工具都是C\C编写的,需要在目…

vmware虚拟机设置双网卡

文章目录 1. 配置虚拟机NAT模式2. 配置虚拟机桥接网络2.1 通过USB网卡2.1.1 配置虚拟机桥接网卡ip:2.1.2 配置windows主机桥接网卡ip:2.1.3 配置板子ip: 2.2 通过路由器2.2.1 配置板子ip: NAT 网卡:Ubuntu 通过它上网,只要 Windows 能上网,Ub…

北邮22信通:实验六 由运放器构成的音频放大电路设计、仿真、测试报告

北邮22信通一枚~ 持续更新模电实验讲解 关注作者,解锁更多邮苑模电实验报告~ 获取更多文章,请访问专栏: 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 目录 实验目的: 设计要求: *补充&#xff1…

AI最新资讯

AI最新资讯 1.画图2.修图3.3D建模4.openai调用5.自媒体工具6.自动化网页制作 自从gpt火了之后,AIGC就更新很快,许多好用的插件都太多了,所以记录一下,方便之后用到。 1.画图 1.midjourney和playgroundAI我之前博客有写过。 2.最近…

Web基本漏洞--文件上传漏洞

目录 一、文件上传漏洞介绍 1.文件上传漏洞原理 2.文件上传漏洞识别 3. 攻击方式 4.文件上传漏洞的危害 5.文件上传漏洞的防御措施 6.文件上传漏洞的绕过 一、文件上传漏洞介绍 1.文件上传漏洞原理 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺…

ActiveMQ消息中间件简介

一、ActiveMQ简介 ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provide实现。尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中仍然扮演这特殊的地位。 二、Active…

3Dmax云渲染如何使用?一文带你了解云渲染

3ds Max是Autodesk公司推出的一款专业计算机图形和三维动画软件,被广泛应用于建筑、室内设计、电影、游戏、广告、工业设计等领域。它提供丰富的模型建模、纹理编辑、灯光设置、渲染等功能,可以制作出高质量的三维模型、动画和静态渲染。它具有强大的扩展…

【1++的Linux】之Linux权限

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,什么是Linux权限?二,Linux权限管理2.1 文件访问者的分类2.2 文件类型和访问权限2.3 修改文件权限2.4 掩码的作用及其设置 三&#xf…

前沿技术|人工智能的崛起和发展历程

前言: 人工智能的作用是使计算机能够模仿人类智能和学习能力,从而实现自动化、智能化和优化决策的目标。 文章目录 人工智能背景介绍发展状态未来展望 总结 人工智能 背景 人工智能(Artificial Intelligence,AI)的产生…

29Maven高级

一、分模块设计与开发 1、介绍 2、tlias-pojo模块 然后把pojo复制过去。pom中加入lombok依赖 引入tlias-pojo依赖 3、tlias-utils模块 tlias-utils的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.…

高频面试八股文原理篇(一)hashmap原理相关

目录 引言 面试题&#xff1a;hashmap原理 原理 JDK7时HashMap的数据结构 jdk8中hashMap数据结构 hashMap怎么设置初始值的大小 jdk7和jdk8中HashMap的区别 为什么放在hashMap集合key部分的元素需要重写equals方法&#xff1f; concurrenthashmap为什么线程安全 高频面…

Linux文件的扩展属性

文件属性 Linux文件属性分为常规属性与扩展属性&#xff0c;其中扩展属性有两种&#xff1a;attr与xattr. 一般常规的文件属性由stat API 读取&#xff0c;一般是三种权限&#xff0c;ower, group&#xff0c;时间等。 扩展属性attr 用户态API ioctl(fd, FS_IOC32_SETFLAGS …

从零开始学习JavaScript:轻松掌握编程语言的核心技能②

从零开始学习JavaScript&#xff1a;轻松掌握编程语言的核心技能② 一&#xff0c;JavaScript 函数1.1 JavaScript 函数语法1.2 局部 JavaScript 变量1.3 全局 JavaScript 变量 二&#xff0c;JavaScript 作用域2.1JavaScript 局部作用域 三&#xff0c;JavaScript 事件3.1HTML…

Linux——磁盘文件的理解 + inode详解 + 软硬链接 +动静态库

索引 磁盘文件的理解inode软硬链接动静态库理解动态链接与地址无关生成动静态库使用静态库使用动态库动态链接再次理解&#xff01; 磁盘文件的理解 之前讲述的都是内存级的文件&#xff0c;但是系统中最多的还是磁盘级的文件&#xff0c;大量的文件自然也需要被管理&#xff…

【算法】08 耦合 Lorenz 63 模式的参数估计实验

摘要 本实验通过建立基于耦合 Lorenz 63 模式的孪生实验框架&#xff0c;使用集合调整卡尔曼滤波器EAKF实现参数估计&#xff0c;测试参数估计开始的不同阶段、观测误差、同化频率、协方差膨胀等方法细节对于参数估计结果的影响。 耦合 Lorenz 63 模式 Lorenz 63 模式是Lore…

Postman实战:轻松搞定接口自动化测试

随着移动互联网的发展&#xff0c;接口自动化测试已经成为软件测试领域中不可或缺的一部分。而作为最流行的API开发工具之一&#xff0c;Postman凭借其简单易用、功能强大的特点赢得了越来越多开发者和测试人员的青睐。 想要掌握Postman的接口自动化测试技能&#xff0c;只需要…

JDK 下载与安装

首先下载 jdk 最新版本。可以去 http://java.sun.com/j2se/1.4.2/download.html 版本一&#xff1a;适合 win7oracle 版本 java 下载最新的 jdk 版本&#xff0c; 打开界面后。选择 J2SE v 1.4.2_08 SDK 拦目下面的 Download J2SE SDK&#xff0c; 然后选择 Accept License…

6设计指令流水线-3【FPGA模型机课程设计】

6设计指令流水线-3【FPGA模型机课程设计】 前言推荐6设计指令流水线-3安排测试与结果 指令流水线理论MIPS的一种简单实现基本的MIPS流水线 指令流水线实现MIPS五段流水CPU设计 基于单周期CPU的流水线设计乘除流水线的设计原子流水线的设计代码设计EX_Mem 附录0 框架 最后 前言 …