用Verilog实现一个桶形移位器

本文介绍了如何使用Verilog语言设计并实现一个32位的桶形移位器。实验目标包括理解桶型移位器原理、使用ISE和Modelsim进行仿真,以及在logicsim上搭建8位桶型移位器。桶型移位器根据aluc和b信号进行不同类型的移位操作。

实验六 桶型移位器

实验介绍

本实验使用Verilog语言设计实现一个32位桶型移位器。

实验目标


1. 使用ISE软件设计并进行仿真
2. 学会使用Modelsim
3. 理解桶型移位器原理,使用logicsim软件搭建一个8位的桶型移位器
4. 用verilog实现一个32位桶型移位器

实验原理


桶型移位器是一个多输入、单输出电路。对于输入a[31:0],移位器首先会根据aluc[1:0]值来确定做何种移位,然后根据b[4:0]的值来确定移多少位,最后将结果c[31:0]输出。
下表为aluc的值所对应的运算:

MIPS指令alu[1]alu[0]说明
算术右移(sra)00a向右移动b位,最高位补b位符号位
逻辑右移(srl)01a向右移动b位,最高位补b位0
算术左移(sll)10a向左移动b位,最低位补b位0
逻辑左移(sll)11a向左移动b位,最低位补b位0


下图为桶型移位器的逻辑流程图,可根据其流程编写行为及的桶型移位器
桶型移位器的逻辑流程图

Verilog代码

代码如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    14:17:05 11/13/2015 
// Design Name: 
// Module Name:    barrelshifter32 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module barrelshifter32(
    input [31:0] a,     // 32 位原始输入数据
    input [4:0] b,      // 5 位输入数据,控制移位的位数
    input [1:0] aluc,   // 2 位输入控制移位的方式
    output reg [31:0] c     // 32 位输出,由a 经过b 位通过aluc 指定的移位方式移位而得
);
    reg [31:0] temp;
    always @ (a or b or aluc) begin
    case(aluc)
        2'b00: begin
            temp = b[0] ? {{a[31]}, a[31:1]} : a;
            temp = b[1] ? {{2{temp[31]}}, temp[31:2]} : temp;
//             b = sext ? {{(32-WIDTH){a[WIDTH-1]}},a} : {32'b0, a};
             temp = b[2] ? {{4{temp[31]}}, temp[31:4]} : temp;
             temp = b[3] ? {{8{temp[31]}}, temp[31:8]} : temp;
             temp = b[4] ? {{16{temp[31]}}, temp[31:16]} : temp;
            end
        2'b01: begin
             temp = b[0] ? {32'b0, a[31:1]} : a;
             temp = b[1] ? {32'b0, temp[31:2]} : temp;
             temp = b[2] ? {32'b0, temp[31:4]} : temp;
             temp = b[3] ? {32'b0, temp[31:8]} : temp;
             temp = b[4] ? {32'b0, temp[31:16]} : temp;
            end
        2'b10, 2'b11: begin
             temp = b[0] ? {{a[30:0]}, 1'b0} : a;
             temp = b[1] ? {{temp[29:0]}, 2'b0} : temp;
             temp = b[2] ? {{temp[27:0]}, 4'b0} : temp;
             temp = b[3] ? {{temp[23:0]}, 8'b0} : temp;
             temp = b[4] ? {{temp[15:0]}, 16'b0} : temp;
            end
    endcase
     c = temp;
    end

endmodule
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值