计数器的书写规范个人感觉明德扬的模板言之有理,其规则如下:
规则一:逐一考虑三要素-初值、加1条件和结束值。
规则二:计数初值必须为0
规则三:使用某一计数值,必须同时满足加一条件
规则四:结束条件必须同时满足加1条件,且结束值必须是x-1的形式
规则五:当取某个数时,assign形式必须为:(加1条件)&&(cnt==计数值-1)
规则六:结束后必须回到0
规则七:若限定范围,则推荐使用“>="和"<"两种符号
规则八:设计步骤是,先写计数器的always段,条件用名字代替;然后用assign写出加1条件;最后用assign写出结束条件
规则九:加1条件必须与计数器严格对齐,其它信号一律向计数器对齐
规则十:命名必须符合规范,比如:add_cnt表示加1条件;end_cnt表示结束条件
具体的规则细节建议通读潘文明的书籍,手把手教你学FPGA设计:基于大道至简的至简设计法
计数器的设计步骤主要包括:
1.明确功能,输入输出信号
2.功能波形,信号的时序波形图
3.计数结构,计数框架,一个always块只处理一个信号
4.加1和结束条件
5.定义特殊点,如结束点、触发点、开始点、中点等
6.完整性检查
7.计数器代码
8.功能代码
计数器模板为:
parameter CHANGETIME=1000_0000;
wire add_cnt;
wire end_cnt;
reg [23:0] cnt;
always @(posedge sys_clk or negedge sys_rst)begin
if(!sys_rst)
cnt <= 1'b0;
else if(add_cnt)begin
if(end_cnt)
cnt <= 1'b0;
else
cnt <= cnt + 1'b1;
end
end
assign add_cnt = 1'b1;//计数条件
assign end_cnt = add_cnt && cnt==CHANGETIME-1;//计数结束条件