日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ
		


5.1.3 Net and Register

  • 一個(gè)reg變量只能在一個(gè)always語句中賦值  。
  • 向量有效位順序的定義一般是從大數(shù)到小數(shù)。

盡管定義有效位的順序很自由, 但如果采用毫無規(guī)則的定義勢(shì)必會(huì)給作者和讀代碼的人帶來困惑, 如Data[-4 :0] ,則LSB[0][-1][-2][-3][-4]MSB ,或 Data[0 :4] ,則LSB[4][3][2][1][0]MSB, 這兩種情況的定義都不太好 ,推薦 Data[4 :0] 這種格式的定義。

  • 對(duì)net和register類型的輸出要做聲明 (在PORT中)。如果一個(gè)信號(hào)名沒做聲明 Verilog將假定它為一位寬的wire變量。
  • 線網(wǎng)的多種類型 。寄存器的類型。

5.1.4 Expressions

  • 用括號(hào)來表示執(zhí)行的優(yōu)先級(jí)。盡管操作符本身有優(yōu)先順序, 但用括號(hào)來表示優(yōu)先級(jí)對(duì)讀者更清晰, 更有意義。
If ((alpha < beta) && (gamma >= delta)).... 比下面的表達(dá)更合意 。 If (alpha < beta && gamma >= delta)...
  • 用一個(gè)函數(shù)(function)來代替表達(dá)式的多次重復(fù)
如果代碼中發(fā)現(xiàn)多次使用一個(gè)特殊的表達(dá)式 ,那么就用一個(gè)函數(shù)來代替。這樣在以后的版本升級(jí)時(shí)更便利 ,這種概念在做行為級(jí)的代碼設(shè)計(jì)時(shí)同樣使用 ,經(jīng)常使用的一組描述可以寫到一個(gè)任務(wù)(task)中 。

5.1.5 IF 語句

  • 向量比較時(shí) 比較的向量要相等。
當(dāng)比較向量時(shí) ,verilog將對(duì)位數(shù)小的向量做 0 擴(kuò)展以使它們的長(zhǎng)度相匹配 ,它的自動(dòng)擴(kuò)展為隱式的。建議采用顯示擴(kuò)展 ,這個(gè)規(guī)律同樣適用于向量同常量的比較。
Reg Abc [7:0];
 Reg Bca [3:0];
 ...... If (Abc = = {4’b0, Bca})begin
 ....... If (Abc = = 8’b0) begin
  • 每一個(gè)If 都應(yīng)有一個(gè)else 和它相對(duì)應(yīng)。

在做硬件設(shè)計(jì)時(shí) ,常要求條件為真時(shí)執(zhí)行一種動(dòng)作而條件為假時(shí)執(zhí)行另一動(dòng)作,即使認(rèn)為條件為假不可能發(fā)生。沒有else可能會(huì)使綜合出的邏輯和RTL級(jí)的邏輯不同。如果條件為假時(shí)不進(jìn)行任何操作,則用一條空語句.
always @(Cond)
 begin if (Cond)
 DataOut <= DataIn; End // Else  
以上語句DataOut會(huì)綜合成鎖存器.
  • 應(yīng)注意If ..else if ...else if ...else 的優(yōu)先級(jí)
  • 如果變量在If-else 或case 語句中做非完全賦值, 則應(yīng)給變量一個(gè)缺省值 ,即,
V1 = 2’b00;
 V2 = 2’b00;
 V3 = 2’b00; If (a = = b) begin
 V1 = 2’b01; //V3 is not assigned V2 = 2’b10;
 End Else if (a = = c) begin
 V2 = 2’b10; //V1 is not assigned V3 = 2’b11;
 End Else ;;

5.1.6 case 語句

case語句通常綜合成一級(jí)多路復(fù)用器 (圖的右邊部分), 而if-then-else則綜合成優(yōu)先編碼的串接的多個(gè)多路復(fù)用器, 如圖的左邊部分。通常 ,使用case 語句要比if語句快 ,優(yōu)先編碼器的結(jié)構(gòu)僅在信號(hào)的到達(dá)有先后時(shí)使用。條件賦值語句也能綜合成多路復(fù)用器, 而case 語句仿真要比條件賦值語句快。

所有的Case 應(yīng)該有一個(gè)default case 允許空語句 Default : ;

5.1.7 Writing functions

在function的最后給function賦值.
Function CompareVectors; // (Vector1, Vector2, Length) Input [199:0] Vector1, Vector2;
 Input [31:0] Length; //local variables Integer i;
 Reg Equal;
 Begin
  i = 0;
  Equal = 1; While ((iIf (Vector 2[i] !== 1’bx) begin If (Vector1[i] !== Vector2[i])
    Equal = 0; Else ;
  End
   i = i + 1;
  End
  CompareVectors = Equal;
End
Endfunction //compareVectors 
  • 函數(shù)中避免使用全局變量 否則容易引起HDL行為級(jí)仿真和門級(jí)仿真的差異 如
function ByteCompare input [15:0] Vector1 input [15:0] Vector2 input [7:0] Length begin if (ByteSel) // compare the upper byte else // compare the lower byte end endfunction // ByteCompare 
中使用了全局變量ByteSel, 可能無意在別處修改了 ,導(dǎo)致錯(cuò)誤結(jié)果。最好直接在端口加以定義 。注意 函數(shù)與任務(wù)的調(diào)用均為靜態(tài)調(diào)用。

5.1.8 Assignment

  • Verilog 支持兩種賦值 :過程賦值(procedural) 和連續(xù)賦值(continuous)。過程賦值用于過程代碼 initial,   always, task or function)中給reg 和 integer變量 time\realtimereal賦值,   而連續(xù)賦值一般給wire 變量賦值。
Always @(敏感表 敏感表要完整 如果不完整 將會(huì)引起仿真和綜合結(jié)果不一致
 always @(d or Clr) if (Clr)
   q = 1'b0;
 else if (e)
   q = d; 
以上語句在行為級(jí)仿真時(shí)e的變化將不會(huì)使仿真器進(jìn)入該進(jìn)程,導(dǎo)致仿真結(jié)果錯(cuò)誤
  • Assign/deassign 僅用于仿真加速 僅對(duì)寄存器有用  。
  • Force/release 僅用于debug 對(duì)寄存器和線網(wǎng)均有用 。
  • 避免使用Disable。
  • 對(duì)任何reg賦值用非阻塞賦值代替阻塞賦值 reg 的非阻塞賦值要加單位延遲 ,但異步復(fù)位可加可不加 。
=與 =的區(qū)別
Always @(posedge Clk or negedge Rst_)
 Begin If (!Rst_) // prioritize the “if conditions” in if statement Begin
    Rega <= 0; //non_blocking assignment Regb <= 0;
   End Else if (Soft_rst_all) 
   Begin
    Rega <= #u_dly 0; //add unit delay Regb <= #u_dly 0; End Else if (Load_init)
   Begin
    Rega <= #u_dly init_rega; Regb <= #u_dly init_regb; End Else Begin
    Rega <= #u_dly Rega << 1; Regb <= #u_dly St_1; End
End // end Rega, Regb assignment. 

5.1.9 Combinatorial Vs Sequential Logic

如果一個(gè)事件持續(xù)幾個(gè)時(shí)鐘周期 設(shè)計(jì)時(shí)就用時(shí)序邏輯代替組合邏輯 。如
Wire Ct_24_e4; //it ccarries info. Last over several clock cycles Assign Ct_24_e4 = (count8bit[7:0] >= 8’h24) & (count8bit[7:0] <= 8’he4);
那么這種設(shè)計(jì)將綜合出兩個(gè)8 比特的加法器 而且會(huì)產(chǎn)生毛刺 對(duì)于這樣的電路 要采用時(shí)序設(shè)計(jì) 代碼如下
Reg Ct_24_e4;
 Always @(poseddge Clk or negedge Rst_)
 Begin If (!Rst_)
   Ct_24_e4 <= 1’b0; Else if (count8bit[7:0] = = 8’he4)
   Ct_24_e4 <= #u_dly 1’b0; Else if (count8bit[7:0] = = 8’h23)
   Ct_24_e4 <= #u_dly 1’b1; Esle ; //內(nèi)部總線不要懸空 在default狀態(tài) 要把它上拉或下拉. Wire OE_default;
  Assign OE_default = !(oe1 | oe2 | oe3);
  Assign bus[31:0] =  oe1 ? Data1[31:0] :
       oe2 ? Data2[31:0] :
       oe3 ? Data3[31:0] :
       oe_default ? 32’h0000_0000 : 32’hzzzz_zzzz;

5.1.10Macros

  • 為了保持代碼的可讀性 常用  “ `define ”   做常數(shù)聲明。
  • 把“define”放在一個(gè)獨(dú)立的文件中 參數(shù) parameter 必須在一個(gè)模塊中定義 不要傳替參數(shù)到模塊 仿真測(cè)試向量例外 “define”可以在任何地方定義 要把所有的“define”定義在一個(gè)文件中 在編譯原代碼時(shí)首先要把這個(gè)文件讀入 如果希望宏的作用域僅在一個(gè)模塊中 就用參數(shù)來代替。

5.1.11Comments

  • 對(duì)更新的內(nèi)容更新要做注釋。
  • 在語法塊的結(jié)尾做標(biāo)記。
//style 1 If (~OE_ && (state != PENDING)) begin
 ....
 End // if enable = = ture and ready //style 2 --- identical lables on begin and end If (~OE_ && (state != PENDING)) begin //drive data ....
 End //drive data // Comment endwith the name of the Function Calcparity //Data, ParityErr .... Endfunction // Calcparity 
  • 每一個(gè)模塊都應(yīng)在模塊開始處做模塊級(jí)的注釋 參考前面標(biāo)準(zhǔn)模塊頭 。
  • 在模塊端口列表中出現(xiàn)的端口信號(hào) 都應(yīng)做簡(jiǎn)要的功能描述。

5.1.12 FSM

  • VerilogHDL狀態(tài)機(jī)的狀態(tài)分配 VerilogHDL描述狀態(tài)機(jī)時(shí)必須由parameter分配好狀態(tài),這與VHDL不同 VHDL狀態(tài)機(jī)狀態(tài)可以在綜合時(shí)分配產(chǎn)生。

  • 組合邏輯和時(shí)序邏輯分開用不同的進(jìn)程。組合邏輯包括狀態(tài)譯碼和輸出 時(shí)序邏輯則是狀態(tài)寄存器的切換。
  • 必須包括對(duì)所有狀態(tài)都處理 不能出現(xiàn)無法處理的狀態(tài) 使?fàn)顟B(tài)機(jī)失控  。
  • Mealy機(jī)的狀態(tài)和輸入有關(guān),而Moore機(jī)的狀態(tài)轉(zhuǎn)換和輸入無關(guān)。
Mealy 狀態(tài)機(jī)的例子如下:
...
 reg CurrentState, NextState, Out1;
 Parameter S0=0,S1=1;
 always @(posedge Clk or negedge Rst_) // state vector flip-flops (sequential) if (!Reset)
  CurrentState = S0; else CurrentState <= #u_dly NextState; always @(In1 or In2 or CurrentState) // output and state vector decode (combinational) case (CurrentState)
  S0: begin
  NextState <= #u_dly S1; Out1 <= #u_dly 1'b0; end
  S1: if (In1) begin
  NextState <= #u_dly S0; Out1 <= #u_dly In2; end else begin
  NextState <= #u_dly S1; Out1 <= #u_dly !In2; end
  endcase
 endmodule


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉