• 引言
  • 一、移位寄存器的相关概念
  • 二、移位寄存器的Verilog代码实现和 RTL 电路实现
  • 三、移位寄存器的具体移位实例
引言
  寄存器(Register)是能够寄存一组二值数据,它被广泛地应用于各类数字系统和数字计算机中。其中,1 个触发器能够储存 1 位二值代码,N 个触发器组成的寄存器组能够储存一组 N 位二值代码,而移位寄存器,就是能够对存储单元进行整体移动的一种基本单元。

一、移位寄存器的相关概念
  移位寄存器:在数字电路中,移位寄存器(Shift Register)是在时钟的脉冲(上升沿)触发之下,所有数据会依次向左或右移动一个比特(Bit);
  移位寄存器也是类似一种存储器,可以存储数据,而存在里边的数据可以从低位向高位移动或从高位向低位移动。例如一个 4 位的移位寄存器,存在其中的数据为 “1100”,如果向左(即高位 MSB)移动一次,就变成 “100X”,原来的最高位的 “1” 移出,最低位的 “X” 可以是新移入的数据,也可以是 0;
  由于移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或者依次逐位左移,而数据既可以并行输入、并行输出、串行输入以及串行输出,也可以并行输入、串行输出、串行输入以及并行输出,因此,移位寄存器不仅可以用来寄存代码,还可以用来实现数据的串行 - 并行转换、数值的运算(2 的倍乘)以及数据缓存处理(行缓存)等等;也正是因为移位寄存器如此灵活,才使得它用途广泛,可以应用于许许多多的数字电路设计模块之中,从而实现多种多样的功能。

二、移位寄存器的 Verilog 代码实现和 RTL 电路实现
Plaintext
module Shift_Register(
    input Clk,
    input [7:0] din,
    output reg [7:0] dout
    );

    always@(posedge Clk)
        dout <= (din << 1);
//      dout <= {din[7:1], 1'b0};

endmodule
forum.jpg
移位寄存器的 RTL 电路图

三、移位寄存器的具体移位实例
一、正数左移:4’b1001 << 2 = 6’b100100; // 左移 2 位后用 00 填补低位。
二、正数右移:4’b1001 >> 2 = 4’b0010; // 右移 2 位后,低 2 位丢失,高 2 位用 0 填补。
三、负数左移:(-3:补码表示)4’b1101 << 1 = 5’b11010; // 左移 1 位后用 0 填补低位(补码,变回原码为 10110,-6)。
四、负数右移:(-6:补码表示)5’b11010 >> 1 = 5’b11101; // 右移 1 位后,低 1 位丢失,高 1 位用 1 填补(补码,变回原码为 10011,-3)。