Verilog循环语句
在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。其语法和用途与C语言很类似
forever语句的格式如下:
forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句不同处在于不能独立写在程序中,而必须写在initial块中。forever循环的应用示例如下:
repeat语句的格式如下:
在repeat语句中,其表达式通常为常量表达式。如果循环计数表达式的值不确定,即为x或z时,那么循环次数按0处理。
下面的例子中使用repeat循环语句及加法和移位操作来实现一个乘法器。
while语句的格式如下:
while循环执行过程赋值语句直到制定的条件为假。如果条件表达式在开始不为真(包括假、x以及z),那么过程语句将永远不会被执行。
下面举一个while语句的例子,该例子用while循环语句对rega这个8位二进制数中值为1的位进行计数。
更完整点的写法:
for语句的一般形式为:
它的执行过程如下:
for语句最简单的应用形式是很易理解的,其形式如下:
for循环语句实际上相当于采用while循环语句建立以下的循环结构:
这样对于需要8条语句才能完成的一个循环控制,for循环语句只需两条即可。
下面分别举两个使用for循环语句的例子。例1用for语句来初始化memory。例2则用for循环语句来实现前面用repeat语句实现的乘法器。
[例1]:
[例2]:
在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个8位二进制数中值为1的位进行计数的另一种方法。见下例:
其他参考资料: 关于Verilog 中的for语句的探讨
Verilog-2001更新了generate循环,使用方法参考:
绛旓細strong>module imm_rot8 ( input [7:0] imm8, input [3:0] rotate_imm, output [31:0] result );閫氳繃宸у鐨勪綅鎿嶄綔锛屽畠灏嗙Щ浣嶇殑澶嶆潅搴﹀帇缂╁埌鏋佽嚧锛屼负鎬ц兘鍜岃祫婧愮殑骞宠 鎻愪緵浜嗘柊鐨勫彲鑳姐傚湪Verilog鐨勪笘鐣岄噷锛屾瘡涓閬寰幆绉讳綅鐨勪唬鐮佽儗鍚庯紝閮介殣钘忕潃浼樺寲鐨勬櫤鎱с傞氳繃娣卞叆鐞嗚В骞剁伒娲昏繍鐢ㄨ繖浜涙妧宸э紝鎴戜滑...
绛旓細鑳姐備笉杩寰幆璇彞瀵圭患鍚堟槸涓嶅皯鍥伴毦锛屽崰鐢ㄥ緢澶氳祫婧愶紝灏介噺灏戠敤銆
绛旓細涓嶆檽寰椾负浠涔堥潪瑕佺敤寰幆鏉ュ仛銆 鏈鍚庯紝鎴戠殑涓涓剰瑙侊細鍜屼綘闂殑鍙﹀涓涓棶棰樹竴鏍凤紝verilog HDL寰幆璇彞鎻忚堪鍑烘潵鐨勫姛鑳芥ā鍧楋紝涓瀹氳闈炲父灏忓績锛屽緢瀹规槗閫犳垚涓嶅彲缁煎悎锛屾垨鑰呯患鍚堝嚭鏉ョ殑鐢佃矾鍜屼唬鐮佹弿杩板嚭鏉ョ殑鍔熻兘涓嶄竴鏍凤紝鐢佃矾鏄敊鐨勩傛墍浠ワ紝濡傛灉鏄綘鐨勮佸笀瑕佹眰闈炲緱瑕佺敤杩欑寰幆鐨勬柟娉曞疄鐜扳滅數璺濓紝閭d箞鍏跺疄鏄笉...
绛旓細1銆乺eg鏄痑lways鍧楅噷鐢ㄧ殑锛岃鐢ㄥ湪鏃跺簭閫昏緫閲岋紝涓嶈兘鐢ㄧ粍鍚堥昏緫assign瀹氫箟銆2銆乤lways@锛坧osedge clk&a锛変竴鑸病鏈夎繖涔堝啓鐨勩俛lways@锛堣繖閲岃鍐欐潯浠讹紝寰幆鎵ц璇彞鐨勬潯浠讹級锛屾瘮濡傝浣犺鍦╟lk涓婂崌娌挎椂鎵ц璧嬪艰鍙ワ紝閭d箞灏卞湪閲岄潰濉啓posedge clk锛屽鏋滀綘瑕佸湪a鍙樺寲涓娆℃椂鍦╝lways鍧楅噷鐨勮鍙ユ墽琛屼竴娆″彲浠ュ湪鎷彿...
绛旓細鍦Verilog涓璦lways@(*)璇彞鐨勬剰鎬濇槸always妯″潡涓殑浠讳綍涓涓緭鍏ヤ俊鍙锋垨鐢靛钩鍙戠敓鍙樺寲鏃讹紝璇ヨ鍙ヤ笅鏂圭殑妯″潡灏嗚鎵ц銆1銆乤lways璇彞鏈変袱绉嶈Е鍙戞柟寮忋傜涓绉嶆槸鐢靛钩瑙﹀彂锛屼緥濡俛lways @(a or b or c)锛宎銆乥銆乧鍧囦负鍙橀噺锛屽綋鍏朵腑涓涓彂鐢熷彉鍖栨椂锛屼笅鏂圭殑璇彞灏嗚鎵ц銆2銆佺浜岀鏄部瑙﹀彂锛屼緥濡俛lways @(...
绛旓細Verilog 杩欎釜璇█鏈変袱涓儴鍒嗭紝涓閮ㄥ垎鏄彲缁煎悎鐨勭敤鏉ョ敓鎴愮數璺紝涓閮ㄥ垎鏄笉鍙患鍚堢殑鐢ㄦ潵鍐檛estbench锛堟祴璇曡剼鏈級銆備綘璐寸殑绋嬪簭鏄笉鑳界患鍚堢殑閭i儴鍒嗭紝鏄痶estbench銆備笉鑳界患鍚堢殑閭i儴鍒嗛潪甯哥殑鎺ヨ繎C璇█锛岄傚悎鍐欐祴璇曟枃浠躲傛垜鍦ㄧ綉涓婄湅浜嗕竴涓嬶紝浣犳槸鍙傝冪殑銆婂熀浜嶸erilog HDL璁捐鐨勫鍔熻兘鏁板瓧閽熴嬭繖绡囪鏂 浣犺创鐨勮繖...
绛旓細鍙崇Щ鏄>>,娌℃湁涓撻棬鐨勫彸寰幆璇彞,鍙互鐢ㄤ釜for寰幆鏉ュ啓,姣斿:reg [N:0] R integer i;always@(posedge clk)begin for(i=N;i>=1;i=i-1)R[i-1]<=R[i];R[N]<=R[0];end
绛旓細Verilog For寰幆灞炰簬涓嶅彲浠ョ患鍚堢殑锛屼笉鐭ラ亾浣犵殑鍏蜂綋瑕佹眰銆備笉杩囧湪鐢ㄦ暟瀛楃數璺疄鐜版椂锛屽洜涓烘湁鏃堕挓椹卞姩锛屾瘡涓椂閽熷懆鏈熼兘浼氭墽琛宎lways璇彞涓娆°傚缓璁綘杩樻槸鎶奦erilog鎼炴竻妤氬啀杩涜绉绘銆
绛旓細disable璇彞鍙互閫鍑轰换浣寰幆锛岃兘澶熺粓姝换浣昩egin..end鍧楃殑鎵ц锛岀敤浜庝豢鐪熼獙璇佷腑銆備緥濡 begin:one for(i=1;i<5;i=i+1)begin:two if(a==0)disable one; //浠巓ne杩欎釜begin..end 涓烦鍑猴紝缁堟浜唂or if(a==1)disable two;//浠巘wo杩欎釜begin..end鍧椾腑璺冲嚭锛屼粠鏈寰幆涓烦鍑 end end 缃戜笂鐪嬪埌...
绛旓細涓鑸儏鍐典笅寤鸿涓嶈浣跨敤for銆亀hile銆乫or-loop杩欑被甯﹀惊鐜殑璇彞锛岃繖涓簲璇ユ槸缁煎悎鍣ㄥ寰幆璇彞杩涜闄愬埗浜嗭紝鏈濂戒慨鏀逛唬鐮侊紝鐩存帴鎶婂惊鐜鍙ュ睍寮銆傚鏋滀笉鎯虫敼浠g爜鐨勮瘽鍙互鎹釜缁煎悎鍣ㄨ瘯璇曪紝濡俿ynplify锛堜笉鐭ラ亾ISE甯︿笉甯ynplify锛夛紝涓嶅悓鐨勭患鍚堝伐鍏峰寰幆璇彞鐨勭患鍚堟晥鏋滀笉鍚岋紝鎵浠ュぇ澶氫笉浣跨敤寰幆璇彞 ...