国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

明德揚FPGA連載課程第一階段第三章VERILOG(2)

發布時間:2018-11-6 09:19    發布者:luckyb1
3.2 數字3.2.1數字表示方式
      在Verilog中的數字表示方式,最常用的格式是:<位寬>’<基數><數值>,如,4’b1011。
      位寬:描述常量所含位數的十進制整數,是可選項。4’b1011中的4就是位寬。通俗理解就是4根線。如果沒有這一項,可以從常量的值推斷出。例如’b1011可知位寬是4;’b10010可推斷出位寬為5。
       基數:表示數值是多少進制。可以是b,B,d,D,o,O,h或者H,分別表示二進制、十進制、八進制和十六進制。如果沒有此項,則缺省默認為十進制數。
      例如,二進制的4’b1011,可以寫成十進制的4’d11,也可以寫成十六進制的4’hb,或者八進制的4’o13,還可以不寫基數直接寫成11。不管怎么樣,只要二進數相同,寫成十進制、八進制和十六進制,都是同樣的數字。
       數值:是由基數所決定的表示常量真實值的一串ASCII碼。如果基數定義為 b或B,數值可以是0,1,x,X,z或Z。如果基數定義為 o或O,數值還可以是2,3,4,5,6,7。如果基數定義為 h或H,數值還可以是8,9,a,b,c,d,e,f,A,B,C,D,E,F。對于基數為d或者D的情況,數值符可以是任意的十進制數:0到9。但不可以是x或z。
      例如,4’b12是錯誤的,因為b表示二進制,數值只能是0、1、x或者z,不有是2。
      32’h12等同于32’h00000012,也就是數值未寫完整時,高位補0。


3.2.2二進制是基礎
      在數字電路中,如果芯片A給芯片B傳遞數據,例如傳遞0或者1信息。可以將芯片A和芯片B,通過一個管腳進行相連。然后由芯片A控制該管腳為高電平或者低電平,通過高低電平來表示0和1。例如,芯片B檢測到該管腳為低電平時,表示收到0;當芯片B檢測到該管腳為高電平時,表示收到1。




      如果用低電平表示收到1,用高電平表示收到0,這可不可以呢?當然可以,只要芯片A和芯片B事先協定。芯片A要發數字1時,會將該管腳置為低電平。芯片B檢測到該管腳為低電平,知道收到了數字1,通信完成。





       一個管腳擁有高低電平兩種狀態,可以分別表示數字0和1兩種情況。如果芯片A要發數字0、1、2、3給芯片B,那該怎么辦呢?
       可以讓芯片A和芯片B連接兩根管腳,即兩條線,a和b。當兩條線都為低電平時,表示發送數字0;當a為高電平,b為低電平時,表示發送數字1;當a為低電平,b為高電平時,表示發送數字2;當兩條線都是高電平時,表示數字3。





       按照同樣的道理,芯片A要發送數據4,5,6,7給芯片B的時候,只要再添加一條線就可以了。三根線一共有8種狀態,可以表示8個數字。
      綜上所述,我們可能通過線的不同電平狀態,表示不同的含義。有多少個不同狀態,就可以表示多少個數字。


       如果芯片A要發送+1,-1,0,+2等數字給芯片B,這里有正負了,那又該如何表示呢?參考前面的思想,線的高低電平表示的含義,是由芯片雙方向事先約定好的。既然是這樣,那么我們拿一根線出來,例如低電平表示正數,高電平表示負數。



       上面就是三根線,我們用線c表示正負,0表示正數,1表示負數。用線a和線b表示數值。

       3’b111,可以解釋為十進制數7,也可以解釋為有符號數原碼“-3”,也可以解釋為有符號數補碼“-1”,這取決于工程師對二進制數的定義。只要這個定義不影響到電路之間的通信那就絕對不會有問題。
       所以,數字中的“0”和“1”不僅可以表示含義,也可以表示其他意義,如正負符號等。同樣的道理,

       在數字電路中,二進制數是其他如八進制、十進制、十六進制、有符號數、無符號數、小數等的根本。在FPGA設計中,不清楚小數、有符號數的計算方法,最根本的原因是不清楚這些數據所對應的二進制值。只要理解了它所對應的二進制值,很多問題都可以解決。
      例如,有初學者經常問,FPGA中如何實現小數計算,如“0.5+0.25”這個功能。
首先,眾所周知的,0.5+0.25的結果為0.75。
      其次,我們可以考慮,0.5、0.25和0.75用二進制該如何表示?這取決于工程師的做法,因為這種表示方法有很多種,例如定點小數,浮點小數,甚至如前面所討論,用幾根線自行來定義,只要能正常通信,那就絕對沒有問題。
      假設,某工程師用三根線,自行定義了二進制值所表示的小數值。



      為了說明二進制值的意義是可以隨便定義的,我特意將數字順序打亂。當然,有讀者可能說為什么只有這幾種小數呢?這是因為我假定本系統就只有這幾種數字,如果想表示更多數字,那就增加線就行了。
      有了上面定義之后,要實現“0.5+0.25”就很容易了,其實就是3’b001和3’b100“相加”,期望得到3’b010。如果我們直接使用3’b001 + 3’b100,結果為“101”了,不是想要的結果。那怎么辦呢?可以這么寫:



     當然,這是其中一種寫法。總之,只要能實現所對應的功能,結果正確就可以。
有讀者問,按上面的表格0.1+0.8應該為0.9,但上面沒有0.9的表示。這個其實是設計者這個表格定義有缺陷,或者設計者認為不會出現這個情況吧。總之,筆者要表達的是,只要定義好所對應的二進制數,很多功能是很容易設計的。

      當然,實際的工程中,我們通常會遵守約定成俗的做法,沒必要自己搞得另類。例如下面是常用的定點小數的定義。


      現在要實現0+0.5=0.5,也就是3’b000和3’b100相加,期望能得到3’b100。我們發現直接用二進制3’b000+3’b100就可以得到3’b100。
      要實現0.125+0.75=0.8725,也就是3’b001和3’b110相加,期望能得到3’b111。我們發現直接用二進制3’b001+3’b110就可以得到3’b111。  
      要0.5+0.75=1.25,這個1.25已經超出了表示范圍,要不就增加信號位寬,要不只能表示小數位。如果只是表示小數位,那結果就是0.25。也就是3’b100和3’b110相加,期望得到3’b010。我們發現3’b100 + 3’b110 = 4’b1010,用3位表示就是3’b010,也就是0.25了。
      綜上所述,對于定點小數的計算很簡單,就是直接相加。

3.2.3不定態
      前面講過,數字電路只有高電平和低電平,分別表示1和0。但代碼中經常能看到x和z,如1’bx,1’bz。那么這個x和z是什么電平呢?答案是沒有實際的電平來對應。這個x和z是更多地用來表示設計者的意圖或者用于仿真目的,告訴仿真器和綜合器怎么解釋這段代碼。
      X態,稱之為不定態,設計者常用于判斷條件,用于告訴綜合工具,設計者不關心它的電平是多少,是0還是1都可以。



上面的例子,條件是din==4’b10x0,這個條件等價于din==4’b1000||din==4’b1010,其中“||”是“或”符號。


      明德揚則建議,直接寫成din==4’b1000||din==4’b1010,好于寫成“din==4’b10x0”,直接簡單明了。
      仿真的時候,有些信號產生了不定態,那么設計者就要認真分析,這個不定態是不是應該的。如果真的不關心它是0還是1,那么可以不解決。但明德揚建議,所有信號都不應該處于不定態,是0還是1,寫清楚,不要給設計添加“思考”的麻煩。
3.2.4高阻態
      Z態,一般稱之為高阻態,表示設計者不驅動這個信號(既不給0也不給1),通常用于三態門接口當中。


      上圖就是三態總線的應用案例。圖中的連接總線對于CPU和FPGA來說,既當作輸入又當作輸出,是雙向接口。一般的硬件電路中,會將該線接上一個上拉電阻(弱上拉)或下拉電阻(弱下拉)。
      當CPU和FPGA都不驅動該總線時,A點保持為高電平。當FPGA不驅動該總線,CPU驅動該總線時,A點的值就由CPU決定。當CPU不驅動該總線,FPGA驅動該總線時,A點的值就由FPGA決定。FPGA和CPU不能同時驅動該總線,否則A的電平就不確定了。通常FPGA和CPU何時驅動總線,是按協議事先協商好的。


      上圖是典型的I2C的時序。I2C的總線SDA就是一個三態信號。I2C協議已規定好上面的時間中,哪段時間是由主設備驅動,哪段時間是由從設備驅動,雙方都要遵守協議,不能存在同時驅動的情況。

      那么FPGA在設計中,是如何做到“不驅動”這一行為呢?這是因為FPGA內部有三態門。



      三態門是一個硬件,上圖是它的典型結構。三態門有四個接口,例如上圖中的寫使能wr_en、寫數據wr_data、讀數據rd_data和與外面器件相連的三態信號data。
      注意寫使能信號,當該信號有效時,三態門會將wr_data的值賦給三態線data,此時data的值由wr_data決定,當wr_data為0時,data值就為0;當wr_data為1時,data值就為1。
      當寫使能信號無效時,則不管wr_data值是多少,都不會對外面的data值有影響,也就是不驅動。
      那么在Verilog中,是通過如下兩行代碼來描述這一功能的。



      綜合器看到這兩行代碼,就知道要綜合成三態門了。
      這個高阻z的作用就在于這里。而且注意到,硬件上用三態線是為了減少管腳,而在FPGA內部沒有必要減少連線,所以使用三態信號是沒有意義的。
      也就是說,明德揚的設計建議,FPGA內部不要使用高阻態“z”,沒有必要給自己添加“思考”的麻煩。當然,使用了也不會報錯,也能實現功能。
      總結一點,高阻態“z”是表示“不驅動總線”這個行為,實際上數字電路就是高電平或者低電平,不存在其他電平的情況。

3.2 數據類型
      Verilog HDL的信號類型有很多種,但主要包括兩種數據類型:線網類型(net type) 和寄存器類型(reg type)。明德揚的設計,也是只會使用這兩個類型。

3.2.1線網類型wire
      線網類型用于對結構化器件之間的物理連線的建模。如器件的管腳,內部器件如與門的輸出等。以上面的加法器為例,輸入信號A,B是由外部器件所驅動,異或門X1的輸出S1是與異或門X2輸入腳相連的物理連接線,它由異或門X1所驅動。
      由于線網類型代表的是物理連接線,因此它不存貯邏輯值。必須由器件所驅動。通常由assign 進行賦值。如 assign  A =  B ^ C;

      wire 類型定義語法如下:
      wire [msb: lsb] wire1, wire2, . . .,wireN;
Ø  msb 和lsb 定義了范圍,表示了位寬。例如[7:0]是8位位寬,也就是可以表示成8’b0至8’b1111_1111;
Ø  msb和lsb必須為常數值;
Ø  如果沒有定義范圍,缺省值為1位;
Ø  信號沒有定義數據類型時,缺省為wire 類型。
Ø  對數組類型,請按降序方式,如[7:0] ;不要寫成[0:7]。

      wire [3:0]   Sat; // S a t 為4 位線型信號
      wire Cnt; //1 位線型信號
      wire [0:31]   Kisp, Pisp, Lisp ;// Kisp, Pisp, Lisp 都是32位的線型信號,不建議這樣定義。

3.3.2寄存器類型reg
      reg 是最常用的寄存器類型,寄存器類型通常用于對存儲單元的描述,如D型觸發器、ROM 等。存儲器類型的信號當在某種觸發機制下分配了一個值,在分配下一個值之時保留原值。但必須注意的是,reg 類型的變量,不一定是存儲單元,如在always 語句中進行描述的必須用reg 類型的變量。
      reg 類型定義語法如下:
      reg  [msb: lsb] reg1, reg2, . . . r e g N;
Ø  msb 和lsb 定義了范圍,表示了位寬。例如[7:0]是8位位寬,也就是可以表示成8’b0至8’b1111_1111;
Ø  msb和lsb必須為常數值;
Ø  如果沒有定義范圍,缺省值為1位;
Ø  信號沒有定義數據類型時,缺省為wire 類型,不是reg型。
Ø  對數組類型,請按降序方式,如[7:0] ;不要寫成[0:7]。

例如:
reg [3:0]   Sat; // S a t 為4 位寄存器。
reg Cnt; //1 位寄存器。
reg [1:32]  Kisp, Pisp, Lisp ;

3.3.3Wire和reg定義的場合區分
      Reg型信號不一定生成寄存器。那么什么時候使用wire類型,什么時候用reg類型,明德揚總結出一套方法:在本模塊中,使用always設計的信號都定義為reg型;其他都用wire型。



       上面代碼中,cnt1是用always設計的,所以要用reg型。Add_cnt1和end_cnt不是由always產生的,所以定義為wire型。



      上面代碼中,x是用always設計的,所以要定義為reg型。注意,實際的電路中,x不是寄存器,但我們仍然定義為reg型。
      上面是例化的代碼,其中df是例化模塊的輸出。由于df不是由always產生的,而是例化產生的,所以要定義成wire型。
      注:(本博客連載的內容將出版成圖書,并將錄制視頻,免費公開學習,歡迎大家留意。本連載前面是基礎部分,與一般教材無異,后面是項目實踐,是本連載的特色。如果你有一定的基礎(能看懂verilog代碼即可),那么可跳過前面部分,直接學習后面的項目實踐。
      項目實踐將有16個,從基礎的閃爍燈開始,到最后是信號處理的項目,如信號發生器、FIR濾波器、插值濾波器和AD采集等。
      本連載學習效果:不難看能懂代碼,還能知道每一行代碼怎么寫,怎么設計


本文地址:http://m.4huy16.com/thread-549585-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 電動兩輪車設計生態系統
  • 常見深度學習模型介紹及應用培訓教程
  • Microchip第22屆中國技術精英年會——采訪篇
  • 技術熱潮席卷三城,2025 Microchip中國技術精英年會圓滿收官!
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表