推荐答案
测试一下
题目
Design a block (WriteVerilog code) with below requirement:
参考答案与知识点
参考答案
由于题目需求未具体给出,此处假设设计一个4位同步复位、带使能的模16计数器,上升沿触发。Verilog代码示例如下:
module counter (
input wire clk,
input wire rst_n, // 同步复位,低有效
input wire en, // 使能信号
output reg [3:0] count
);
always @(posedge clk) begin
if (!rst_n)
count <= 4'b0;
else if (en)
count <= count + 1'b1;
// 无else分支则保持
end
endmodule
解析要点:
1. **同步复位**:复位信号只在时钟上升沿有效,避免异步复位引起的毛刺和亚稳态问题。复位逻辑写在时序块内,使用`if(!rst_n)`判断。
2. **使能控制**:通过`en`信号控制是否计数,使能无效时保持当前值。
3. **非阻塞赋值**:时序逻辑中使用`<=`赋值,避免产生竞争冒险,保证综合结果正确。
4. **模16计数器**:4位寄存器自动回绕至0(溢出)。若需特定模值(如模10),需增加判断条件。
5. **端口声明**:采用标准input/output声明,计数输出为reg类型(在always块中赋值)。
常见设计误区:
- 混淆同步复位与异步复位,异步复位应使用``always @(posedge clk or negedge rst_n)``并将复位赋值放在敏感列表外。
- 使能信号未定义为input,或误用阻塞赋值导致综合电路出现锁存器。
- 未考虑复位的有效电平,通常用低有效(rst_n)以兼容常见复位电路。
涉及知识点
- 同步复位与异步复位区别
- 非阻塞赋值的时序语义
- 计数器Verilog实现
- 使能信号的时序控制
- 模块端口与reg声明