推荐答案
测试一下
题目
用Verilog语言实现一个带使能的模100异步清0计数器;模块定义为module count (out, count_en, clr, clk);
参考答案与知识点
参考答案
实现一个带使能的模100异步清0计数器,模块端口定义为:output reg [6:0] out, input count_en, input clr, input clk。由于模100计数范围0~99,需要7位二进制数。异步清零意味着clr信号有效时,输出立即清零(与时钟无关),因此在敏感列表中加入clr的上升沿。使用always @(posedge clk or posedge clr)结构。在always块内,首先判断clr是否为高电平,若是则out赋值为0;否则在时钟上升沿下,若count_en有效,则判断out是否等于99,等于则out置0,否则out加1。注意:异步清零优先级高于使能信号;计数到99后下一个时钟沿归零;使能信号仅在时钟沿有效时才计数。代码示例如下:
module count (out, count_en, clr, clk);
output reg [6:0] out;
input count_en, clr, clk;
always @(posedge clk or posedge clr) begin
if (clr)
out <= 7'd0;
else if (count_en) begin
if (out == 7'd99)
out <= 7'd0;
else
out <= out + 1'b1;
end
end
endmodule
易错点:1. 异步清零必须包含在敏感列表中,否则综合为同步复位;2. 比较值99必须与out位宽一致;3. 使用非阻塞赋值以避免竞争;4. 注意使能信号在时钟沿判断,而非在组合逻辑中。
涉及知识点
- 异步复位与同步复位区别
- 模100计数器实现
- Verilog敏感列表写法
- 非阻塞赋值规则
- 使能信号时序约束