← 2024 · NVIDIA · ASIC Design Intern(上海) 笔试
推荐答案
测试一下
题目
Implement a module to delay a 1-bit sequence by 16 cycles:
参考答案与知识点
参考答案
实现一个1位序列延迟16个时钟周期的模块,通常采用移位寄存器结构。输入信号din在时钟上升沿被移入寄存器的低位,同时寄存器整体左移一位,最高位作为输出dout。这样每个时钟周期输入数据会经过16级寄存器,从而实现16个周期的延迟。典型Verilog实现如下:
module delay_16 (
input clk,
input rst_n,
input din,
output reg dout
);
reg [15:0] shift_reg;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
shift_reg <= 16'b0;
else
shift_reg <= {shift_reg[14:0], din};
end
assign dout = shift_reg[15];
endmodule
关键要点:使用非阻塞赋值保证移位操作正确;复位将寄存器清零,避免不确定状态;输出直接取自寄存器最高位。若需更低延迟可用异步复位,同步清零也可。注意输入与时钟同步,单比特无需额外握手。易错点:错误使用阻塞赋值导致组合反馈;忘记复位;寄存器位数误设为15位导致延迟周期数不对;将输出直接连到输入通过组合逻辑(如assign dout = ...)而非寄存器输出。本设计满足要求,延迟精确为16个时钟周期。
涉及知识点
- 移位寄存器实现同步延迟
- 非阻塞赋值在时序逻辑中的使用
- 同步复位与异步复位设计
- 时序电路中寄存器级数与延迟周期关系
- Verilog模块端口与实例化规范