Menu
CoddyTech

移位寄存器

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 86 课,共 90 课。

challenge icon

挑战

移位寄存器会在每个时钟边沿将数据从左向右移位。每一位都会移动到下一个位置。

4 位移位寄存器的工作原理

Initial: q0=0, q1=0, q2=0, q3=0
Each clock: q0 = d, q1 = old q0, q2 = old q1, q3 = old q2
Shifting in d = 1, 0, 1, 0:
Clock 1 (d=1): q0=1, q1=0, q2=0, q3=0
Clock 2 (d=0): q0=0, q1=1, q2=0, q3=0
Clock 3 (d=1): q0=1, q1=0, q2=1, q3=0
Clock 4 (d=0): q0=0, q1=1, q2=0, q3=1

经过 4 个时钟周期后,第一个输入位会到达 q3。

模块接口

端口方向宽度说明
clk输入1 位时钟信号
reset输入1 位将所有输出重置为 0
d输入1 位数据输入
q0输出1 位第一个触发器的输出
q1输出1 位第二个触发器的输出
q2输出1 位第三个触发器的输出
q3输出1 位第四个触发器的输出

你的任务是完成下面的模块。

要做什么:

  1. 在 reset 时,将所有输出设为 0
  2. 在每个时钟上升沿,将数据从左向右移位:
    1. q0 获取 d
    2. q1 获取旧的 q0
    3. q2 获取旧的 q1
    4. q3 获取旧的 q2

亲手试试

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q0,
  output reg q1,
  output reg q2,
  output reg q3
);
  
  // TODO:添加 always @(posedge clk or posedge reset)
  // 复位时:q0<=0, q1<=0, q2<=0, q3<=0
  // 否则,移位数据:q0 <= d, q1 <= q0, q2 <= q1, q3 <= q2

endmodule

基础知识中的所有课

自己练习: Verilog 在线编译器