《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業界動態 > 零基礎教你學FPGA之Verilog語法基礎(中)

零基礎教你學FPGA之Verilog語法基礎(中)

2015-02-09
關鍵詞: FPGA Verilog 基礎

我們接著上篇文章繼續學習,上次提到了兩種賦值語句,讓我們接著往下學。

  1、塊語句

  塊語句包括兩種,一個是順序塊,一個是并行塊。

  (1)順序快

  順序快就好比C語言里的大括號“{ }”,在語法中,用begin…end代替。這里只需要知道,在begin…end中間的語句是順序執行的就行了。

  (2)并行塊

  并行塊可以算是一個新的知識點,與順序塊最大的不同就是并行塊中的語句是同時開始執行的,要想控制語句的先后順序,可以加延時語句控制。這種并行塊是用fork…join語句描述。

  2、條件語句

  條件語句這里不說,和C語言一樣。就說一點主意事項。

  在使用條件語句時,要注意語句的嚴整與封閉性。和C語言不同,舉個例子

  always @(al or d)

  begin

  if(al==1) q=d;

  end

  這個例子是說,當al上升沿到來時,d的值賦給q,那么當al=0時又是什么情況呢,事實上,在always塊中,如果沒有給變量賦值,這個變量就會保持原值,也就是生成了一個鎖存器。為了避免這種情況的發生,我們一般這樣寫

  always @(al or d)

  begin

  if(al==1) q=d;

  else q=0;

  end

  同樣在case語句中也要加上default語句避免鎖存器的生成,這樣可以使設計者更加明確的設計目標,也提高了程序的可讀性。

  3、case語句

  

360桌面截圖20140226225540.jpg

 

  case語句要注意幾點,只挑幾點重要的,其他的不說了

  (1)case語句分項后的表達式的值必須相同,否則就會出現問題,例如上面圖片上的result。

  (2)與C語言不同,與某一項case語句匹配后,就會跳出case語句,這里沒有break語句。

  (3)case語句的所有表達式位寬必須相等,例如上圖都是16位整型,如果不加以說明,系統會以默認值32位控制表達式位寬。

  下面是case,casez,case語句的真值表

  

360桌面截圖20140226230246.jpg

 

  這個表其實還是很好記的

  case語句,只有匹配才出“1”

  casez語句除了匹配出“1”之外,另外只要遇到“z”就出“1”

  case語句除了匹配出“1”之外,另外只要遇到“z”或“x”就出“1”

  

360桌面截圖20140226231114.jpg

 

  上圖就用到了casez語句來處理不必要考慮的值,這樣就可以靈活的設置對信號的默寫位進行比較。

  下面寫了一個小例子來練習一下

  使用case語句實現一個四選一多路選擇器

  module xiaomo(a1,a2,a3,a4,out,s1,s2);

  input a1,a2,a3,a4;

  input s1,s2;

  reg out; //把輸出變量聲明為寄存器類型

  always @(s1 or s2 or a1 or a2 or a3 or a4 or out) //任何信號的變化都會引起輸出變量的重新計算

  begin

  case ({s1,s2}) //位拼接運算

  2'b00: out=a1;

  2'b01: out=a2;

  2'b10: out=a3;

  2'b11: out=a4;

  default: out=1'bx; //保持語句的嚴整性

  endcase

  end

  endmodule

4、循環語句

  語法**有4中循環語句,這里只簡單說一下C語言里沒有的兩種

  (1) forever語句

  連續執行語句,這種語句主要用在產生周期性的波形,用來做仿真信號。個人理解和always語句差不多的功能,但是,forever語句只能用在initial塊中。

  (2)repeat 語句后面接常量表達式,可以指定循環次數,例如;

  repeat (8)

  begin

  …

  end

  表示循環8次相應語句。

  5、順序塊和并行塊

  所謂順序塊就是前面說的begin…end,他的作用就是把多條語句組合到一起執行,在順序塊里面,語句是一條一條順序執行的,如果遇到#10延遲語句,延遲也是相對于上一條語句的延遲,這一點比較重要。

  相對于順序塊的就是并行塊,用fork…end語句表示,并行塊里的語句是同時執行的。

  順序塊和并行塊可以嵌套使用。

  如果在begin或者fork語句后面加上名字,這個塊語句就成了命名塊,例如

  begin :xiaomo

  ……

  end

  命名塊有什么好處呢?有了命名塊,我們就可以用verilog提供的disable語句來隨時終止命名塊,例如disable xiaomo;這樣,當程序運行到此時,就會禁用命名塊,就會直接跳出塊語句,相當于C語言里面的break語句一樣,看下面這個例子:

  

360桌面截圖20140308132040.jpg

 

  6、生成塊

  生成塊語句可以動態的生成代碼,這一聲明語句方面了參數化模塊的生成。黨對矢量中的多個位進行重復操作時,或者進行多個模塊的實力引用時,或者在根據參數的定義來確定程序中是否應該包括末端代碼的時候,使用生成語句能夠大大簡化程序的編寫過程。

  生成語句可以控制變量的聲明、任務或函數的調用,還能對實力引用進行全面的控制。編寫代碼時必須在模塊中說明生成塊的實例范圍,關鍵字 generate…endgenerate用來指定該范圍。

  Verilog中有三種生成語句的方法,分別是循環生成,條件生成和case生成。

  (1)循環生成

  

360桌面截圖20140308142337.jpg

 

  

360桌面截圖20140308142446.jpg

 

  注:genvar 是關鍵詞,用于生成生成變量,生成變量只存在于生成塊中,在確立后的方針代碼中,生成變量是不存在的。

  xor_loop是賦予生成語句的名字,目的在于溝通它對循環生成語句之中的變量進行層次化引用。因此循環生成語句中的各個異或門的相對層次為:xor_loop[0].gl,xor_loop[1].gl…,xor_loop[31] 這句話什么意思啊

  這個例子中的 xor gl (out [ j ] , i0 [ j ], i1 [ j ] );什么意思??求大神指點

  當然這個異或門還可用always塊實現

  生成塊程序

  generate

  for (j=0;j

  begin :xiaomo

  always @(i0[ j ] or i1[ j ]) out [ j ]=i0[ j ]^i1[ j ];

  end

  endgenerate

  (2)條件生成

  

360桌面截圖20140308145303.jpg

 

  下面是一段生成語句

  

360桌面截圖20140308145416.jpg

 

  (3)case生成

  

360桌面截圖20140308150117.jpg

 

  下面是一個例子使用case語句生成N位的加法器

  

360桌面截圖20140308150759.jpg

 

  

360桌面截圖20140308150809.jpg

 

  說實話上面這些東西我自己也是看的模模糊糊,好多地方不懂,只能先截個圖放這兒了。唉...基礎還是不行啊...

7、結構語句

  (1)initial語句比較簡單,這里就不多說了。

  (2)always語句

  always語句在仿真過程中是不斷活動的,always語句后面的語句是否執行,這要看always語句是否滿足觸發條件。因此,always語句只有和時序控制語句結合才能使用,否則就會被死鎖。例如:always areg=~areg;

  這個always語句生成一個0延遲的無限跳變過程這時會發生死鎖。但是一旦加上時序控制,這條語句就不一樣了,例如:

  always #10 areg=~areg;

  這樣的語句就描述的一個周期為20毫秒的跳變信號。所以我們常用這種方法來描述時鐘信號,并作為激勵信號來測試硬件電路。

  看下面這個例子

  reg [7:0] counter;

  reg tick;

  always @(posedge areg)

  begin

  tick=~tick;

  counter=counter+1;

  end

  這個例子就是說每當信號areg上升沿到來時,信號tick取反,計數器counter加一,這種時間控制是always語句最常用的。

  always語句的時間控制模板

  

360桌面截圖20140308153256.jpg

 

  如果組合邏輯塊語句的輸入變量過多容易漏掉,例如:

  always @(a or b or c or d or e)

  這樣的情況下可以用always@ (*)語句來代替,*號自動將所有輸入變量默認為敏感信號。

  上面所討論的都是等待信號的值發生變化或者觸發時才執行相應語句,我們也可以用wait語句來用電平敏感來控制。例如

  always

  wait (count_enable) #20 count=count+1;

  意思就是說,當count-enable的值為1時,程序延遲20毫秒后計數。

  8、任務與函數

  書上寫了關于任務與函數的區別,寫了好多,我覺得區別這兩個概念主要看一點就夠了,就是看有沒有返回值,函數有,任務沒有。舉個例子

  switch_bytes (old_bytes,new_bytes);這是個任務,沒有返回值,功能是把新舊兩個字節互換位置。

  new_bytes=switch_bytes(old_bytes);這是個函數,功能是把舊字節轉換后賦值給新字節。有返回值。

  下面寫一個交通信號燈的程序來學習一下任務這個概念

  moudle xiaomo_traffic;

  reg clock,red,green,amber;

  //定義時鐘,紅燈,黃燈,綠燈

  parameter on=1,off=0,red_tics=350.amber_tics=30,green_ics=200;

  //定義紅燈等待350個時鐘,黃燈等待30個時鐘,綠燈等待200個時鐘

  initial red=0;

  initial green=0;

  initial amber=0;

  //初始化,這里用initial語句保證三條語句同時執行

  always

  begin

  red=on; //紅燈亮

  light (red,red_tics); //這里用到任務,功能是等待350個時鐘的時間,聲明看下面程序

  amber=on; //黃燈亮

  light (amber,amber_tics); //等待30個時鐘

  green=on; //綠燈亮

  light (green,green_tics); //等待200個時鐘

  end

  task:light; //命名任務

  output color;

  input [31:0] tics;

  //注意這里的兩個變量要與上面的一一對應,也就是說上面的light(red,red_tics);中的red對應color,red_tics對應tics

  begin

  repeat(tics); //重復執行tics次下面的語句

  @(posedge clock); //等待上升沿,因為這里的tics對應上面的red_tics幾個,所以這里要等待相應個上升沿

  color=off; //等到相應個上升沿結束時,相應顏色的燈關閉

  end

  endtask

  //下面就是寫時鐘函數了,用always塊

  always

  begin

  #100 clock=0;

  #100 clock=1; //每100毫秒產生一次跳變

  end

  endmoudle

  注意:這個程序要找對一一對應關系,例如脈沖模塊里的clock對應posedge clock中的clock,程序行與行之間是有聯系的,不能隨便聲明

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产伦精品一区二区三区高清版| 精品1区2区3区4区| 一色屋精品视频在线看 | 亚洲影院色无极综合| 亚洲另类在线视频| 亚洲激情在线观看| 91久久久久久久久| 亚洲国产精品久久久久秋霞不卡| 午夜视频在线观看一区| 午夜国产精品视频免费体验区| 亚洲先锋成人| 亚洲欧美高清| 午夜精品视频在线| 欧美在线观看视频一区二区三区| 欧美一区三区三区高中清蜜桃| 午夜精品国产更新| 欧美一级播放| 欧美专区在线观看一区| 欧美在线视频一区| 亚洲福利视频专区| 亚洲日本欧美天堂| 99精品欧美一区二区三区综合在线| 亚洲伦理在线免费看| 这里只有精品丝袜| 亚洲一区二区三区中文字幕| 亚洲欧美欧美一区二区三区| 午夜一区不卡| 欧美专区福利在线| 美女视频黄免费的久久| 欧美国产日韩二区| 欧美日韩三区| 国产精品视频久久一区| 国产欧美一区二区三区在线看蜜臀 | 欧美人成在线视频| 欧美日韩不卡| 国产精品www色诱视频| 国产精品永久免费在线| 狠狠狠色丁香婷婷综合激情| 1769国产精品| 日韩午夜在线电影| 午夜一区在线| 亚洲国产一区二区三区高清| 一二三区精品| 亚洲欧美日韩精品久久久| 久久精品在线免费观看| 蜜桃久久av一区| 欧美人与性动交cc0o| 国产精品乱子乱xxxx| 国产日韩欧美精品| 亚洲国产精品一区| 亚洲制服欧美中文字幕中文字幕| 欧美一级一区| 亚洲毛片av| 午夜精品久久久久久久99水蜜桃| 久久久噜噜噜久久人人看| 欧美极品一区二区三区| 欧美午夜性色大片在线观看| 国产一区二区高清视频| 亚洲福利视频免费观看| 亚洲色诱最新| 欧美亚洲一区二区在线| 99综合在线| 久久精品一二三区| 欧美精品网站| 国产日韩欧美一区二区三区四区| 亚洲大片精品永久免费| 亚洲午夜黄色| 亚洲电影免费观看高清完整版| 一本久久综合| 久久久免费精品视频| 欧美日韩成人综合天天影院| 国产欧美日韩综合精品二区| 亚洲国产精品高清久久久| 亚洲亚洲精品在线观看| 91久久夜色精品国产九色| 亚洲一区二区在| 美女脱光内衣内裤视频久久网站| 午夜激情综合网| 欧美成人一区在线| 国产精品视频免费在线观看| 1024国产精品| 亚洲欧美视频一区| 一区二区三区四区国产| 久久尤物视频| 国产精品久久久久91| 在线精品国产欧美| 亚洲欧美电影院| 在线视频亚洲| 欧美96在线丨欧| 国产欧美一区二区三区在线看蜜臀| 亚洲区一区二| 亚洲国产一二三| 欧美在线亚洲| 欧美亚日韩国产aⅴ精品中极品| 在线观看欧美成人| 欧美亚洲三区| 新片速递亚洲合集欧美合集| 欧美另类在线观看| 伊人伊人伊人久久| 亚洲欧美日韩一区二区在线| 亚洲免费综合| 欧美日本精品| 在线不卡亚洲| 欧美一区二区视频97| 午夜精品视频在线观看| 欧美日韩系列| 亚洲精品国产精品国自产在线 | 久久综合久久美利坚合众国| 国产精品夜夜夜一区二区三区尤| 亚洲三级影院| 亚洲黄色一区| 久久亚洲国产精品一区二区| 国产精品永久免费视频| 国产精品99久久99久久久二8| 9色国产精品| 欧美精品xxxxbbbb| 91久久精品国产91久久性色tv| 久久国产日韩| 久久精品国产一区二区三| 国产精品免费看片| 一区二区三区高清视频在线观看| 99国产精品视频免费观看一公开| 欧美不卡福利| 在线观看国产成人av片| 亚洲福利视频网| 美国成人毛片| 亚洲成人在线网站| 亚洲国产精品综合| 蜜桃av综合| 尹人成人综合网| 亚洲国产日韩欧美在线图片 | 国产欧美日韩精品丝袜高跟鞋| 亚洲一区在线播放| 午夜宅男欧美| 国产欧美日韩精品a在线观看| 亚洲欧美视频一区| 久久精品视频免费观看| 国产一区二区三区在线观看视频 | 一区二区三区久久久| 亚洲在线成人| 国产精品亚洲视频| 性欧美大战久久久久久久免费观看 | 久久精品av麻豆的观看方式| 国产亚洲一区在线播放| 久久精品日韩一区二区三区| 久色成人在线| 亚洲肉体裸体xxxx137| 夜夜夜久久久| 国产精品青草综合久久久久99| 亚洲免费视频一区二区| 久久久久久91香蕉国产| 伊人精品在线| 99国产欧美久久久精品| 欧美午夜精品电影| 亚洲欧美激情诱惑| 久久久91精品国产一区二区三区| 一区久久精品| 洋洋av久久久久久久一区| 国产精品久久久久久久久免费桃花| 亚洲一区二区精品| 久久精品91| 亚洲国产另类 国产精品国产免费| 一本色道久久综合| 国产精品久久二区二区| 欧美一区二区高清在线观看| 免费观看一级特黄欧美大片| 亚洲精品国产精品国自产观看浪潮| 亚洲影音先锋| 狠狠色丁香婷婷综合影院| 亚洲毛片在线免费观看| 国产精品日韩一区二区三区| 亚洲成色777777在线观看影院| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩一区视频| 午夜精品久久久久久久男人的天堂| 久久亚洲捆绑美女| 亚洲精品国产无天堂网2021| 欧美在线亚洲综合一区| 亚洲国产激情| 欧美一二区视频| 亚洲电影免费在线| 亚洲欧美日韩精品久久久| 一区久久精品| 亚洲女同精品视频| 依依成人综合视频| 亚洲专区在线| 在线观看成人一级片| 亚洲免费一区二区| 在线欧美一区| 亚洲欧美视频| 亚洲日本黄色| 久久久久国内| 99精品久久久| 久久精品网址| 国产精品99久久久久久宅男| 农村妇女精品| 香蕉免费一区二区三区在线观看| 欧美黑人国产人伦爽爽爽| 午夜精品www| 欧美日韩亚洲另类|