加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

2013/08/20
閱讀需 15 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

 

循環(huán)語句

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

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

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

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

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

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

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

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

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

1.forever語句

forever語句的格式如下:

forever 語句;

或者:

forever begin

      多條語句

end

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

2.repeat語句

repeat語句的格式如下:

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

或者:

repeat(表達(dá)式) begin

      多條語句

end

在repeat語句中,其表達(dá)式通常為常量表達(dá)式。下面的例子中使用repeat循環(huán)語句及加法和移位操作來實(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語句

while語句的格式如下:

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

或者:

while(表達(dá)式) begin

     多條語句

end

下面舉一個(gè)while語句的例子,該例子用while循環(huán)語句對(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語句

for語句的一般形式為:

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

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

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

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

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

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

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

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

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

     執(zhí)行語句

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

begin

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

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

          執(zhí)行語句

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

     end

end

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

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

例1:for語句1。

begin: init_mem

     reg[7:0] tempi;

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

          memory[tempi]=0;

     end

 

例2:for語句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)語句實(shí)現(xiàn)前面的乘法器

          if(opb[bindex])

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

end

在for語句中,循環(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)說明語句

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

(1)initial說明語句。

(2)always說明語句。

(3)task說明語句。

(4)function說明語句。

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

1.initial語句

initial語句的格式如下:

initial begin

     語句1;

     語句2;

     ......

     語句n;

end

舉例說明。

例3:initial語句1。

initial begin

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

      for(index=0; index<size; index=index+1)

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

end

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

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

2.a(chǎn)lways語句

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

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

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

always  areg = ~areg;

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

always #half_period  areg = ~areg;

這個(gè)例子生成了一個(gè)周期為period(2×half_period) 的無限延續(xù)的信號(hào)波形,常用這種方法來描述時(shí)鐘信號(hào),作為激勵(lì)信號(hào)來測(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語句最常用的。

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塊常常用來描述組合邏輯和帶鎖存器的組合邏輯,如果符合,可綜合風(fēng)格要求,轉(zhuǎn)換為表示組合邏輯的門級(jí)邏輯或帶鎖存器的組合邏輯。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

華清遠(yuǎn)見(www.farsight.com.cn)是國(guó)內(nèi)領(lǐng)先嵌入師培訓(xùn)機(jī)構(gòu),2004年注冊(cè)于中國(guó)北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營(yíng)分公司。華清遠(yuǎn)見除提供嵌入式相關(guān)的長(zhǎng)期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負(fù)責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實(shí)驗(yàn)平臺(tái)的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開出版70余本嵌入式/移動(dòng)開發(fā)/物聯(lián)網(wǎng)相關(guān)圖書。企業(yè)理念:專業(yè)始于專注 卓識(shí)源于遠(yuǎn)見。企業(yè)價(jià)值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。