久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2982|回復: 0
打印 上一主題 下一主題
收起左側

Verilog數字系統設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:104287 發表于 2016-1-30 03:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
個人學習筆記,不喜勿噴。

緒論:
1.計算:算法和數據結構、編程語言、體系結構、軟件、硬件設計方法。
2.算法:解決特定問題的有序步驟。
3.數據結構:解決特定問題的相應模型。
4.C程序是一行接一行依次執行的,屬于順序結構;而Verilog描述的硬件是可以在同一時間同時運行的,屬于并行結構。


第一部分:Verilog數字設計基礎


基本概念:
1.元件的輸出口都規定在第一個端口;
2.#1表示延時1個時間單位;
3.并行性,層次結構性、可綜合性、測試平臺;
4.實例化或實例引用;
5.verilog程序由模塊構成。每個模塊的內容都是位于module和endmodule兩個語句之間。每個模塊實現特定的功能;
6.模塊是可以進行層次嵌套的;
7.如果每個模塊都是可以綜合的,則通過綜合工具可以把他們的功能描述全部轉換為最基本的邏輯單元描述,最后可以用一個上層模塊通過實例引用把這些模塊連接起來,把他們整合成一個很大的邏輯系統;
8.模塊分為兩種:一種是為了讓模塊最終生成電路的結構,另一種只是為了測試所設計電路的邏輯功能是否正確;
9.每個模塊要進行端口定義,并說明輸入口、輸出口,然后對模塊的功能進行描述;
10.除了endmodule語句外,每個語句和數據定義的最后必須用分號。
11.注釋:用//和/**/

模塊的結構、數據類型、變量和基本運算符號:
1.模塊中所有過程塊、連續賦值語句、實例引用都是并行的;
2.他們表示的是一種通過變量名互相連接的關系;
3.同一模塊中各個過程塊、各條連續賦值語句和各條實例引用語句這三者出現的先后次序沒有關系;
4.只有連續賦值語句(assign)和實例引用語句可以獨立于過程塊而存在于模塊的功能定義部分;
5.被實例引用的模塊,其端口可以通過不同名的連線或寄存器類型變量連接到別的模塊相應的輸出、輸入信號端;
6.在always模塊內被賦值的每一個信號必須定義成reg型。
7.模塊的端口定義:
    模塊名(連接端口1信號名,連接端口2信號名,連接端口3信號名,......);
    模塊名(.端口1名(連接信號1名),.端口2名(連接信號2名),......);
8.輸入口 input[信號位寬-1:0]端口名1;
   輸出口output[信號位寬-1:0]端口名1;
   輸入/輸出口inout[信號位寬-1:0]端口名1;
   IO說明也可以寫在端口聲明語句中;
9.內部信號說明:
    reg [width-1:0] R變量1,R變量2...;
    wire[width-1:0] W變量1,W變量2...;
10.功能定義:用assign聲明語句;用實例元件;用always塊;
11.數字的表達方式:<位寬><進制><數字>;
12.X不定值,Z高阻值;
13.參數型常數經常用于定義延遲時間和變量寬度;
14.wire變量用來表示單個門驅動或連續賦值語句驅動的網絡型數據,常用來表示以assign 關鍵字指定的組合邏輯信號;tir變量用來表示多驅動器驅動的網絡型數據;
15.reg型變量是數據存儲單元的抽象,其作用與改變觸發器存儲的值相當;常用來表示always模塊內的指定信號,常代表觸發器;在always模塊內被賦值的每一個信號都必須定義為reg型;
16.Verilog中沒有多維數組存在;用memory型變量說明;

運算符、賦值語句和結構說明語句:
1.位拼接運算符{},用一個信號名來表示由多位組成的復雜信號,其中每個功能信號可以有自己獨立的名字和位寬;
2.阻塞語句有先有后;非阻塞語句在begin end之間的所有非阻塞語句都在同一時刻被賦值;
3.縮減運算符為單目運算符,第一步將操作數的第1位與第2位進行或、與、非運算;第2步將運算結果與第3位進行或、與、非運算,以此類推,直至最后一位。
4.非阻塞語句所賦的變量值不能立即就為下面的語句所用,塊結束以后才能完成這次賦值操作,而所賦的變量值是上一次賦值所得到的,在編寫可綜合的時序邏輯模塊時,這是最常用的賦值方法;
5.阻塞語句的賦值語句執行完成后,塊才結束,在賦值語句執行完后立刻就改變,在時序邏輯中使用可能會產生意想不到的結果;
6. begin end語句用來表示順序語句的,每條語句的延時時間是相對于前一條語句的仿真時間而言的;fork join語句用來標識并行執行的語句,塊內每條語句的延時時間是相對于程序流程控制進入到塊內的仿真時間而言的;

條件語句、循環語句、塊語句與生成語句:
1.條件語句必須在過程塊語句中使用。所謂的過程塊語句是指initial和always語句引導的執行語句集合;
2.else總是與它最近的if配對;
3.casez用來處理不用考慮高阻值z的比較過程;casex則將高阻值z和不定值都視為不必關心的情況;
4.在always塊內,如果在給定條件下變量沒有賦值,這個變量將保持原值,也就是會生成一個鎖存器;
5.forever語句連續執行的語句,用于產生周期性的波形作為仿真測試信號且必須寫在initial塊中;
6.repeat語句連續執行一條語句N次;
7.生成塊:生成語句可以動態地生成Verilog代碼,這一聲明語句方便了參數化模塊的生成。當對矢量中的多個位進行重復操作時,或當進行多個模塊的實例引用的重復操作時,或在根據參數的定義來確定程序中是否應該包含某段Verilog代碼時,使用生成語句能夠大大簡化程序的編寫過程;
    生成語句能夠控制變量的聲明、任務或函數的調用,還能對實例引用進行全面的控制。編寫代碼時必須在模塊中說明生成的實例范圍,關鍵字generate endgenerate用來指定該范圍;

結構語句、系統任務、函數語句和顯示系統任務:
1.沿觸發的always塊常常描敘時序行為,如有限狀態機;電平觸發的always塊常常用來描述組合邏輯行為;
2.always的OR事件控制,用“or”或“,”;
3.@*和@(*)都表示對其后面的語句塊中所有輸入變量的變化是敏感的。
4.函數和任務的區別:
    函數只能與主模塊共用同一個仿真的時間單位,而任務可以定義自己的仿真時間單位;
    函數不能啟動任務,而任務可以啟動其他任務和函數;
    函數至少要有一個輸入變量,而任務可以沒有或有多個任何類型的變量;
    函數返回一個值,而任務不返回值;
    不管有多少任務啟動,只有當所有的任務都完成后,控制才能返回;
5.函數的使用規則:
    函數的定義不能包含有任何的時間控制語句;
    函數不能啟動任務;
    定義函數時至少要有一個輸入參量;
    在函數的定義中必須有一條賦值語句給函數中的一個內部變量賦以函數的結果值,該內部變量具有和函數名相同的名字;
6.自動(遞歸)函數:automatic;自動函數中聲明的局部變量不能通過層次名進行訪問。而自動函數本身可以通過層次名進行訪問;
7.$display(p1,p2,...,pn):p1 格式控制;p2,...,pn 輸出表列 自動換行;%和表示進制的字符中間輸入一個0自動調整顯示輸出數據寬度的方式。
8.$write(p1,p2,...,pn):p1 格式控制;p2,...,pn 輸出表列 多行;
9.所有位不定值x;所有位高阻值z;部分位不定值X;部分位高阻值Z;
10.選通顯示$strobe總是在同時刻的其他賦值語句執行完成后才執行,可以確保所有在同一時鐘沿賦值的其他語句在執行完畢之后才顯示數據;

調試用系統任務和常用的編譯預處理語句:
1.在多模塊調試的情況下,$monitor需配合$monitoron與$monitoroff使用;
2.$monitor是連續監測數據的變化,只要在測試模塊initial塊中調用一次就可以監視被測試模塊的所有感興趣的信號;
3. $time用在$monitor中,用來做時間標記;
4.$stop和$finish用在測試模塊的initial模塊中,配合時間延遲用來控制仿真的持續時間;
5.$random用來產生邊沿不穩定的波形和隨機出現的脈沖;
6.$readmem用來生成給定的復雜數據流。復雜數據可以用c語言產生,存在文件中。用 $readmem取出存入存儲器,再按節拍輸出,這在驗證算法邏輯時特別有用;
7.當多個‘timescale定義的模塊包含在一起時,只有最后一個才能起作用;
8 .宏定義字符串引用時或include等編譯預處理必須用‘引導;
9.預處理命令以符號”`”開頭;
10.宏定義命令的有效范圍為定義命令之后到源文件結束; 在引用已定義的宏名時,必須在宏名的前面加上“`”,表示該名字是一個經過宏定義的名字;宏定義不必在宏名后面加分號;
11.條件執行僅能用于行為語句,系統任務關鍵字$test$plusargs ,用于測試調用的參數值;

第二部分:設計和驗證部分

只有經過艱苦的練習才能掌握設計的訣竅;

Verilog HDL模型的不同抽象級別:
1.nand #10 nd1(a,data,clock,clear);在模塊中使用了一個名為nd1的與非門,輸入為data\clock\clear,輸出為a,輸出與輸入的延時為10個單位時間;
2.D型主從觸發器模塊
3.能把行為級的Verilog模塊自動轉換為門級結構的工具叫做綜合器;
4.#time(觸發的時刻)->(時間名)
5.UDP只能有一個輸出端,而且必定是端口說明列表的第一項;可以有多個輸入端,最多允許10個輸入端;所有端口變量必須是標量,也就是必須是1位的;在UDP的真值表中,只允許出現0,1,X三種邏輯值;只有輸出端口才可以被定義為寄存器類型變量;initial語句用于為時序電路寄存器賦初值,只允許賦0,1,X的3種邏輯值,默認為X.

如何編寫和驗證簡單的純組合邏輯模塊:
1.加法器
module add_4(X,Y,sum,C);
input[3:0] X,Y;
output[3:0]sum;
output C;
assign {C,sum}=X+Y;
endmodule
2.乘法器
module mult_4(X,Y,Product);
input[3:0]X,Y;
output[3:0] Product;
assign Product=X*Y;
endmodule
3.比較器
module compare_n(X,Y,XGY,XSY,XEY);
input[width-1:0] X,Y;
output XGY,XSY,XEY;
reg XGY,XSY,XEY;
parameter width=8;

always@(X or Y)
    begin
        if(X==Y)
            XEY=1;
        else XEY=0;
        if(X>Y)
            XGY=1;
        else XGY=0;
        if(X<Y)
            XSY=1;
        else XSY=0;
    end
endmodule
4.多路選擇器

module Mux_8 (addr,in1,in2,in3,in4,in5,in6,in7,in8,Mout,nCS);
input[2:0]addr;
input[width-1:0]in1,in2,in3,in4,in5,in6,in7,in8;
input nCS;
output[width-1:0]Mout;
reg[width-1:0]Mout;
parameter width=8;

always@(addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or nCS)
begin
    if(!nCS)
        case(addr)
        3`b000:Mout=in1;
        3`b001:Mout=in2;
        3`b010:Mout=in3;
        3`b011:Mout=in4;
        3`b100:Mout=in5;
        3`b101:Mout=in6;
        3`b110:Mout=in7;
        3`b111:Mout=in8;
        endcase
    else
        Mout=0;
    end
endmodule
5.總線和總線操作  
module SampleOfBus(DataBus,link_bus,wirte);
inout[11:0] DataBus;
input link_bus;
reg[11:0]outsigs;
reg[13:0]insigs;

assign DataBus=(link_bus)?outsigs:12`hzzz;
always@(posedge write)
    begin
        insigs<=DataBus*3;
    end;
endmodule;
6.流水線

復雜數字系統構成:
1.組合邏輯:邏輯電路沒有記憶部件;時序邏輯:邏輯電路有記憶部分;
2.同步有限狀態機;
3.數據流動的控制;
4.在VerilogHDL設計中啟用同步時序邏輯;確定下一個狀態所使用的組合電路的延遲與時鐘到各觸發器的差值必須小于一個時鐘周期的寬度:全局時鐘網絡布線時盡量使各分支的時鐘保持一致;采用平衡樹結構,在每一級加入緩沖器,使到達每個觸發器時鐘端的時鐘同步。
     在后防真時,若邏輯與預想設計的不一樣,可降低時鐘頻率,這就可能消除由于時鐘過快引起的觸發器輸入端由延遲和冒險競爭造成的不穩定,從而使邏輯正確。
5.數據接口的同步方法:
    前級輸出的延時是隨機的,或者有可能變動,如何在后級完成數據的同步?可以使用使數據通過RAM或者FIFO的緩存再讀取的方法,達到數據的同步的目的,這種做法的關鍵是必須要有堆棧滿和空的指示信號來管理數據的寫入和讀取,以防止數據的丟失;
    數據有固定的幀格式,數據的起始位置如何確定?用同步頭表示數據信號的起始,或者使用RAM\FIFO來緩存數據再傳送到下一級。找到數據頭的方法有兩個,一個增加一條表示數據起始位置的信號線,第二種對于異步系統,在數據中插入一段有特殊碼型的同步碼,接收端通關相關運算檢測到同步頭。
    級聯的兩個模塊的基本時鐘是異步時域的,如何把前級輸出的數據準確地傳送到下一級模塊中?對輸入數據做兩次以上的采樣寄存。 只適用于允許發生少量錯誤的電路功能單元;
    為避免由異步時鐘域產生的錯誤,經常使用雙口的RAM、FIFO緩存的方法完成異步時鐘域之間的數據傳送。在輸入端口使用前級時鐘寫數據,在輸出端口使用本級時鐘讀數據,并有緩沖器空或滿的控制信號來管理數據的讀寫。

同步狀態機的原理、結構和設計:
1. 如果時序邏輯的輸出不但取決于狀態還取決于輸入,成為Mealy狀態機;而有些時序邏輯的輸出只取決于當前狀態,這樣的電路稱為Moore狀態機;
2.在設計高速電路時,常常有必要使狀態機的輸出與時鐘幾乎完全同步。第一種方法是把狀態變量直接用作輸出;輸出編碼的狀態指定;其輸出組合邏輯部分只有連線,沒有其他組合邏輯部件;第二種方法是在輸出邏輯后面在加一組與時鐘同步的寄存器輸出流水線寄存器,讓所有的輸出信號在下一個信號時鐘跳變沿同時存入寄存器組,即完全同步的輸出,把這種輸出稱為流水線化的輸出;
3.獨熱碼;
4.在比較復雜的狀態機設計過程中,往往把狀態的變化與輸出開關的控制分成兩個部分來考慮;把每一個輸出開關寫成一個個獨立的always組合塊;
5.有限狀態機設計的一般步驟:
    1】邏輯抽象,得出狀態轉換圖  分析給定的邏輯問題,確定輸入量和輸出量以及電路的狀態數;取原因為輸入,取結果為輸出;定義輸入、輸出邏輯狀態的含義,并將電路狀態順序編號;按照要求列出電路的狀態轉換表或畫出狀態轉換圖;
    2】狀態化簡
    3】狀態分配 狀態編碼 獨熱碼
    4】選定觸發器的類型并求出狀態方程、驅動方程和輸出方程
    5】按照方程得到邏輯圖

設計可綜合的狀態機的指導原則:
1.綜合的一般原則:
    1】綜合之前一定要進行仿真;
    2】每一次布局布線之后都要進行仿真,在器件編程或流片之前要做最后的仿真;
    3】避免用綜合器來設計異步狀態機;用電路圖輸入的方法來設計;
    4】如果要為電平敏感的鎖存器建模,使用連續賦值語句是最簡單的方法;
2.語言指導原則:
    1】每個always塊只能有一個事件控制“@(event-expression)”,而且要跟在always關鍵字的后面;
    2】不推薦使用always塊即表示電平敏感的透明鎖存器有同時表示組合邏輯;
    3】帶有posedge或negedge關鍵字的事件表達式表示沿觸發的時序邏輯,沒有該關鍵字的表示組合邏輯或電平敏感的鎖存器,或者兩種都表示。在表示時序和組合邏輯的事件控制表達式中,如有多個沿和多個電平,期間必須用關鍵字“or”連接;
    4】每個表示時序always塊只能由一個時鐘跳變沿觸發,置位或復位最好也有該時鐘跳變沿觸發;
    5】每個在always塊中賦值飛信號都必須定義為reg型或整型;
    6】always塊中應該避免組合反饋回路,也就是說,用always塊設計組合邏輯電路時,在生成組合邏輯的always塊中參與賦值的所有信號都必須有明確的值;
    7】對一個寄存器和整型變量給定位的賦值,只允許在一個always塊內進行,如在另一always塊中也對其賦值,這是非法的;
    8】把某一信號值賦為·bx,綜合器就把他解釋成無關狀態,因而綜合器為其生成的硬件電路最簡潔;
3.狀態機的異步復位與置位:列入always塊的事件控制括號內就能觸發always塊的執行;
4.狀態機的同步復位與置位:不要把set和reset信號列入always塊的事件控制表達式,always塊的執行只由時鐘有效跳變沿觸發。set和reset的電平持續時間必須大于時鐘沿的間隔時間;

深入理解阻塞和非阻塞賦值的不同:
1.時序電路建模時用非阻塞賦值語句;
2.鎖存器電路建模時使用非阻塞賦值語句;
3.用always塊寫組合邏輯時使用阻塞賦值語句;
4.在同一個always塊中同時建立組合和時序邏輯電路時適應非阻塞賦值語句;
5.在同一個always塊中不用同時使用阻塞語句和非阻塞賦值語句;
6.不要在多個always塊中為同一個變量賦值;
7.用$strobe系統任務來顯示用非阻塞賦值的變量值;
8.在賦值時不用#0延遲;
9.非阻塞賦值的操作 只能用于對寄存器類型變量進行賦值,只能用于initial塊和always塊等過程中,而非阻塞賦值不允許用于連續賦值;

對于大多數的電路系統工程師來說,應嘎盡量利用商業化的虛擬模塊來設計自己的電路系統。

詞匯代碼的編寫標準:
1. 每一個Verilog源文件中只準編寫一個模塊,也不要把一個模塊分成幾部分或寫在幾個源文件中;
2. 源文件的名字應該與文件內容有關,最好一致;
3.每行只寫一個聲明語句或說明;
4.用一層層縮進的格式來寫;
5. 用戶定義變量名的大小寫應該自始至終一致(例如,變量名第一個字母大寫);
6.用戶定義變量名應該有意義,而且含有一定的有關信息。而局部變量名可以簡單扼要的;
7.通過注釋對Verilog源代碼作必要的說明,對接口做必要的注釋很重要;
8.盡可能多的使用參數和宏定義,而不要在源代碼的語句中直接使用字母、數字和字符串;

可綜合代碼的編寫標準:
1. 把設計分割成較小的功能塊,每一塊用行為風格去設計這些塊。除了設計中對速度相應要求比較臨界的部分外,都應避免使用門級描述;
2.應建立一個定義得很好的時鐘策略,并在verilog源代碼中清洗的體現這些策略(例如采用單時鐘、多相位時鐘、經過門產生的時鐘和多時鐘域等)。保證在Verilog源代碼中的時鐘和復位信號是干凈的(即不是由組合邏輯或沒有考慮到的門產生的);
3.要建立一個定義的很好的測試策略,并認真編寫其Verilog代碼,使所有的觸發器都是可復位的,使測試能通過外部引腳進行,又沒有冗余的功能;
4.每個源代碼都必須遵守并符合在always聲明語句中介紹過的某一種可綜合標準模板;
5. 描述組合和鎖存邏輯的always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號;
6. 描述組合邏輯的always塊一定不能有不完全賦值,也就是說所有的輸出變量必須被各輸入值的組合賦值,不能有例外;
7.描述組合和鎖存邏輯的always塊一定不能包含反饋,也就是說在always快中已被定義為輸出的寄存器變量絕不能在該always塊中讀進來作為輸入信號;
8. 時鐘沿觸發的always必須是單時鐘的,并且任何異步控制輸入(通常為復位或置位信號)必須在控制事件列表中列出;
9.避免生成不需要的鎖存器。在無時鐘的always塊中,由于有的輸出變量被賦予某個信號的變量值,而該信號變量沒有在always塊的電平敏感控制事件中列出,這會在綜合中生成不想要的鎖存器;
10.避免不想要的觸發器。在時鐘邊沿觸發的always塊中,用非阻塞語句對寄存器類型的變量賦值,綜合后會生成觸發器;或者當寄存器類型的變量在時鐘邊沿觸發的always塊中經過多次循環其值保持不變,綜合后也會生成觸發器;
11.所有內部寄存器必須是可復位的,這是為了使RTL級和門級描述能夠被復位成同一個已知的狀態以便進行門級邏輯驗證,但這并不適用于流水線或同步寄存器;
12.對存在無效狀態的有限狀態機和其他時序電路,如果想要在這些無效狀態下,硬件的行為也能夠被完全被控制,那么必須用Verilog明確地描述所有的2的n次冪種狀態下的行為,當然要包括無效狀態。
13.賦值語句中不要使用延遲,而在Verilog塊的RTL級描述中需要解決零延遲時鐘的傾斜問題例外;
14.不要使用整型和time型寄存器,否則將分別綜合成32位和64位總線;
15.仔細檢查Verilog代碼中使用動態指針、循環聲明或算術運算部分,因為這類代碼在綜合后會生成大量的門,而且很難進行優化;

設計流程:
1 系統分析和指標確定
2 系統劃分
    頂級模塊
    模塊大小估計
    預布局
3 模塊級設計,對每一模塊
    寫RTL級Verilog
    綜合代碼檢測
    寫測試文件
    仿真
    寫綜合約束、邊界條件和層次
    預綜合以分析門的數量和延時
4 芯片綜合
    寫測試文件
    仿真
    綜合
    門級仿真
5 測試
    修改門級網表以便進行測試;
    產生測試矢量;
    對可測試網表進行仿真;
6 布局布線以使設計的邏輯電路能放入芯片;
7 布局布線后仿真、故障覆蓋仿真和定時分析;

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: sese视频在线观看 | 国产精品69av | 日韩欧美中文字幕在线观看 | xnxx 日本免费 | 国产视频不卡一区 | 国产中文字幕av | 精品一区二区三区av | 天堂在线www | 久久久做 | 久久视频免费观看 | 91成人小视频 | 欧美一区二区三区,视频 | 日韩国产免费观看 | 久久高清国产 | 久久久久久亚洲精品 | 亚洲网站在线观看 | 国产在线一区二区三区 | 日本一区二区三区四区 | 综合色站导航 | 欧美视频二区 | www.黄色网| 在线观看日本高清二区 | 亚洲精品乱码久久久久久蜜桃91 | 真人一级毛片 | 99精品欧美一区二区三区综合在线 | 亚洲一级毛片 | 欧美精品一区二区在线观看 | 91p在线观看 | 久久精品国产一区二区电影 | 国产精品福利视频 | 99国产在线 | 欧美日韩成人在线观看 | 欧美a区 | 日韩和的一区二区 | 日日操操| 国产91网址 | av网站免费 | 国产高清视频在线观看 | 一区二区福利视频 | 成人欧美一区二区三区在线观看 | 99视频网站 |