《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > Verilog語言:還真的是人格分裂的語言

Verilog語言:還真的是人格分裂的語言

2018-07-20
關(guān)鍵詞: Verilog

  “人氣腹語術(shù)師天愿在現(xiàn)場披露了被人偶搭檔奪取靈魂的腹語術(shù)師將妻子殺害的表演節(jié)目。天愿真的陷入了多重人格,命令自己殺害妻子和子的人偶的人格出現(xiàn)了。為了不(讓自己)殺害和弟子登川有外遇的妻子,天愿提出委托想要監(jiān)視,然而第二天早上,和子真的被殺害的事件發(fā)生了。天愿坦白很可能是在自己的意識失去的時候殺害的……”(----“真相只有一個”《名偵探柯南》一向是老衲喜歡的動畫片)這個是第806回《腹語師的錯覺》的介紹。

  人有雙重人格,或者叫人格分裂,那么語言呢?Verilog語言還真的是人格分裂的語言。前回書已經(jīng)說到了,不能簡單地把wire類型映射為組合邏輯,同時把reg類型映射為時序邏輯。事實上,這兩個概念會交叉的。也就是說,wire類型極可能被綜合為組合邏輯也可能綜合為時序邏輯,reg類型也是這樣。

  “‘reg’是什么?”最微軟的回答是:注冊表文件。這個自然沒錯,但是違背了“到哪座山,唱哪里歌”的原則。一般的“標準”答案是:寄存器型變量。看看‘reg’,不就是‘register’(寄存器)的縮寫嗎?大多數(shù)中文教材中都是這樣說的。

  下面為了說明白這樁事情,請允許老僧引用IEEE有關(guān)Verilog語言里面的原文:

  “Assignments to a reg are made by procedural assignments (see 6.2 and 9.2). Since the reg holds a value between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level sensitive (i.e., RS and transparent latches) storage elements can be modeled. A reg need not represent a hardware storage element since it can also be used to represent combinatorial logic.”

  為了強調(diào),表1里面給出了wire、reg類型和組合邏輯、時序邏輯之間的映射關(guān)系。

  表1 wire、reg類型和組合邏輯、時序邏輯之間的映射關(guān)系

  wire

  reg

  組合邏輯

  可

  可

  時序邏輯

  可

  可

  可見reg是“雙面間諜”的工作性質(zhì),為了能夠“左右逢源”,自然用法要比wire來的復(fù)雜。類型wire被綜合為時序邏輯一般還真是寫錯了,不必細表。

  1. 電平觸發(fā),組合實現(xiàn)

  和reg“孟不離焦,焦不離孟”的是關(guān)鍵詞always,這個要記清楚。人家wire和assign是夫妻,reg和always是一對,千萬不要搞混了,這不是能拉郎配的季節(jié)。

  “always”的語法結(jié)構(gòu)是:

  always @(sensitive_tabel)

  其中,sensitive_tabel稱作敏感列表,其中包含always內(nèi)部操作的一個或者多個觸發(fā)條件。字符“@”發(fā)音是“艾特”(at),大伙兒發(fā)電子郵件(e-mail)的時候常用,不羅嗦。

  正如上面提到的、標準立面的說法可以是邊沿敏感和電平敏感兩種。對于組合邏輯電路,這個敏感列表里面所有條件均為電平敏感。邏輯上,當(dāng)敏感列表里面的條件符合的時候,always內(nèi)部的操作可以進行。但是,很多邏輯上可行的代碼,由于沒有實際電路的支持,是無法實現(xiàn)的。

  在Verilog語言95版本里面,電平觸發(fā)的敏感列表的寫法是

  triger1 or triger2 or triger3……

  其中,triger1等為觸發(fā)信號。當(dāng)觸發(fā)信號電平變化時,說明敏感列表里面條件符合。如果觸發(fā)信號是向量,則其中一個比特的信號變化,就認為信號電平有變化。到了Verilog 2001版本,這個寫法被更加簡化了:“,”和“or”都可以用來分割敏感事件;并且,可以用“*”代表所有輸入信號,這可以防止遺漏。例1給出了一些符合語法的always的例子。

  【例1】always與敏感列表

  always @ (triger1 or triger2 or triger3)    //Version 95 and Version 2001

  always @ (triger1 , triger2 , triger3)    //Version 2001

  always @ (*)    //Version 2001

  具有完全電平敏感列表的always模塊,總叫人覺得就是組合邏輯了。再次強調(diào)數(shù)字電路是并行工作的,注意不要用“執(zhí)行”這個詞,不準確。對應(yīng)的所有assign以及always帶領(lǐng)的快都是并行的,其在代碼中前后順序與輸出結(jié)果無關(guān)。也就是說例2里面的兩段代碼是等效的。代碼中,敏感列表sensitive_table1和sensitive_table2對應(yīng)操作Operation_A和操作Operation_B。

  【例2】always所帶操作順序與輸出結(jié)果無關(guān)

  always @(sensitive_table1)

  Operation_A

  always @( sensitive_table2)

  Operation_B

  always @( sensitive_table2)

  Operation_B

  always @(sensitive_table1)

  Operation_A

  理論上,assign后面只有一行,對于這個并行工作的理解不難,不會產(chǎn)生誤解。到了always這里,一般其后的代碼就有很多行了,一不注意就會出錯。

  

  2. 條件判斷,分枝多多

  “用C語言的標準評價Verilog,如同用水果的標準評價蜜餞。”,但是他們的確很多寫法有類似,這是很容易誤導(dǎo)學(xué)習(xí)者的地方。

  前文書關(guān)于“? :”選擇操作哪里介紹過,選擇與分枝在一般系統(tǒng)中是不可少的。那里介紹的代碼方法,顯然會產(chǎn)生閱讀困難----尤其是在條件比較多的時候。為了改善這一問題,也同時可以更加符合大家以前的習(xí)慣,這一講書老朽給貴客介紹“if”和“case”這兩位大家熟悉的陌生人。

  先看眼里的代碼,條件語句if的形式有如表2中的三種。其中,condition等表示選擇的條件,operation等表示對應(yīng)的操作。請注意,這里的表達式“選擇”,目的是和電路對應(yīng),不是故意和別人不一樣的嘩眾取寵。

  表2條件語句if的格式

  無分枝

  單級分枝

  多級分枝

  形式

  if (condition )

  begin

  operations

  end

  if (condition )

  begin

  operations_1

  end

  else

  begin

  operations_2

  end

  if (condition_1 )

  begin

  operations_1

  end

  else if (condition_2 )

  begin

  operations_2

  end

  else if……

  ……

  begin

  operations_m

  end

  對應(yīng)電路

  時序電路

  時序電路

  組合電路

  時序電路

  組合電路

  表.2中“對應(yīng)電路”一行也請施主們注意,if語句中條件的所有路徑覆蓋不全面,可能會產(chǎn)生時序電路的。對于reg類型的變量,需要滿足“條件不滿足的時候,保持原值”;同時,組合電路不可“自賦值”(也就是類似“a <= a”的形式)。當(dāng)需要“保持”的時候,純組合電路是無法滿足的。所以,綜合器會引入“鎖存器”。不是綜合器自作主張,這是代碼的要求。“天作孽猶可恕,自作孽不可活”,只能怪你自己了,哭吧!這個對應(yīng)的器件是鎖存器,不是這里的重點,會在以后介紹。這里要說的是:要產(chǎn)生組合邏輯,if的條件路徑必須全覆蓋。

  if語句中條件的所有路徑覆蓋不全面,可能會產(chǎn)生時序電路的。這個對應(yīng)的器件是鎖存器,不是這里的重點,以后介紹。這里要說的是:要產(chǎn)生組合邏輯,if的條件路徑必須全覆蓋。

  例3是一個單級條件語句if應(yīng)用的例子,其功能是求有符號數(shù)絕對值。其中,輸入為8比特有符號數(shù),編碼方式為補碼;輸出是輸入數(shù)值的絕對值。具體算法是:

  【例3】絕對值運算模塊

  module abs

  (

  input[7:0] signed_value,

  output reg[6:0] result

  );

  //Definition for Variables in the module

  //Load other module(s)

  //Logical

  always @(signed_value)

  begin

  if ( signed_value[7])

  //Negative number input

  begin

  result <= (~signed_value[6:0]) + 7'h01;

  end

  else

  //Positive number or zero input

  begin

  result <= signed_value[6:0];

  end

  end

  endmodule

 

  3. 多種情況,并列判決

  在條件很多的時候,用if語句來寫還是很麻煩的,搞不好就是是一個條件路徑覆蓋不完全。這個時候,可以選擇case套餐。case語句是一種多分支選擇語句, Verilog語言提供的case語句直接處理多分支選擇。多分支的case有三種形式,如表3所示。

  表3條件語句case的形式

  case

  casex

  casez

  比較方式

  敏感表達式與各項值之間的比較,是一種全等比較

  如果分支表達式某些位的值為高阻z,那么對這些位的比較就會忽略,不予考慮,而只關(guān)注其他位的比較結(jié)果。

  casez會把z/?匹配成任意,也會把任意匹配成z/?

  在casex語句中,則把這種處理方式進一步擴展到對x的處理,即如果比較雙方有一方的某些位的值是z或x,那么這些位的比較就不予考慮。

  casex會把z/?x匹配成任意,也會把任意匹配成z/?/x,即直接忽略z/?/x

  形式

  case (variable)

  costant_1:

  begin

  operations_1

  end

  costant_2:

  begin

  operations_2

  end

  ……

  default:

  begin

  operations_m

  end

  endcase

  case (variable)

  costant_1:

  begin

  operations_1

  end

  costant_2:

  begin

  operations_2

  end

  ……

  default:

  begin

  operations_m

  end

  endcase

  case (variable)

  costant_1:

  begin

  operations_1

  end

  costant_2:

  begin

  operations_2

  end

  ……

  default:

  begin

  operations_m

  end

  endcase

  constant項

  各個constant項為確定寬度的常數(shù)值,不包含x和z;

  可以用“?”表示不關(guān)心該位數(shù)值

  各個constant項為確定寬度的常數(shù)值,可包含x但不能包含z

  各個constant項為確定寬度的常數(shù)值,可包含z但不能包含z

  constant例子

  3’b000:3比特寬度全0;

  3’b0?0:3比特寬度第二比特不關(guān)心,其他比特為0

  3’b000:3比特寬度全0;

  3’b0?0:3比特寬度第二比特不關(guān)心,其他比特為0;

  3’b00x:3比特寬度最低比特為x,其他比特為0

  3’b000:3比特寬度全0;

  3’b0?0:3比特寬度第二比特不關(guān)心,其他比特為0;

  3’b00z:3比特寬度最低比特為不關(guān)心,其他比特為0

  可綜合性

  可綜合

  依賴綜合軟件

  依賴綜合軟件

  case括弧內(nèi)的變量稱為控制表達式,case分支項中的常數(shù)稱為分支表達式。控制表達式通常表示為控制信號的某些位,分支表達式則用這些控制信號的具體狀態(tài)值來表示,因此分支表達式又可以稱為常量表達式。當(dāng)控制表達式的值與分支表達式的值相等時,就執(zhí)行分支表達式后面的語句。如果所有的分支表達式的值都沒有與控制表達式的值相匹配的,就執(zhí)行default后面的語句。

  default項可有可無,一個case語句里只能有一個default項。 當(dāng)分支表達式可以覆蓋控制表達式全部分枝路徑時,default可以不寫。但是,有時候這個全覆蓋不是那么容易看出來的,所以建議最好寫上default,哪怕有冗余這個default永遠不可能被實現(xiàn)。也請大家放心,這種冗余綜合軟件會大伙兒去掉的,不必擔(dān)心浪費電路資源。

  每一個case分項的分支表達式的值必須互不相同,否則就會出現(xiàn)矛盾現(xiàn)象(對表達式的同一個值,有多種執(zhí)行方案)。

  執(zhí)行完case分項后的語句,則跳出該case語句結(jié)構(gòu),終止case語句的執(zhí)行。(精通C語言的大蝦們請?zhí)貏e注意這點,這里case操作執(zhí)行完之后不必寫break了。)

  在用case語句表達式進行比較的過程中,只有當(dāng)信號的對應(yīng)位的值能明確進行比較時,比較才能成功,因此要詳細說明case分項的分支表達式的值。

  case語句的所有表達式的值的位寬必須相等,只有這樣控制表達式和分支表達式才能進行對應(yīng)位的比較。一個經(jīng)常犯的錯誤是用'bx、'bz 來替代n'bx、n'bz,這樣寫是不對的,因為信號x、z的缺省寬度是機器的字節(jié)寬度,通常是32位(此處 n 是case控制表達式的位寬)。

  當(dāng)分支表達式不完全覆蓋控制表達式全部分枝路徑時,您老有偷懶沒有寫default的情況下,可能產(chǎn)生時序邏輯的鎖存器的,這點和條件if語句類似。例4是一個例子,說明了default的重要性。但是,圖1中的“l(fā)d”是鎖存器已經(jīng)是時序電路的元件了,超越了本章的范圍。

  【例4】case語句條件覆蓋不全產(chǎn)生會綜合出鎖存器

  代碼1:組合邏輯電路寫法

  module case_full

  (

  input[7:0] number,

  input[1:0] select,

  output reg[7:0] result

  );

  //Load other module(s)

  //Definition for Variables in the module

  //Logical

  always @(*)

  begin

  case (select)

  2'b00:

  begin

  result <= number + 8'b0000_0001;

  end

  2'b01:

  begin

  result <= number;

  end

  2'b10:

  begin

  result <= number - 8'b0000_0001;

  end

  default:

  begin

  result <= 8'b0000_0000;

  end

  endcase

  end

  endmodule

  圖1例4綜合出的電路圖(全部為組合邏輯)

 

1.jpg


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产欧美日韩三区| 久久激情一区| 国产欧美精品xxxx另类| 欧美88av| 亚洲欧洲在线播放| 亚洲国产成人高清精品| 美日韩精品免费| 99精品视频免费观看视频| 亚洲日本成人| 国产精品v欧美精品v日韩| 亚洲视频国产视频| 香蕉免费一区二区三区在线观看| 国产欧美一级| 国产精品日韩一区| 久久五月天婷婷| 亚洲裸体视频| 亚洲午夜电影网| 国产亚洲福利| 欧美激情国产高清| 亚洲一区二区三区精品视频| 亚洲欧美精品在线| 在线观看一区二区精品视频| 欧美激情在线播放| 午夜精品三级视频福利| 亚洲电影专区| 最近中文字幕日韩精品| 亚洲国产欧美日韩精品| 国产精品美女久久久浪潮软件 | 欧美精品综合| 午夜精品久久久久久久白皮肤 | 国产精品久久久久影院亚瑟| 欧美午夜一区二区| 国产精品视频免费观看www| 国产精品女主播在线观看| 国产精品人人做人人爽人人添| 国产精品五月天| 国产午夜精品福利| 激情校园亚洲| 欧美日韩一区成人| 欧美一区二区三区免费看| 日韩视频一区二区三区在线播放免费观看 | 亚洲国产成人在线| 亚洲精品资源| 亚洲一区二区在线播放| 欧美在线日韩| 亚洲午夜女主播在线直播| 欧美一区二区三区四区在线观看| 亚洲激情国产| 夜夜夜精品看看| 雨宫琴音一区二区在线| 亚洲国产福利在线| 日韩网站在线看片你懂的| 国内免费精品永久在线视频| 欧美视频一区二区三区四区| 欧美aa国产视频| 欧美日韩国产成人精品| 噜噜噜久久亚洲精品国产品小说| 午夜精品久久99蜜桃的功能介绍| 久久精品一级爱片| 亚洲欧美国产高清| 在线视频你懂得一区二区三区| 久久精品一区二区三区四区| 亚洲综合不卡| 在线综合视频| 日韩视频免费观看高清完整版| 尤物精品在线| 中国成人亚色综合网站| 久久av在线| 欧美亚洲免费在线| 亚洲日韩成人| 亚洲国内在线| 欧美一区日韩一区| 亚洲精品之草原avav久久| 香蕉成人伊视频在线观看| 亚洲欧美日韩在线播放| 久久免费黄色| 久久久精品一区二区三区| 欧美国产精品| 国产深夜精品福利| 亚洲美女视频网| 欧美在线国产| 亚洲一区二区在线播放| 欧美成人精品福利| 美女999久久久精品视频| 欧美性jizz18性欧美| 狠色狠色综合久久| 狠狠久久婷婷| 亚洲一二三区精品| 亚洲一区二区三区乱码aⅴ| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲欧美韩国| 欧美精选一区| 在线观看日韩欧美| 午夜国产精品视频| 欧美一区二区视频在线观看2020| 99视频有精品| 欧美91大片| 激情亚洲网站| 久久gogo国模啪啪人体图| 午夜精品一区二区在线观看| 欧美日本一区二区高清播放视频| 激情久久久久久久| 亚洲欧美国产不卡| 亚洲伊人伊色伊影伊综合网 | 最新国产成人av网站网址麻豆 | 蜜臀a∨国产成人精品 | 一本色道久久综合狠狠躁的推荐| 亚洲激情综合| 另类av导航| 国产综合色产| 欧美亚洲午夜视频在线观看| 小黄鸭精品aⅴ导航网站入口| 欧美午夜性色大片在线观看| 亚洲精品系列| 一区二区免费在线播放| 亚洲精品在线电影| 免费欧美视频| 一区二区视频免费完整版观看| 午夜精品美女久久久久av福利| 午夜激情综合网| 国产精品久99| 狠狠爱综合网| 久久国产婷婷国产香蕉| 欧美综合国产精品久久丁香| 国产欧美视频一区二区三区| 午夜视频在线观看一区二区三区| 欧美亚洲日本网站| 国产老肥熟一区二区三区| 激情五月综合色婷婷一区二区| 欧美专区第一页| 久久久久一区二区三区四区| 国产午夜精品在线观看| 欧美一区二区三区日韩视频| 久久精品视频在线| 国内精品视频666| 亚洲大胆人体在线| 亚洲一区二区在线免费观看视频| 欧美日韩国产一区| 一区二区三区四区国产精品| 亚洲欧洲av一区二区| 国产欧美日韩视频一区二区三区| 欧美亚洲自偷自偷| 久久久久久久精| 在线观看视频亚洲| 亚洲毛片在线| 欧美午夜电影在线| 亚洲欧美成aⅴ人在线观看| 欧美一区二区在线观看| 国产情人综合久久777777| 久久精品亚洲精品| 欧美黄色视屏| 99精品久久久| 欧美一级久久久| 国模私拍一区二区三区| 91久久黄色| 欧美视频在线观看一区二区| 亚洲欧美日韩精品久久久久| 久久久午夜精品| 亚洲人成毛片在线播放| 亚洲永久视频| 国外视频精品毛片| 日韩一区二区久久| 国产麻豆日韩欧美久久| 亚洲第一网站免费视频| 欧美精品在线一区二区| 亚洲综合好骚| 美女脱光内衣内裤视频久久网站| 亚洲理伦在线| 久久久.com| 日韩网站免费观看| 久久精品国产v日韩v亚洲| 亚洲激情校园春色| 亚洲美女淫视频| 久久精品二区三区| 欧美理论电影在线观看| 亚洲免费在线视频| 你懂的网址国产 欧美| 国产精品99久久久久久久女警| 久久久无码精品亚洲日韩按摩| 日韩一级黄色大片| 久久久久久久久岛国免费| 日韩视频在线免费| 久久久久久有精品国产| 亚洲毛片视频| 久久久人成影片一区二区三区| 一本久久精品一区二区| 久久婷婷综合激情| 亚洲一区二区三区中文字幕在线| 久久久久久久一区二区| 99日韩精品| 欧美a级一区| 亚洲欧美日韩国产成人| 欧美激情精品久久久久久久变态 | 一区二区三区偷拍| 久久综合伊人77777麻豆| 一区二区三区蜜桃网| 美腿丝袜亚洲色图| 午夜国产精品视频| 欧美亚一区二区| 亚洲美女福利视频网站|