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

[FPGA經(jīng)驗] FPGA初學者必須讀的一篇文章

發(fā)布時間:2015-9-6 10:01    發(fā)布者:zone

初學Verilog HDL被那個“=”與“<=”整迷糊啦,然后找度娘,一篇文章寫得不錯嘛,不迷糊啦。如下,還迷糊的小伙伴湊個熱鬧吧,file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC738.tmp.png,另外,感謝作者嘍。


首先我們要理解兩種變量類型 Net Type(連線型)Register Type (寄存器型)。(有些參考書上有分為3種類型,這個無關緊要)Net Type(連線型),從名字上理解就是“導線”唄,導線的這頭和導線的另一頭始終是直接連通的,這頭是什么值,那頭就是什么值,所以輸出隨著輸入隨時變化的。連線型中 wire 最常見。
更多詳情可咨詢劉老師:電話18365409359QQ3311615775
Register Type(寄存器型),寄存器就不像普通導線了,它可以把值給存住,你只要給它賦一次值,它都會存住那個值,直到你給它賦一個新的值它才會改變。寄存器型中 reg 最常見。
    最常用到的是 wire 和 reg 這兩種類型,其他的對我們初學者來說一般很少用到,可以暫時跳過,以后慢慢學下去自然會理解。
    注意:wire型變量如果沒有賦予初始值,默認初始值為高阻態(tài)“Z”。
           reg  型變量如果沒有賦予初始值,默認初始值為不定態(tài)“X”。

    在理解這兩種基本的數(shù)據(jù)類型之后,我們來看看verilog語言中的賦值語句。verilog語言中的賦值語句有兩種,一種是持續(xù)賦值語句(assign語句),另一種是過程賦值語句(always語句)。
     持續(xù)賦值語句(assign語句)主要用于對wire型變量的賦值,因為wire(線型)的值不能存住,需要一直給值,所以需要用持續(xù)賦值。
          例如:assign c = a + b;    只要a和b有任意變化,都可以立即反映到c上,也就是說c的值是根據(jù)a,b的值隨時變化的。
     過程賦值語句(always語句)主要用于reg 型變量的賦值 ,因為always語句被執(zhí)行是需要滿足觸發(fā)條件的,所以always過程塊里面的內容不是每時每刻都被執(zhí)行,因此需要將被賦值的對象定義成寄存器類型,以便這個值能被保持住。
    過程賦值又分為 阻塞賦值 “=”  和 非阻塞賦值 “<=” 兩種。這里的非阻塞賦值符號 “<=” 與 “小于等于” 符號相同,他們在不同的語境下表示不同含義,要注意區(qū)分,例如在“if-else”等判斷語句中,一般都表示為“小于等于”。

    接下來對這兩種賦值作具體講解...
     ① 阻塞賦值 “=“ 。 阻塞賦值和我們平時理解的賦值差不多,不用太多解釋,就是按照語句的順序,一句句往下順序執(zhí)行。一個賦值語句執(zhí)行完,然后執(zhí)行下一個賦值語句。
     ② 非阻塞賦值 “<=” 。非阻塞賦值就比較特別了,在同一個always過程塊中,非阻塞賦值語句都是同時并發(fā)執(zhí)行的,并且在過程塊結束時才執(zhí)行賦值操作。也就是說,在同一個always過程塊中,非阻塞賦值語句被執(zhí)行沒有先后順序,在過程快結束時,大家一起被賦值。

     給大家舉一個具體的例子:
module test (clk, a1, a2, b1, b2, c1, c2); // test為module名稱,括號內的是端口列表,包含所有輸入輸出的變量名稱
input clk, a1, a2;          // 定義輸入變量,這里沒有定義位寬,默認為1位寬度
output b1, b2, c1, c2;    // 定義輸出變量,這里沒有定義位寬,默認為1位寬度
reg b1 = 0 , b2 = 0, c1 = 0 , c2 = 0;   // 注意!因為這些變量將會在always過程塊中被賦值,所以必須定義成 reg 型   
// 注意!這里省略了對輸入信號clk, a1, a2 的類型定義,它們默認為1位的wire 型(因為輸入信號是隨時要變化,所以必須用wire型)              
always @ (posedge clk)   // always 用 clk 上升沿觸發(fā)
    begin
        b1 = a1;       // 這里采用的是阻塞賦值
        c1 = b1;
    end

always @ (posedge clk)  // always 用 clk 上升沿觸發(fā)
    begin
        b2 <= a2;    // 這里采用的是非阻塞賦值
        c2 <= b2;
    end   
endmodule     // endmodule 別忘了,與 module 成對使用

仿真輸入值設置圖如下:
我們只需給輸入信號賦值,輸出信號根據(jù)輸入信號的變化而變化。
下面請看用quartus 2 軟件仿真的波形圖


首先請看這兩張圖的區(qū)別,第一張是時序仿真波形圖(timing),黃色標記部分因為延時而產生,第二張圖為功能仿真波形圖(function),不考慮器件的延時。
  在①時刻,第一個時鐘上升沿到來(posedge clk), 兩個always過程塊同時被觸發(fā)(這就是PFGA器件強大的一點,可以并發(fā)執(zhí)行)
    a1,b1,c1采用的是阻塞賦值。阻塞賦值語句順序執(zhí)行,先執(zhí)行 b1 = a1; 由于 a1 此刻的值為 1,所以b1 變?yōu)?1,然后執(zhí)行 c1 = b1;由于b1的值剛才已經(jīng)變成 1 了,所以c1也變成了 1 。
     a2,b2,c2采用的是非阻塞賦值。非阻塞賦值語句并發(fā)執(zhí)行, 也就是說 b2 <= a2; c2 <= b2; 這兩句同時執(zhí)行。由于a2 此刻的值為1,所以 b2 變?yōu)?,與此同時,b2  的當前值也將賦值給 c2 , b2 的當前值是是多少呢? 這里一定要分清楚了,b2 的當前值是 0,并不是 1 ,因為在 b2 還沒有變?yōu)?1  之前,b2 的值就要賦值給 c2 了,所以 c2 的值仍然是 0 。
   直到在②時刻,第二個時鐘上升沿到來,兩個always再一次被同時觸發(fā),這次在執(zhí)行 c2 <= b2; 這條賦值語句時,b2 的當前值為 1 ,所以 c2 才被賦值為 1 。

   大家可以根據(jù)上面的分析方法,自己分析一下在③、④時刻 b1,b2,c1,c2 應該分別為什么值,與波形圖對照著理解一下。
其實verilog語言和 c語言大同小異,比較著來學習,會比較容易......
更多詳情可咨詢劉老師:電話18365409359QQ3311615775

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

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據(jù)著作權人的要求,第一時間更正或刪除。
edu118nn 發(fā)表于 2015-9-10 09:41:48
嵌入式系統(tǒng)實訓課程學習,
讓沒有ARM編程基礎和實際工作經(jīng)驗的大專以上學歷的學員在2到3個月的時間內迅速獲得1-3年的ARM開發(fā)經(jīng)驗,
具備實際ARM開發(fā)的能力,月薪5-10K。想學習嵌入式、Linux、FPGA/單片機等私聊。Q2532176025  13397813997黃!
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 常見深度學習模型介紹及應用培訓教程
  • Microchip第22屆中國技術精英年會上海首站開幕
  • 電動兩輪車設計生態(tài)系統(tǒng)
  • Microchip第22屆中國技術精英年會——采訪篇
  • 貿澤電子(Mouser)專區(qū)
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表