新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Verilog HDL基礎之:其他常用語句

        Verilog HDL基礎之:其他常用語句

        作者: 時間:2017-06-05 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201706/348847.htm

        循環語句

        在Verilog HDL中存在著4種類型的循環語句,用來控制執行語句的執行次數。

        (1)forever:連續的執行語句。

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

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

        (4)for通過以下3個步驟來決定語句的循環執行。

        ① 先給控制循環次數的變量賦初值。

        ② 判定控制循環的表達式的值,如為假則跳出循環語句,如為真則執行指定的語句后,轉到步驟③。

        ③ 執行一條賦值語句來修正控制循環變量次數的變量的值,然后返回步驟②。

        下面將詳細地對各種循環語句進行介紹。

        1.forever語句

        forever語句的格式如下:

        forever 語句;

        或者:

        forever begin

        多條語句

        end

        forever循環語句常用于產生周期性的波形,用來作為仿真測試信號。它與always語句不同之處在于它不能獨立寫在程序中,而必須寫在initial塊中。

        2.repeat語句

        repeat語句的格式如下:

        repeat(表達式) 語句;

        或者:

        repeat(表達式) begin

        多條語句

        end

        在repeat語句中,其表達式通常為常量表達式。下面的例子中使用repeat循環語句及加法和移位操作來實現一個乘法器。

        parameter size=8,longsize=16; //參數聲明

        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 //循環次數

        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(表達式) 語句

        或者:

        while(表達式) begin

        多條語句

        end

        下面舉一個while語句的例子,該例子用while循環語句對rega這個8位二進制數中值為1的位進行計數。

        begin: count1s

        reg[7:0] tempreg;

        count=0;

        tempreg = rega;

        while(tempreg) begin //當tempreg中有不為0的位時,循環執行

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

        tempreg = tempreg>>1; //否則右移1位,此時高位用0填補

        end

        end

        4.for語句

        for語句的一般形式為:

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

        它的執行過程如下。

        ① 先求解表達式1。

        ② 求解表達式2,若其值為真(非0),則執行for語句中指定的內嵌語句,然后執行步驟③;若為假(0),則結束循環,轉到步驟⑤。

        ③ 若表達式為真,在執行指定的語句后,求解表達式3。

        ④ 轉到步驟②繼續執行。

        ⑤ 執行for語句下面的語句。

        for語句最簡單的應用形式是很易理解的,其形式如下:

        for(循環變量賦初值;循環結束條件;循環變量增值)

        執行語句

        for循環語句實際上相當于采用while循環語句建立以下的循環結構:

        begin

        循環變量賦初值;

        while(循環結束條件) begin

        執行語句

        循環變量增值;

        end

        end

        這樣對于需要8條語句才能完成的一個循環控制,for循環語句只需兩條即可。

        下面分別舉兩個使用for循環語句的例子。例1用for語句來初始化memory。例2則用for循環語句來實現前面用repeat語句實現的乘法器。

        例1:for語句1。

        begin: init_mem

        reg[7:0] tempi;

        for(tempi=0;tempimemsize;tempi=tempi+1) //使用for循環語句初始化存儲器

        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循環語句實現前面的乘法器

        if(opb[bindex])

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

        end

        在for語句中,循環變量增值表達式可以不必是一般的常規加法或減法表達式。下面是對rega這個8位二進制數中值為1的位進行計數的另一種方法,如下所示:

        begin: count1s

        reg[7:0] tempreg;

        count=0;

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

        if(tempreg[0])

        count=count+1;

        end

        結構說明語句

        Verilog語言中的任何過程模塊都從屬于以下4種結構的說明語句。

        (1)initial說明語句。

        (2)always說明語句。

        (3)task說明語句。

        (4)function說明語句。

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

        1.initial語句

        initial語句的格式如下:

        initial begin

        語句1;

        語句2;

        ......

        語句n;

        end

        舉例說明。

        例3:initial語句1。

        initial begin

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

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

        memory[index]=0; //初始化一個memory

        end

        在這個例子中用initial語句在仿真開始時對各變量進行初始化。

        例4:initial語句2。

        initial begin

        inputs = b000000; //初始時刻為0

        #10 inputs = b011001; //賦值時刻為10

        #10 inputs = b011011; //賦值時刻為20

        #10 inputs = b011000; //賦值時刻為30

        #10 inputs = b001000; //賦值時刻為40

        end

        從這個例子中,我們可以看到initial語句的另一個用途,即用initial語句來生成激勵波形作為電路的測試仿真信號。一個模塊中可以有多個initial塊,它們都是并行運行的。initial塊常用于測試文件和虛擬模塊的編寫,用來產生仿真測試信號和設置信號記錄等仿真環境。

        2.always語句

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

        always 時序控制> 語句>

        always語句由于其不斷重復執行的特性,只有和一定的時序控制結合在一起才有用。如果一個always語句沒有時序控制,則這個always語句將會發成一個仿真死鎖,例如:

        always areg = ~areg;

        這個always語句將會生成一個0延遲的無限循環跳變過程,這時會發生仿真死鎖。如果加上時序控制,則這個always語句將變為一條非常有用的描述語句,例如:

        always #half_period areg = ~areg;

        這個例子生成了一個周期為period(2×half_period) 的無限延續的信號波形,常用這種方法來描述時鐘信號,作為激勵信號來測試所設計的電路。

        reg[7:0] counter;

        reg tick;

        always @(posedge areg) begin

        tick = ~tick; //tick反相

        counter = counter + 1; //計數器遞增

        end

        這個例子中,每當areg信號的上升沿出現時,把tick信號反相,并且把counter增加1。這種時間控制是always語句最常用的。

        always 的時間控制可以是沿觸發也可以是電平觸發的,可以單個信號也可以多個信號,中間需要用關鍵字 or 連接,如:

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

        end

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

        end

        沿觸發的always塊常常描述時序邏輯,如果符合,可綜合風格要求,用綜合工具自動轉換為表示時序邏輯的寄存器組和門級邏輯。電平觸發的always塊常常用來描述組合邏輯和帶鎖存器的組合邏輯,如果符合,可綜合風格要求,轉換為表示組合邏輯的門級邏輯或帶鎖存器的組合邏輯。



        關鍵詞: VerilogHDL 華清遠見

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 靖远县| 大埔区| 花莲县| 诸城市| 武城县| 长武县| 延津县| 什邡市| 洛浦县| 邢台县| 玉山县| 宜阳县| 龙泉市| 汶上县| 临猗县| 隆化县| 久治县| 长葛市| 黑河市| 凤冈县| 神农架林区| 镇巴县| 天长市| 调兵山市| 民勤县| 光泽县| 横山县| 深州市| 浦县| 宁武县| 闽侯县| 广南县| 奉贤区| 靖边县| 南投县| 柳河县| 仪征市| 星子县| 湖南省| 汝城县| 陆良县|