至简设计法读书笔记(2)第二章 计数器架构 2.1.1 计数器模块模板规则

第二章 计数器架构

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;

今天就先写到这,感觉挺受用的,之前写一个小例程的时候在网上看到有人这样写计数器,还感觉很臃肿,现在看来还是挺明晰的,原来是明德扬的学生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值