<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Verilog HDL基礎(chǔ)之:其他常用語(yǔ)句

          Verilog HDL基礎(chǔ)之:其他常用語(yǔ)句

          作者: 時(shí)間:2017-06-05 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201706/348847.htm

          循環(huán)語(yǔ)句

          在Verilog HDL中存在著4種類型的循環(huán)語(yǔ)句,用來(lái)控制執(zhí)行語(yǔ)句的執(zhí)行次數(shù)。

          (1)forever:連續(xù)的執(zhí)行語(yǔ)句。

          (2)repeat:連續(xù)執(zhí)行一條語(yǔ)句 n 次。

          (3)while:執(zhí)行一條語(yǔ)句直到某個(gè)條件不滿足。如果一開始條件即不滿足(為假),則語(yǔ)句一次也不能被執(zhí)行。

          (4)for通過(guò)以下3個(gè)步驟來(lái)決定語(yǔ)句的循環(huán)執(zhí)行。

          ① 先給控制循環(huán)次數(shù)的變量賦初值。

          ② 判定控制循環(huán)的表達(dá)式的值,如為假則跳出循環(huán)語(yǔ)句,如為真則執(zhí)行指定的語(yǔ)句后,轉(zhuǎn)到步驟③。

          ③ 執(zhí)行一條賦值語(yǔ)句來(lái)修正控制循環(huán)變量次數(shù)的變量的值,然后返回步驟②。

          下面將詳細(xì)地對(duì)各種循環(huán)語(yǔ)句進(jìn)行介紹。

          1.forever語(yǔ)句

          forever語(yǔ)句的格式如下:

          forever 語(yǔ)句;

          或者:

          forever begin

          多條語(yǔ)句

          end

          forever循環(huán)語(yǔ)句常用于產(chǎn)生周期性的波形,用來(lái)作為仿真測(cè)試信號(hào)。它與always語(yǔ)句不同之處在于它不能獨(dú)立寫在程序中,而必須寫在initial塊中。

          2.repeat語(yǔ)句

          repeat語(yǔ)句的格式如下:

          repeat(表達(dá)式) 語(yǔ)句;

          或者:

          repeat(表達(dá)式) begin

          多條語(yǔ)句

          end

          在repeat語(yǔ)句中,其表達(dá)式通常為常量表達(dá)式。下面的例子中使用repeat循環(huán)語(yǔ)句及加法和移位操作來(lái)實(shí)現(xiàn)一個(gè)乘法器。

          parameter size=8,longsize=16; //參數(shù)聲明

          reg [size:1] opa, opb; //寄存器聲明

          reg [longsize:1] result;

          begin: mult //為begin_end模塊定名模塊名

          reg [longsize:1] shift_opa, shift_opb; //寄存器聲明

          shift_opa = opa; //將opa、opb的值賦為shift_opa、shift_opb

          shift_opb = opb;

          result = 0;

          repeat(size) begin //循環(huán)次數(shù)

          if(shift_opb[1])

          result = result + shift_opa; //加法操作

          shift_opa = shift_opa 1; //左移1位

          shift_opb = shift_opb >>1; //右移1位

          end

          end

          3.while語(yǔ)句

          while語(yǔ)句的格式如下:

          while(表達(dá)式) 語(yǔ)句

          或者:

          while(表達(dá)式) begin

          多條語(yǔ)句

          end

          下面舉一個(gè)while語(yǔ)句的例子,該例子用while循環(huán)語(yǔ)句對(duì)rega這個(gè)8位二進(jìn)制數(shù)中值為1的位進(jìn)行計(jì)數(shù)。

          begin: count1s

          reg[7:0] tempreg;

          count=0;

          tempreg = rega;

          while(tempreg) begin //當(dāng)tempreg中有不為0的位時(shí),循環(huán)執(zhí)行

          if(tempreg[0]) count = count + 1; //低位為1時(shí),計(jì)數(shù)

          tempreg = tempreg>>1; //否則右移1位,此時(shí)高位用0填補(bǔ)

          end

          end

          4.for語(yǔ)句

          for語(yǔ)句的一般形式為:

          for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句

          它的執(zhí)行過(guò)程如下。

          ① 先求解表達(dá)式1。

          ② 求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語(yǔ)句中指定的內(nèi)嵌語(yǔ)句,然后執(zhí)行步驟③;若為假(0),則結(jié)束循環(huán),轉(zhuǎn)到步驟⑤。

          ③ 若表達(dá)式為真,在執(zhí)行指定的語(yǔ)句后,求解表達(dá)式3。

          ④ 轉(zhuǎn)到步驟②繼續(xù)執(zhí)行。

          ⑤ 執(zhí)行for語(yǔ)句下面的語(yǔ)句。

          for語(yǔ)句最簡(jiǎn)單的應(yīng)用形式是很易理解的,其形式如下:

          for(循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值)

          執(zhí)行語(yǔ)句

          for循環(huán)語(yǔ)句實(shí)際上相當(dāng)于采用while循環(huán)語(yǔ)句建立以下的循環(huán)結(jié)構(gòu):

          begin

          循環(huán)變量賦初值;

          while(循環(huán)結(jié)束條件) begin

          執(zhí)行語(yǔ)句

          循環(huán)變量增值;

          end

          end

          這樣對(duì)于需要8條語(yǔ)句才能完成的一個(gè)循環(huán)控制,for循環(huán)語(yǔ)句只需兩條即可。

          下面分別舉兩個(gè)使用for循環(huán)語(yǔ)句的例子。例1用for語(yǔ)句來(lái)初始化memory。例2則用for循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)前面用repeat語(yǔ)句實(shí)現(xiàn)的乘法器。

          例1:for語(yǔ)句1。

          begin: init_mem

          reg[7:0] tempi;

          for(tempi=0;tempimemsize;tempi=tempi+1) //使用for循環(huán)語(yǔ)句初始化存儲(chǔ)器

          memory[tempi]=0;

          end

          例2:for語(yǔ)句2。

          parameter size = 8, longsize = 16;

          reg[size:1] opa, opb;

          reg[longsize:1] result;

          begin: mult

          integer bindex;

          result=0;

          for( bindex=1; bindex=size; bindex=bindex+1 )//使用for循環(huán)語(yǔ)句實(shí)現(xiàn)前面的乘法器

          if(opb[bindex])

          result = result + (opa(bindex-1)); //加法并移位

          end

          在for語(yǔ)句中,循環(huán)變量增值表達(dá)式可以不必是一般的常規(guī)加法或減法表達(dá)式。下面是對(duì)rega這個(gè)8位二進(jìn)制數(shù)中值為1的位進(jìn)行計(jì)數(shù)的另一種方法,如下所示:

          begin: count1s

          reg[7:0] tempreg;

          count=0;

          for( tempreg=rega; tempreg; tempreg=tempreg>>1 )//循環(huán)變量增值表達(dá)式使用右移操作

          if(tempreg[0])

          count=count+1;

          end

          結(jié)構(gòu)說(shuō)明語(yǔ)句

          Verilog語(yǔ)言中的任何過(guò)程模塊都從屬于以下4種結(jié)構(gòu)的說(shuō)明語(yǔ)句。

          (1)initial說(shuō)明語(yǔ)句。

          (2)always說(shuō)明語(yǔ)句。

          (3)task說(shuō)明語(yǔ)句。

          (4)function說(shuō)明語(yǔ)句。

          initial和always說(shuō)明語(yǔ)句在仿真的一開始即開始執(zhí)行。initial語(yǔ)句只執(zhí)行一次,always語(yǔ)句則是不斷地重復(fù)執(zhí)行,直到仿真過(guò)程結(jié)束。在一個(gè)模塊中,使用initial和always語(yǔ)句的次數(shù)是不受限制的。task和function語(yǔ)句可以在程序模塊中的一處或多處調(diào)用,其具體使用方法在第4章中詳細(xì)介紹。這里只對(duì)initial和always語(yǔ)句加以介紹。

          1.initial語(yǔ)句

          initial語(yǔ)句的格式如下:

          initial begin

          語(yǔ)句1;

          語(yǔ)句2;

          ......

          語(yǔ)句n;

          end

          舉例說(shuō)明。

          例3:initial語(yǔ)句1。

          initial begin

          areg=0; //初始化寄存器areg

          for(index=0; indexsize; index=index+1)

          memory[index]=0; //初始化一個(gè)memory

          end

          在這個(gè)例子中用initial語(yǔ)句在仿真開始時(shí)對(duì)各變量進(jìn)行初始化。

          例4:initial語(yǔ)句2。

          initial begin

          inputs = b000000; //初始時(shí)刻為0

          #10 inputs = b011001; //賦值時(shí)刻為10

          #10 inputs = b011011; //賦值時(shí)刻為20

          #10 inputs = b011000; //賦值時(shí)刻為30

          #10 inputs = b001000; //賦值時(shí)刻為40

          end

          從這個(gè)例子中,我們可以看到initial語(yǔ)句的另一個(gè)用途,即用initial語(yǔ)句來(lái)生成激勵(lì)波形作為電路的測(cè)試仿真信號(hào)。一個(gè)模塊中可以有多個(gè)initial塊,它們都是并行運(yùn)行的。initial塊常用于測(cè)試文件和虛擬模塊的編寫,用來(lái)產(chǎn)生仿真測(cè)試信號(hào)和設(shè)置信號(hào)記錄等仿真環(huán)境。

          2.a(chǎn)lways語(yǔ)句

          always語(yǔ)句在仿真過(guò)程中是不斷重復(fù)執(zhí)行的,其聲明格式如下:

          always 時(shí)序控制> 語(yǔ)句>

          always語(yǔ)句由于其不斷重復(fù)執(zhí)行的特性,只有和一定的時(shí)序控制結(jié)合在一起才有用。如果一個(gè)always語(yǔ)句沒(méi)有時(shí)序控制,則這個(gè)always語(yǔ)句將會(huì)發(fā)成一個(gè)仿真死鎖,例如:

          always areg = ~areg;

          這個(gè)always語(yǔ)句將會(huì)生成一個(gè)0延遲的無(wú)限循環(huán)跳變過(guò)程,這時(shí)會(huì)發(fā)生仿真死鎖。如果加上時(shí)序控制,則這個(gè)always語(yǔ)句將變?yōu)橐粭l非常有用的描述語(yǔ)句,例如:

          always #half_period areg = ~areg;

          這個(gè)例子生成了一個(gè)周期為period(2×half_period) 的無(wú)限延續(xù)的信號(hào)波形,常用這種方法來(lái)描述時(shí)鐘信號(hào),作為激勵(lì)信號(hào)來(lái)測(cè)試所設(shè)計(jì)的電路。

          reg[7:0] counter;

          reg tick;

          always @(posedge areg) begin

          tick = ~tick; //tick反相

          counter = counter + 1; //計(jì)數(shù)器遞增

          end

          這個(gè)例子中,每當(dāng)areg信號(hào)的上升沿出現(xiàn)時(shí),把tick信號(hào)反相,并且把counter增加1。這種時(shí)間控制是always語(yǔ)句最常用的。

          always 的時(shí)間控制可以是沿觸發(fā)也可以是電平觸發(fā)的,可以單個(gè)信號(hào)也可以多個(gè)信號(hào),中間需要用關(guān)鍵字 or 連接,如:

          always @(posedge clock or posedge reset) begin //由兩個(gè)沿觸發(fā)的always塊

          end

          always @( a or b or c ) begin //由多個(gè)電平觸發(fā)的always塊

          end

          沿觸發(fā)的always塊常常描述時(shí)序邏輯,如果符合,可綜合風(fēng)格要求,用綜合工具自動(dòng)轉(zhuǎn)換為表示時(shí)序邏輯的寄存器組和門級(jí)邏輯。電平觸發(fā)的always塊常常用來(lái)描述組合邏輯和帶鎖存器的組合邏輯,如果符合,可綜合風(fēng)格要求,轉(zhuǎn)換為表示組合邏輯的門級(jí)邏輯或帶鎖存器的組合邏輯。



          關(guān)鍵詞: VerilogHDL 華清遠(yuǎn)見

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();