移位寄存器
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 86 课,共 90 课。
挑战
移位寄存器会在每个时钟边沿将数据从左向右移位。每一位都会移动到下一个位置。
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 位 | 第四个触发器的输出 |
你的任务是完成下面的模块。
要做什么:
- 在
reset时,将所有输出设为 0 - 在每个时钟上升沿,将数据从左向右移位:
q0获取dq1获取旧的q0q2获取旧的q1q3获取旧的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 在线编译器