桶式移位器

桶式移位器是一种组合逻辑电路,通常作为微处理器CPU的一部分。它具有n个数据输入和n个数据输出,以及指定如何移动数据的控制输入,指定移位方向、移位类(循环、算术还是逻辑移位)及移动的位数等等。

module barrelshift_32(
            input [31:0] a, // 32 位原始输入数据
            input [4:0] b, // 5 位输入数据,控制移位的位数
            input [1:0] aluc, // 2 位输入控制移位的方式
            output reg [31:0] c // 32 位输出,由a 经过b 位通过aluc 指定的移位方
);
always @ (a or b or aluc)
begin
if(aluc==2'b00)
begin
    case(b) //移位数
        5'b00000:c=a; //移动0位,不变
        5'b00001:c={{2{a[31]}},a[29:0]};
        5'b00010:c={{3{a[31]}},a[28:0]};
        5'b00011:c={{4{a[31]}},a[27:0]};
        5'b00100:c={{5{a[31]}},a[26:0]};
        5'b00101:c={{6{a[31]}},a[25:0]};
        5'b00110:c={{7{a[31]}},a[24:0]};
        5'b00111:c={{8{a[31]}},a[23:0]};
        5'b01000:c={{9{a[31]}},a[22:0]};
        5'b01001:c={{10{a[31]}},a[21:0]};
        5'b01010:c={{11{a[31]}},a[20:0]};
        5'b01011:c={{12{a[31]}},a[19:0]};
        5'b01100:c={{13{a[31]}},a[18:0]};
        5'b01101:c={{14{a[31]}},a[17:0]};
        5'b01110:c={{15{a[31]}},a[16:0]};
        5'b01111:c={{16{a[31]}},a[15:0]};
        5'b10000:c={{17{a[31]}},a[14:0]};
        5'b10001:c={{18{a[31]}},a[13:0]};
        5'b10010:c={{19{a[31]}},a[12:0]};
        5'b10011:c={{20{a[31]}},a[11:0]};
        5'b10100:c={{21{a[31]}},a[10:0]};
        5'b10101:c={{22{a[31]}},a[9:0]};
        5'b10110:c={{23{a[31]}},a[8:0]};
        5'b10111:c={{24{a[31]}},a[7:0]};
        5'b11000:c={{25{a[31]}},a[6:0]};
        5'b11001:c={{26{a[31]}},a[5:0]};
        5'b11010:c={{27{a[31]}},a[4:0]};
        5'b11011:c={{28{a[31]}},a[3:0]};
        5'b11100:c={{29{a[31]}},a[2:0]};
        5'b11101:c={{30{a[31]}},a[1:0]};
        5'b11110:c={{31{a[31]}},a[0]};
        5'b11111:c={32{a[31]}};
    endcase
end
if(aluc==2'b01)
begin
    case(b)
        5'b00000:c=a;
        5'b00001:c={1'b0,a[31:1]};
        5'b00010:c={2'b0,a[31:2]};
        5'b00011:c={3'b0,a[31:3]};
        5'b00100:c={4'b0,a[31:4]};
        5'b00101:c={5'b0,a[31:5]};
        5'b00110:c={6'b0,a[31:6]};
        5'b00111:c={7'b0,a[31:7]};
        5'b01000:c={8'b0,a[31:8]};
        5'b01001:c={9'b0,a[31:9]};
        5'b01010:c={10'b0,a[31:10]};
        5'b01011:c={11'b0,a[31:11]};
        5'b01100:c={12'b0,a[31:12]};
        5'b01101:c={13'b0,a[31:13]};
        5'b01110:c={14'b0,a[31:14]};
        5'b01111:c={15'b0,a[31:15]};
        5'b10000:c={16'b0,a[31:16]};
        5'b10001:c={17'b0,a[31:17]};
        5'b10010:c={18'b0,a[31:18]};
        5'b10011:c={19'b0,a[31:19]};
        5'b10100:c={20'b0,a[31:20]};
        5'b10101:c={21'b0,a[31:21]};
        5'b10110:c={22'b0,a[31:22]};
        5'b10111:c={23'b0,a[31:23]};
        5'b11000:c={24'b0,a[31:24]};
        5'b11001:c={25'b0,a[31:25]};
        5'b11010:c={26'b0,a[31:26]};
        5'b11011:c={27'b0,a[31:27]};
        5'b11100:c={28'b0,a[31:28]};
        5'b11101:c={29'b0,a[31:29]};
        5'b11110:c={30'b0,a[31:30]};
        5'b11111:c={31'b0,a[31]};
    endcase
end
if(aluc==2'b10)
begin
    case(b)
        5'b00000:c=a;
        5'b00001:c={a[31],a[29:0],1'b0};
        5'b00010:c={a[31],a[28:0],2'b0};
        5'b00011:c={a[31],a[27:0],3'b0};
        5'b00100:c={a[31],a[26:0],4'b0};
        5'b00101:c={a[31],a[25:0],5'b0};
        5'b00110:c={a[31],a[24:0],6'b0};
        5'b00111:c={a[31],a[23:0],7'b0};
        5'b01000:c={a[31],a[22:0],8'b0};
        5'b01001:c={a[31],a[21:0],9'b0};
        5'b01010:c={a[31],a[20:0],10'b0};
        5'b01011:c={a[31],a[19:0],11'b0};
        5'b01100:c={a[31],a[18:0],12'b0};
        5'b01101:c={a[31],a[17:0],13'b0};
        5'b01110:c={a[31],a[16:0],14'b0};
        5'b01111:c={a[31],a[15:0],15'b0};
        5'b10000:c={a[31],a[14:0],16'b0};
        5'b10001:c={a[31],a[13:0],17'b0};
        5'b10010:c={a[31],a[12:0],18'b0};
        5'b10011:c={a[31],a[11:0],19'b0};
        5'b10100:c={a[31],a[10:0],20'b0};
        5'b10101:c={a[31],a[9:0],21'b0};
        5'b10110:c={a[31],a[8:0],22'b0};
        5'b10111:c={a[31],a[7:0],23'b0};
        5'b11000:c={a[31],a[6:0],24'b0};
        5'b11001:c={a[31],a[5:0],25'b0};
        5'b11010:c={a[31],a[4:0],26'b0};
        5'b11011:c={a[31],a[3:0],27'b0};
        5'b11100:c={a[31],a[2:0],28'b0};
        5'b11101:c={a[31],a[1:0],29'b0};
        5'b11110:c={a[31],a[0],30'b0};
        5'b11111:c={a[31],31'b0};
    endcase
end
if(aluc==2'b11)
begin
    case(b) 
        5'b00000:c=a;
        5'b00001:c={a[30:0],1'b0};
        5'b00010:c={a[29:0],2'b0};
        5'b00011:c={a[28:0],3'b0};
        5'b00100:c={a[27:0],4'b0};
        5'b00101:c={a[26:0],5'b0};
        5'b00110:c={a[25:0],6'b0};
        5'b00111:c={a[24:0],7'b0};
        5'b01000:c={a[23:0],8'b0};
        5'b01001:c={a[22:0],9'b0};
        5'b01010:c={a[21:0],10'b0};
        5'b01011:c={a[20:0],11'b0};
        5'b01100:c={a[19:0],12'b0};
        5'b01101:c={a[18:0],13'b0};
        5'b01110:c={a[17:0],14'b0};
        5'b01111:c={a[16:0],15'b0};
        5'b10000:c={a[15:0],16'b0};
        5'b10001:c={a[14:0],17'b0};
        5'b10010:c={a[13:0],18'b0};
        5'b10011:c={a[12:0],19'b0};
        5'b10100:c={a[11:0],20'b0};
        5'b10101:c={a[10:0],21'b0};
        5'b10110:c={a[9:0],22'b0};
        5'b10111:c={a[8:0],23'b0};
        5'b11000:c={a[7:0],24'b0};
        5'b11001:c={a[6:0],25'b0};
        5'b11010:c={a[5:0],26'b0};
        5'b11011:c={a[4:0],27'b0};
        5'b11100:c={a[3:0],28'b0};
        5'b11101:c={a[2:0],29'b0};
        5'b11110:c={a[1:0],30'b0};
        5'b11111:c={a[0],31'b0};
    endcase
end
end
endmodule

本文分享自微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏为数不多的Android技巧

ASCII Art:使用纯文本流程图

我们使用纯文本写代码,有了Markdown又可以使用纯文本写文档,那么对于更直观的信息表达方式——图片,能不能使用纯文本描述呢?

49020
来自专栏利炳根的专栏

学习笔记TF063:TensorFlow Debugger

TensorFlow Debugger(tfdbg),TensorFlow专用调试器。用断点、计算机图形化展现实时数据流,可视化运行TensorFlow图形内部...

67900
来自专栏李海辰的专栏

Unity 引擎资源管理代码分析 ( 1 )

目前网络上已经有很多介绍 Unity 资源管理机制、和 API 使用方法的文章,但少有文章从 Unity源码层面对其实现进行深度解析。作为一名喜欢打破砂锅璺到底...

1.5K20
来自专栏简书专栏

基于jieba、TfidfVectorizer、LogisticRegression的垃圾邮件分类

jieba中文叫做结巴,是一款中文分词工具,官方文档链接:https://github.com/fxsjy/jieba TfidfVectorizer中文叫做...

24410
来自专栏IT开发技术与工作效率

Excel函数学习重点指南(官网)

13630
来自专栏idba

性能优化之Block Nested-Loop Join(BNL)

相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说性能一直不太满意。对于开发提交的含有join的查询,一般比较抗拒,从而建议将...

24710
来自专栏java系列博客

UML——序列图

22640
来自专栏大数据风控

R文本挖掘-中文分词Rwordseg

我们的数据分析工作,不仅仅有对数据的分析,还有对文字资料整合的统计分析。在进行词频统计之前,有一项必须要做的工作就是中文的分词。 语料库的处理 语料库 语料...

34360
来自专栏圣杰的专栏

CASE WHEN 高阶用法?

两个表做关联时,以左表为准,若左表某列不为空,则与右表对应列进行关联匹配,为空则不做匹配。 ? 以上做法,有一种说不出来的感觉,不管怎样,问题是解决了。 如...

367130
来自专栏企鹅号快讯

深度学习系列教程(六)tf.data API 使用方法介绍

"玩转TensorFlow与深度学习模型”系列文字教程,本周带来tf.data 使用方法介绍! 大家在学习和实操过程中,有任何疑问都可以通过学院微信交流群进行提...

37270

扫码关注云+社区

领取腾讯云代金券