<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.forever語(yǔ)句

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

forever 語(yǔ)句;

或者:

forever begin

多條語(yǔ)句

end

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

2.repeat語(yǔ)句

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

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

或者:

repeat(表達式) begin

多條語(yǔ)句

end

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

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 //循環(huán)次數

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

或者:

while(表達式) begin

多條語(yǔ)句

end

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

begin: count1s

reg[7:0] tempreg;

count=0;

tempreg = rega;

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

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

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

end

end

4.for語(yǔ)句

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

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

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

① 先求解表達式1。

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

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

④ 轉到步驟②繼續執行。

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

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

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

執行語(yǔ)句

for循環(huán)語(yǔ)句實(shí)際上相當于采用while循環(huán)語(yǔ)句建立以下的循環(huán)結構:

begin

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

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

執行語(yǔ)句

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

end

end

這樣對于需要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í)現前面用repeat語(yǔ)句實(shí)現的乘法器。

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

begin: init_mem

reg[7:0] tempi;

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

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í)現前面的乘法器

if(opb[bindex])

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

end

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

begin: count1s

reg[7:0] tempreg;

count=0;

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

if(tempreg[0])

count=count+1;

end

結構說(shuō)明語(yǔ)句

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

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

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

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

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

initial和always說(shuō)明語(yǔ)句在仿真的一開(kāi)始即開(kāi)始執行。initial語(yǔ)句只執行一次,always語(yǔ)句則是不斷地重復執行,直到仿真過(guò)程結束。在一個(gè)模塊中,使用initial和always語(yǔ)句的次數是不受限制的。task和function語(yǔ)句可以在程序模塊中的一處或多處調用,其具體使用方法在第4章中詳細介紹。這里只對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ǔ)句在仿真開(kāi)始時(shí)對各變量進(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)生成激勵波形作為電路的測試仿真信號。一個(gè)模塊中可以有多個(gè)initial塊,它們都是并行運行的。initial塊常用于測試文件和虛擬模塊的編寫(xiě),用來(lái)產(chǎn)生仿真測試信號和設置信號記錄等仿真環(huán)境。

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

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

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

always語(yǔ)句由于其不斷重復執行的特性,只有和一定的時(shí)序控制結合在一起才有用。如果一個(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ú)限延續的信號波形,常用這種方法來(lái)描述時(shí)鐘信號,作為激勵信號來(lái)測試所設計的電路。

reg[7:0] counter;

reg tick;

always @(posedge areg) begin

tick = ~tick; //tick反相

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

end

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

always 的時(shí)間控制可以是沿觸發(fā)也可以是電平觸發(fā)的,可以單個(gè)信號也可以多個(gè)信號,中間需要用關(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)轉換為表示時(shí)序邏輯的寄存器組和門(mén)級邏輯。電平觸發(fā)的always塊常常用來(lái)描述組合邏輯和帶鎖存器的組合邏輯,如果符合,可綜合風(fēng)格要求,轉換為表示組合邏輯的門(mén)級邏輯或帶鎖存器的組合邏輯。



關(guān)鍵詞: VerilogHDL 華清遠見(jiàn)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>