在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

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

            循環(huán)語句

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

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

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

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

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

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

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

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

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

            1.forever語句

            forever語句的格式如下:

            forever 語句;

            或者:

            forever begin

            多條語句

            end

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

            2.repeat語句

            repeat語句的格式如下:

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

            或者:

            repeat(表達(dá)式) begin

            多條語句

            end

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

            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

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

            begin: count1s

            reg[7:0] tempreg;

            count=0;

            tempreg = rega;

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

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

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

            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語句最簡單的應(yīng)用形式是很易理解的,其形式如下:

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

            執(zhí)行語句

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

            begin

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

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

            執(zhí)行語句

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

            end

            end

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

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

            例1:for語句1。

            begin: init_mem

            reg[7:0] tempi;

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

            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)語句實現(xiàn)前面的乘法器

            if(opb[bindex])

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

            end

            在for語句中,循環(huán)變量增值表達(dá)式可以不必是一般的常規(guī)加法或減法表達(dá)式。下面是對rega這個8位二進(jìn)制數(shù)中值為1的位進(jìn)行計數(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é)束。在一個模塊中,使用initial和always語句的次數(shù)是不受限制的。task和function語句可以在程序模塊中的一處或多處調(diào)用,其具體使用方法在第4章中詳細(xì)介紹。這里只對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語句在仿真開始時對各變量進(jìn)行初始化。

            例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塊常用于測試文件和虛擬模塊的編寫,用來產(chǎn)生仿真測試信號和設(shè)置信號記錄等仿真環(huán)境。

            2.a(chǎn)lways語句

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

            always 時序控制> 語句>

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

            always areg = ~areg;

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

            always #half_period areg = ~areg;

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

            reg[7:0] counter;

            reg tick;

            always @(posedge areg) begin

            tick = ~tick; //tick反相

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

            end

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

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

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

            end

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

            end

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



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

            評論


            相關(guān)推薦

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

            關(guān)閉