上一节我们描述了明德扬的通用设计方法。在阐述案例过程中,我们画出了大量的波形图。有读者可能会问,在工作中,我们是不是也需要先大量地画波形图,再来写代码呢?
不是的!工作中,我们要设计的系统更加的复杂,一个模块的信号也非常地多,如果我们每个模块都要画波形图,这不是明德扬提倡的至简设计。何况,信号一天,画出来的波形信号也是相当地多,也容易迷糊当中。
上一节我们画的波形图,主要是为了让读者更清晰地理解功能、计数器和信号的关系。如果我们牢记明德扬的规则,我们的设计将非常简单。我们要做的不是波形设计,而是功能设计。
功能设计就是根据功能需求,编写我们的设计代码。我们以上一节中的案例4为例,说明什么叫功能设计。
案例4的功能要求是:当收到en=1时,dout间隔1个时钟后,产生2个时钟周期的高电平脉冲,并且重复3次。
由题意可知,要对“间隔”和“高电平”个数进行计数,但没有信号表示“高隔”,为此想出补充一个信号flag_add,用来表示计数区域。间隔时间+高电平时间,得到计数器数3个。
我们看到重复3次这一句话,这就说明还有一个计数器计数重复的次数。自然地想到,每完成一次就加1,一共加3次。得到代码如下。
在设计计数器0的时候,新增了信号flag_add。那进一步思考,什么时候要产生动作,那就让flag_add为1。自然,从题意可知,en==1是开始,重复次数完了,那就结束,不用再产生信号。所以flag_add代码。
最后我们再来设计dout,由题意可知,每次均是间隔1个之后dout变1,2个时钟之后变0。那用什么来数这个1和2呢?cnt0。综合起来,就是说cnt0数到1个后,dout变1,数完后变0。
总结:从功能的文字描述中出发,根据功能要求来设计代码。在设计时,一定要理解清楚信号的因果关系,例如为什么变0,为什么变1,从功能说明中找答案。经常训练这种思考和设计方式,几分钟就能设计出精妙的代码,而且因果关系、逻辑关系清楚,几乎不存在出错的可能,从而写出所想即所得的代码。