原创
[Verilog HDL 建模技巧 :低级建模 仿顺序操作·思路篇]5 - 开始/完成信号的作用
2.3“开始信号”和“完成信号”的作用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
先看看以下一段代码:
//独立模块 alway @ ( posedge CLK or negedge RSTn ) ...... else case ( cState ) "打扫" : if( 打扫完成 ) nState <= "洗厕所" else "发号打扫命令" "洗厕所" : if( 洗厕所完成 ) nState <= "跑腿" else "发送洗厕所命令" "跑腿" : ...... /*********************************************************************/ //低级功能模块1 - 打扫工作 always @ ( posedge CLK or negedge RSTn ) ...... else case( cState ) IDLE : if( 到扫命令 ) nSate <= "打扫"; else nState <= IDLE; "打扫" : "执行打扫" ; "打扫完毕后报告" ; "待命..." nState <= IDLE; ...... /*********************************************************************/ //低级功能模块2 - 洗厕所工作 always @ ( posedge CLK or negedge RSTn ) ...... else if case( cState ) IDLE: if( 洗厕所命令 ) nSate <= "洗厕所"; else nState <= IDLE; "洗厕所" : "执行洗厕所" ; "洗厕所完毕后报告" ; "待命..." nState <= IDLE; ...... /*********************************************************************/ //低级功能模块3 - 跑腿工作 always @ ( posedge CLK or negedge RSTn ) ...... else case( cState ) IDLE: if( 跑腿命令 ) nState <= "跑腿"; else nState <= IDLE; "跑腿" : ......
|
上面的代码可以分成两个部分,一部分是“独立模块”和另一部分是“低级功能模块”。独立模块只有一个则打工模块有三个,而且每一个打工模块仅包含一个功能而已“打扫”,“洗厕所”和“跑腿”....
注意: 独立模块不属于低级建模。
假设老板有一系列的命令要发号:打扫 ==> 洗厕所 ==> 跑腿
当“负责打扫”的“低级功能模块”收到老板的第一号命令“打扫”时,该模块从“待命状态”变成“打扫状态”,此时老板可以睡一觉或者干其他的活儿。该模块便开始“执行打扫任务”,当该模块“打扫完毕”后,就给老板“报告”,然后返回“待命状态”。故老板听到“打扫完成”报告后,就给下一个“低功能模块”发下一号命令 ...
在“低级建模”的结构上,为了使不同层次的“低级功能模块”可以协调的工作,“开始信号”和“完成信号”扮演着很重要的角色。在现实中,如果 “打扫 ==> 洗厕所 ==> 跑腿”是一个有“次序的三部曲”,那么老板不可能要员工颠倒次序来干活儿 。老板得按次序,一个一个的命令员工干活。除此之外老板也不可能实时监督员工的工作状况,做老板真的很辛苦,除了“发号”以外,还要干很多事情,所以员工的“完成报告”在某种程度上可以减轻老板的活儿(使编程更简单),毕竟老板也是人,他也有疲惫的时候。
接下来的话题便是:“每一个低功能模块仅包含一个功能”。
虽然在现实中,确实存在“全能的人类”打扫,洗厕所,跑腿等技能全都集于一身。但是“低级建模”的准则必须遵守。你尝试想象一下,如果一个“低级功能模块”,包含了如上的工作 “打扫 ==> 洗厕所 ==> 跑腿” 或者更多,即不是要把代码写得很长很长 ...
所以呀,“低级建模”的准则有它一定的“重要性”(在日后的深入中,你会慢慢了解的)。
文章评论(0条评论)
登录后参与讨论