第二章 计数器架构
2.1 计数器架构八步法
据说是明德扬的一套十分严谨的计数器规则,我们来看一下
2.1.1 计数器规则
- 三要素:初值,加1条件,结束值;
- 计数初值必须为0;
- 使用某一计数值,必须同时满足计数条件;
- 结束条件必须同时满足加1条件,且结束值必须是x-1的形式;
- 当取某个数时,assign形式必须为:(加1条件) && (cnt==计数值-1);
- 结束后必须回到0;
- 若需要限定范围,则推荐使用 >= 和 < 两种符号
- 整个模块设计步骤:先写计数器的always块,条件用名字(如end_cnt、add_cnt)代替,然后用assign写出加1条件,最后用assign写出结束条件
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt<= 0;
end
else if(加1条件)begin
if(结束条件)
cnt<= 0;
else
cnt<= cnt + 1;
end
end
这个模板只需要往里填写加1条件和结束条件就可以了,不需要重复的思考,可以把两个条件固定的定义为add_cnt和end_cnt,如下:
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt<= 0;
end
else if(add_cnt)begin
if(end_cnt)
cnt<= 0;
else
cnt<= cnt + 1;
end
end
assign add_cnt= a==2 ;
assign end_cnt = add_cnt && cnt==10-1;
这样就完成了,整个模板
- 加1条件必须与计数器严格对齐,其他信号一律向计数器对齐;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt<= 0;
end
else if(add_cnt)begin
if(end_cnt)
cnt<= 0;
else
cnt<= cnt + 1;
end
end
assign add_cnt = a==2 ;
assign end_cnt = add_cnt && cnt==10-1;
今天就先写到这,感觉挺受用的,之前写一个小例程的时候在网上看到有人这样写计数器,还感觉很臃肿,现在看来还是挺明晰的,原来是明德扬的学生。