HDLbits笔记-Shift Registers

4-bit shift register

题目:设计一个4-bit移位寄存器(右移),采用异步复位,同步load,enable模式。
(1)复位后,移位寄存器输出0;
(2)load为高电平,将data[3:0]数据load进移位寄存器;
(3)ena为高电平,移位寄存器右移一位;
(4)q作为移位寄存器的输出;
如果load和ena信号同时有效,load信号优先级较高。

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output  [3:0] q); 
    reg [3:0]	q_temp;
    always@(posedge clk or posedge areset)begin
        if(areset)
            q_temp	<=	4'd0;
        else if(load)
            q_temp	<=	data;
        else if(ena)
            q_temp	<=	(q_temp >> 1);
        else
            q_temp	<=	q_temp;
    end
    assign q = q_temp;
    
endmodule

Rotate 100

题目:设计一个带有同步load和左右使能enable的100-bit的左右旋转器。旋转器从寄存器的另一端插入已移出的位,不像移位器丢弃已移出的位而插入一个零。如果启用,旋转器会旋转这些位并且不会修改/丢弃它们。
(1)laod:加载data[99:0]到移位寄存器中;
(2)ena[1:0]选择旋转的方向:2’b01向右旋转一个bit;2’b10向左旋转一个bit;2’b00,2’b11不旋转
(3)q作为旋转器的输出

module top_module(
    input clk,
    input load,
    input [1:0] ena,
    input [99:0] data,
    output reg [99:0] q); 
    always@(posedge clk)begin
        if(load)
            q	<=	data;
        else begin
            case(ena)
                2'b00: q	<=	q;
                2'b01: q	<=	{
   q[0],q[99:1]};
                2'b10: q	<=	{
   q[98:0],q[99]};
                2'b11: q	<=	q;
            endcase
        end
    end
endmodule

注意移位的方法,q>>1表示将q中的最低位移除,在最高位补0;而q <= {q[0],q[99:1]}表示将q的最低位直接移到q的最高位。

Left/right arithmetic shift by 1 or 8

题目:设计一个带有同步load功能的64bit的算数移位寄存器。既可以左移又可以右移,通过amount信号选择移位的位数。算术右移在移位寄存器(在本例中是q[63])中移动数字的符号位,而不是像逻辑右移那样移动零。算术右移的另一种思考方式是假设被移动的数有符号并且保留符号,因此算术右移可以将有符号的数除以2的幂。
逻辑左移和算数左移没有区别。
(1)load为高电平将data[63:0]加载到移位寄存器中;
(2)ena选择是否移位操作;
(3)amount移位方向及移位多少位;
2’b00: shift left by 1 bit.
2’b01: shift left by 8 bits.
2’b10: shift right by 1 bit.
2’b11: shift right by 8 bits.

module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q); 
    always@(posedge clk)begin
        if(load)
            q	<=	data;
        else if(ena)begin
            case(amount)
                2'b00: q	<=	q << 1;
                2'b01: q	<=	q << 8;
                2'b10: q	
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值