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

2021-01-08 電子產品世界

本文引用地址:http://www.eepw.com.cn/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塊常常用來描述組合邏輯和帶鎖存器的組合邏輯,如果符合,可綜合風格要求,轉換為表示組合邏輯的門級邏輯或帶鎖存器的組合邏輯。

相關焦點

  • Verilog HDL基礎之:條件語句
    但應注意,不要誤認為上面是兩個語句(if語句和else語句)。它們都屬於同一個if語句。else子句不能作為語句單獨使用,它必須是if語句的一部分,與if配對使用。(3)在if和else後面可以包含一個內嵌的操作語句,也可以有多個操作語句,此時用begin和end這兩個關鍵詞將幾個語句包含起來成為一個複合塊語句如下所示。
  • Verilog HDL基礎之:賦值語句和塊語句
    典型語句:b = a;① 塊結束後才完成賦值操作。② b的值並不是立刻就改變的。③ 這是一種比較常用的賦值方法,特別在編寫可綜合模塊時。(2)阻塞賦值方式。典型語句:b = a;① 賦值語句執行完後,塊才結束。② b的值在賦值語句執行完後立刻就改變。
  • Verilog HDL基礎之:程序基本結構
    通過命名的事件來觸發其他過程裡的激活行為或停止行為。提供了條件、if-else、case、循環程序結構。提供了可帶參數且非零延續時間的任務(task)程序結構。提供了可定義新的操作符的函數結構(function)。提供了用於建立表達式的算術運算符、邏輯運算符、位運算符。Verilog HDL語言作為一種結構化的語言也非常適合於門級和開關級的模型設計。因其結構化的特點又使它具有以下功能。
  • Verilog HDL基礎之:數據類型和運算符
    其他數據類型在後面的章節裡逐步介紹,讀者也可以查閱附錄中Verilog HDL語法參考書的有關章節逐步掌握。其他的類型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型和wor型。
  • 比較Verilog中Wire和Reg的不同之處
    和reg是Verilog程序裡的常見的兩種變量類型,他們都是構成verilog程序邏輯最基本的元素。正確掌握兩者的使用方法是寫好verilog程序的前提。但同時,因為他們在大多數程式語言中不存在,很多新接觸verilog語言的人並不能很清楚的區別兩種變量的不同之處。這裡簡單對他們做一個比較,方便在編程時區別使用。
  • Verilog HDL基礎之:與C語言的區別與聯繫(獨家)
    數字電路設計工程師一般都學習過程式語言、數字邏輯基礎、各種EDA軟體工具的使用。就程式語言而言,國內外大多數學校都以C語言為標準,只有少部分學校使用Pascal 和Fortran。
  • 零基礎學FPGA(三)Verilog語法基基礎基礎(上)
    感覺呢,是和C語言差不多,具有C語言基礎的朋友學起來應該沒什麼問題,和C語言相同的地方就不說了吧,重點說一下不同點吧。本文引用地址:http://www.eepw.com.cn/article/267551.htm  1、模塊的結構  模塊呢,是Verilog的基本設計單元,它主要是由兩部分組成,一個是接口,另一個是邏輯。
  • 零基礎學FPGA(五)Verilog語法基基礎基礎(下)
    (3)時間度量系統函數$time  在verilog hdl語法中有兩種時間度量系統函數,分別是$time和$realtime,用這兩個系統函數可以得到當前的仿真時刻。$time可以返回一個64位的值來記錄當前的仿真時刻。  (4)$finish  系統任務$finish的作用是退出仿真器,返回主作業系統,也就是結束仿真過程。
  • 【E課堂】verilog之可綜合與不可綜合
    本文引用地址:http://www.eepw.com.cn/article/201605/290588.htm  建立可綜合模型時,需注意以下幾點:  不使用initial  不使用#10之類的延時語句  不使用循環次數不確定的循環語句,如forever,while等  不使用用戶自定義原語(UDP元件)  儘量使用同步方式設計電路
  • 硬體描述語言Verilog HDL設計進階之:task和function說明語句的區別
    task和function說明語句分別用來定義任務和函數。利用任務和函數可以把一個很大的程序模塊分解成許多較小的任務和函數便於理解和調試。輸入、輸出和總線信號的值可以傳入或傳出任務和函數。
  • 【從零開始走進FPGA】路在何方——Verilog快速入門
    VHDL和Verilog區別  在業界,VHDL和Verilog是主要的兩種硬體描述語言,主要區別如下:  (1)VHDL發展的較早,語法嚴格,而Verilog HDL是在C語言的基礎上發展起來的一種硬體描述語言,語法較自由。  (2)VHDL的書寫規則比Verilog煩瑣一些,但verilog自由的語法也容易讓少數初學者出錯。
  • excel編程系列基礎:常用語句之循環語句的邏輯理解
    今天是第三篇VBA實戰入門教程,我們將給大家帶來VBA中最常見語句之一,循環語句。典型的循環語句有4種,分別是Do While…Loop循環、Do…Loop Until循環、For…Next循環、For Each x In y … Next循環。查看循環邏輯圖可以更快理解循環語句。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
  • Verilog HDL基礎教程之:時序邏輯電路
    在Verilog HDL語言中,時序邏輯電路使用always語句塊來實現。例如,實現一個帶有異步復位信號的D觸發器如下。 電路相關文章:電路分析基礎
  • 「正點原子FPGA連載」第五章Verilog HDL語法
    1)摘自【正點原子】領航者 ZYNQ 之FPGA開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?5.2Verilog基礎知識本節主要講解了Verilog的基礎知識,包括5個小節,下面我們分別給大家介紹這5個小節的內容。
  • 基於Verilog FPGA 流水燈設計
    在FPGA電路設計中,儘管流水燈的設計屬於比較簡單的入門級應用,但是其運用到的方法,是FPGA設計中最核心和最常用部分之一,是FPGA設計必須牢固掌握的基礎知識。從這一步開始,形成良好的設計習慣,寫出整潔簡潔的代碼,對於FPGA設計師來說至關重要。  在本案例中,使用常用的verilog語言完成該程序,設計並控制8個燈的花式或循環點亮。
  • verilog 語言設計時鐘分頻設計問題全解
    #刺蝟大學成長計劃# #頭條之星校園計劃# #文史之旅#時鐘信號的處理是FPGA的特色之一,因此分頻器也是FPGA設計中使用頻率非常高的基本設計之一。一般在FPGA中都有集成的鎖相環可以實現各種時鐘的分頻和倍頻設計,但是通過語言設計進行時鐘分頻是最基本的訓練,在對時鐘要求不高的設計時也能節省鎖相環資源。分頻有兩種一種偶分頻,一種奇分頻。
  • FPGA基礎篇:Verilog基礎語法
    FPGA基礎篇:Verilog基礎語法 佚名 發表於 2020-11-27 14:27:27 Verilog基礎語法
  • Verilog HDL基礎之:實例5 交通燈控制器
  • 常用SQL語句分享
    一、本期小編為大家分享一些常用的SQL語句,能夠較熟練的掌握一定的SQL語句,在做數據維護的時候往往可以達到事半功倍的效果。當然,語句在實際運用中需要舉一反三,使用各種條件組合來實現。小編水平有限,如有錯漏,請不吝賜教。
  • SQL語句常用知識清單
    1.WHERE語句WHERE語句是SQL語句中的篩選語句。1.INNER JOIN...ON語句(最常用)INNER JOIN語句兩邊是需要進行連結的兩張表,ON後面的部分則是告訴SQL是根據兩張表裡的哪個欄位去進行表與表之間的連接。