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

2021-01-09 電子產品世界

本文引用地址: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基礎之:數據類型和運算符
    其他數據類型在後面的章節裡逐步介紹,讀者也可以查閱附錄中Verilog HDL語法參考書的有關章節逐步掌握。其他的類型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型和wor型。
  • Verilog HDL簡明教程(2)
    模塊模塊是Verilog 的基本描述單位,用於描述某個設計的功能或結構及其與其他模塊通信的外部埠。一個設計的結構可使用開關級原語、門級原語和用戶定義的原語方式描述; 設計的數據流行為使用連續賦值語句進行描述; 時序行為使用過程結構描述。一個模塊可以在另一個模塊中使用。
  • SCI收錄的論文常用語句中英文對照
    文章內容與作者觀點的常用語句(1).論及了此晶體的物理、化學性質Physical and chemical properties of this crystal are reported.文章研究課題的常用語句(1).用這種超低頻測量分析了主要的實驗問題The main experimental problems are analyzed with the ultra-low-frequency measurements.
  • 這梗常用於感嘆語句中
    這梗常用於感嘆語句中時間:2020-11-19 17:25   來源:倉鼠手遊   責任編輯:沫朵 川北在線核心提示:原標題:抖音愛我是什麼梗?這梗常用於感嘆語句中 最近抖音裡突然流行起來了一句詞語愛我,視頻裡面刷愛我是什麼意思呢,很多的網友不清楚抖音愛我什麼梗,其實就是哎呀我去的簡寫,意思也就是表示感嘆,下面就跟著我一起來了解下吧! 抖音愛我什麼梗 1、愛我的意思是   原標題:抖音愛我是什麼梗?
  • 值得你珍藏的VBA編程常用語句
    大家好,今天繼續和大家分享VBA編程中常用的過程代碼。過程代碼在這裡講解的語句非常簡單單一,簡單的語句組合起來就是一個複雜的過程,我們要認真掌握這些簡單的過程,為我們複雜的工程服務。
  • Jenkins之聲明式pipeline基礎
    精華推薦:重磅發布 - 自動化框架基礎指南pdf介紹Jenkins 2.0的到來,pipline進入了視野,jenkins2.0的核心特性。也是最適合持續交付的feature。通過寫代碼的形式配置Project,且Jenkins中內置了常用的steps。2. 實現了構建步驟代碼化、構建過程視圖化。基礎Pipeline最基本的部分是「step」。基本上,step告訴Jenkins 要做什麼,並且作為Declarative Pipeline和Scripted Pipeline語法的基本構建塊。
  • 日進一步第三天,SQL語句之order by
    ,持續日更,做產品助理的斜槓青年公眾號:輕鬆自由7799第一天的SELECT……FEOM……是最常用的查詢語句數據分析之小白的第一條sql語句第二天的group by則是方便快捷分組語句數據分析之小白的第二條sql語句
  • 「Java」基礎10:什麼叫流程控制語句?
    這也是最簡單最基礎的一種結構。二、選擇結構還是以面試為例子,面試官會根據面試者的筆試成績選擇是否將他留下,這就涉及到選擇結構了。在Java代碼中存在一種特殊的語句,叫做選擇語句,對一些條件做出判斷,從而選擇對應的代碼執行。這種由選擇語句組成的代碼結構就是選擇結構。選擇語句有:if條件語句和switch條件語句。
  • Javascript之循環語句
    四、for in循環for in循環語句是一種非常精準的循環語句,可以用來枚舉(可以理解為列舉)對象的屬性。五、label語句label語句可以在代碼中添加標籤,以便我們以後使用。寫法:label名:語句;js高級程序設計的解釋:「我們加了標籤的語句一般情況下要與for循環等循環語句一起使用。
  • 北京事業單位言語理解:語句表達之語句銜接題
    語句銜接題是給出我們一篇不完整的文段,要求我們在選項中選擇最合適的一項填入文段的空缺處,使得文段在句義上、結構上都能體現出思維的條理性和語言表達的連貫性,因此這類題目也是很考驗大家閱讀理解能力的一種題型。
  • 物聯網開發筆記——嵌入式開發之Linux系統中C語言分支判斷語句
    下面就開始這套智能家居系統是如何在物聯網基礎上構建。在這裡你可以0開始,然後到1質變,僅僅需要一起跟我學物聯網系列的開發筆記的文章。第五節C語言打下基礎。本節介紹《Linux系統中C語言控制語句之分支語句》。1、C語言的語句概述1)C 語言提供了以下類型的分支判斷語句。
  • 2020廣東專插本電腦程式語句之循環語句(2)
    2020廣東專插本電腦程式語句之循環語句(2) 2020年準備參加廣東專插本考試的考生
  • python入門第六課:if語句及其列表操作
    順序結構就是一行一行按順序寫的代碼,循環結構就是之前學過的for語句,選擇結構就是用if語句寫出的帶有分支的代碼。)注意if的語句後有一個冒號「:」,少了這個編譯器會報錯。如果把if這條語句注釋掉,則會喊所有的小朋友回家吃飯,見下面的執行結果,現在知道if是做什麼用了吧。
  • 淺談5個時期的常用語句和句型
    淺談5個時期的常用語句和句型人與人之間見面打招呼是一種十分基本的禮節。生活在現代社會中的成年人以及小孩,在遇到父母、老師、朋友的時候,會根據角色不同而使用不同的問候語。這種以禮待人的優秀品質,從古代至今已經流傳了幾千年。春秋時期賢相管仲曾在《管子·牧民》中說:「倉廩實則知禮儀,衣食足則知榮辱」。
  • 如何學好C語言判斷語句?攻略if語句是第一步
    上次我們談到了switch語句,但在C語言中,if條件構成的選擇結構程序很重要。在實際問題中,往往需要對不同變量進行比較,然後分別執行不同的語句。如何使用if語句呢?小編在這裡談一談if語句基本用法與使用技巧。
  • Javascript之if條件語句和三目運算符
    一、if條件語句1、語法:if( condition ) statement1 else statement2;註:A、condition是條件,statement是需要執行的循環語句。B、當condition的條件滿足時,執行statement1語句,不滿足時,執行statement2語句。
  • 強大的修改資料庫修改語句ALTER TABLE(一)[20160712]
    同時,這條語句還支持多個命令,相信很多人在修改一個表,比如增加幾列時,都會寫多個alter語句,但實際上一條就搞定了。 二、語義詳解:  下面我們對add相關的語法進行詳細分析  1.            2)一條語句可以寫多個add語句   3)我們可以指定把這個列添加到某一列後面,或者是讓其作為第一列,相應使用after col_name或first.           4)列的定義與創建表時報定義方式一致,即我們在寫create table時怎麼給列進行定義的,這兒就怎麼定義  2.
  • switch語句的使用方法
    使用if語句嵌套解決實際問題中的多分支選擇時,如果分支數目非常多,那麼if語句的嵌套層數也會很多,使得程序代碼變得冗長而且可讀性會下降。C語言提供了switch語句來處理多分支選擇。switch語句的語法形式如下:switch(表達式){case 常量1: 語句或語句組1;case 常量2: 語句或語句組2;……case 常量n: 語句或語句組
  • 第三篇:JavaScript語句流程控制
    順序結構順序結構是流程控制中最簡單、也是最常用的結構,結構內的所有語句按順序執行,只有上一條語句執行完成後,才執行下一條語句。,函數從第一條語句開始執行,按順序執行,直至最後一條語句。,並跳過其他的條件判斷;若沒有一個條件滿足,則執行最後一個else後的語句塊;如果沒有最後的else語句,則不執行任何操作,執行該結構後面的語句。
  • 這些超級尬的偽二次元語句,請不要再使用,會給我們動漫迷招黑
    ,一起來看看這些偽二次元語句吧,請不要再使用了,真的會給我們動漫迷招黑的。這種「有一種,叫做」的二次元語句真是太給我們動漫迷招黑了,我承認第一次看到這種用一個詞語來形容一部動漫的形式確實感到了挺驚豔的,但是隨著我在各種地方刷到這種話的時候,這種東西給我的感受那就只剩下了尬,「有一種,叫做」的語句很有一種強行綁架其他人去認同喜歡這種東西的意味,天生會讓人有點反感,更不用說這種一刷一大排的「有一種