推荐答案
测试一下
题目
数字电路设计当然必问Verilog/VHDL,如设计计数器。(未知)
参考答案与知识点
参考答案
由于题目未明确计数器的具体功能,参考答案以典型模10计数器为例,使用Verilog实现,具备同步复位和使能功能,参数化设计便于扩展。
module counter #(parameter WIDTH = 4, MAX = 9) (
input clk,
input rst_n,
input en,
output reg [WIDTH-1:0] cnt,
output reg carry
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 0;
carry <= 0;
end else if (en) begin
if (cnt == MAX) begin
cnt <= 0;
carry <= 1;
end else begin
cnt <= cnt + 1;
carry <= 0;
end
end else begin
carry <= 0;
end
end
endmodule
说明:
1. 同步复位使用非阻塞赋值,复位电平为低(rst_n),满足绝大多数设计规范。
2. 使能信号en高电平有效,仅在使能时计数器递增。
3. 采用参数化设计,WIDTH决定位宽,MAX决定最大计数值,便于复用。
4. 产生进位信号carry,当计数值达到MAX时拉高一个时钟周期。
5. 若设计为异步复位,可将敏感列表中的negedge rst_n去掉,但异步复位在FPGA中需要谨慎处理亚稳态。
6. 面试中常问的扩展:如何设计模可调计数器(通过输入端口设置模值)?如何实现双向计数器?如何添加加载功能?建议在回答时体现模块化、可重用思维。
涉及知识点
- 同步复位与异步复位的区别
- 非阻塞赋值在时序逻辑中的使用
- 参数化模块设计(parameter)
- 计数器进位信号的产生
- Verilog always块敏感列表