日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

reg类型变量综合电路_verilog语言中wire型变量和reg 型变量的区别

發布時間:2023/12/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 reg类型变量综合电路_verilog语言中wire型变量和reg 型变量的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標簽:

wire與reg類型的區別:

wire型數據常用來表示以assign關鍵字指定的組合邏輯信號。模塊的輸入輸出端口類型都默認為wire型。默認初始值是z。

reg型表示的寄存器類型。always模塊內被賦值的信號,必須定義為reg型,代表觸發器。

默認初始值是x。

reg 類型不一定是寄存器變量,例如組合邏輯中reg類型變量。

reg相當于存儲單元,wire相當于物理連線。

Verilog 中變量的物理數據分為線型和寄存器型。這兩種類型的變量在定義時要設置位寬,缺省為1位。變量的每一位可以是0,1,X,Z。其中x代表一個未被預置初始狀態的變量或者是由于由兩個或多個驅動裝置試圖將之設定為不同的值而引起的沖突型線型變量。z代表高阻狀態或浮空量。

線型數據包括wire,wand,wor等幾種類型在被一個以上激勵源驅動時,不同的線型數據有各自決定其最終值的分辨辦法。

兩者的區別是:寄存器型數據保持最后一次的賦值,而線型數據需要持續的驅動

輸入端口可以由net/reg驅動,但輸入端口只能是net,如a = b & c,輸入端口a 只能是net型,但其驅動b,c可以是net/reg型;輸出端口可以使net/reg類型,輸出端口只能驅動net,如a = b & c,模塊的輸出端口b,c可以是net/reg型,但它們驅動的a必須是net型;若輸出端口在過程塊(always/initial)中賦值則為reg型,若在過程塊外賦值則為net型。用關鍵詞inout聲明一個雙向端口, inout端口不能聲明為寄存器類型,只能是net類型。

wire表示直通,即只要輸入有變化,輸出馬上無條件地反映;reg表示一定要有觸發,輸出才會反映輸入。

不指定就默認為1位wire類型。專門指定出wire類型,可能是多位或為使程序易讀。wire只能被assign連續賦值,reg只能在initial和always中賦值。wire使用在連續賦值語句中,而reg使用在過程賦值語句中。

在連續賦值語句中,表達式右側的計算結果可以立即更新表達式的左側。在理解上,相當于一個邏輯之后直接連了一條線,這個邏輯對應于表達式的右側,而這條線就對應于wire。在過程賦值語句中,表達式右側的計算結果在某種條件的觸發下放到一個變量當中,而這個變量可以聲明成reg類型的。根據觸發條件的不同,過程賦值語句可以建模不同的硬件結構:如果這個條件是時鐘的上升沿或下降沿,那么這個硬件模型就是一個觸發器;如果這個條件是某一信號的高電平或低電平,那么這個硬件模型就是一個鎖存器;如果這個條件是賦值語句右側任意操作數的變化,那么這個硬件模型就是一個組合邏輯。

wire型的變量綜合出來一般是一根導線;

reg變量在always塊中有兩種情況: ?? always后的敏感表中是(a or b or c)形式的,也就是不帶時鐘邊沿的,綜合出來還是組合邏輯 ? always后的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)

在設計中,輸入信號一般來說你是不知道上一級是寄存器輸出還是組合邏輯輸出,那么對于本級來說就是一根導線,也就是wire型。而輸出信號則由你自己來決定是寄存器輸出還是組合邏輯輸出,wire型、reg型都可以。但一般的,整個設計的外部輸出(即最頂層模塊的輸出),要求是寄存器輸出,較穩定、扇出能力也較好。

Notes:七七八八的也看不太懂,總之wire賦值用assign,reg在always內使用。

————————————————————————————————————————————————

1、從仿真角度來說,HDL語言面對的是編譯器,相當于使用軟件思路,此時:

wire對應于連續賦值,如assign;

reg對應于過程賦值,如always,initial;

2、從綜合角度,HDL語言面對的是綜合器,相當于從電路角度來思考,此時:

wire型變量綜合出來一般情況下是一根導線。

reg變量在always中有兩種情況:

(1)always @(a or b or c)形式的,即不帶時鐘邊沿的,綜合出來還是組合邏輯;

(2)always @(posedge clk)形式的,即帶有邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)

3、設計中,輸入信號一般來說不能判斷出上一級是寄存器輸出還是組合邏輯輸出,對于本級來說,就當成一根導線,即wire型。而輸出信號則由自己來決定是reg還是組合邏輯輸出,wire和reg型都可以。但一般的,整個設計的外部輸出(即最頂層模塊的輸出),要求是reg輸出,這比較穩定、扇出能力好。

4、Verilog中何時要定義成wire型?

情況一:assign語句

例如:

reg? ?a,b;

wire? out;

......

assign?? out = a & b;

如果把out定義成reg型,對不起,編譯器報錯!

情況二:元件實例化時必須用wire型

例如:

wire?? dout;

ram?? u_ram

(

....

.out(dout);

)

wire為無邏輯連線,wire本身不帶邏輯性,所以輸入什么就的輸出什么。所以如果用always語句對wire變量賦值,對不起,編譯器報錯。

那么你可能會問,? assign??? c = a & b;?? 不是對wire的賦值嗎?

并非如此,綜合時是將? a & b綜合成 a、b經過一個與門,而c是連接到與門輸出線,真正綜合出來的是與門&,不是c。

5、何時用reg、何時用wire?

大體來說,reg和wire類似于C、C++的變量,但若此變量要放在begin...end之內,則該變量只能是reg型;在begin...end之外,則用wire型;

使用wire型時,必須搭配assign;reg型可以不用。

input、output、inout預設值都是wire型。

在Verilog中使用reg型,并不表示綜合出來就是暫存器register:在組合電路中使用reg,組合后只是net;在時序電路中使用reg,合成后才是以Flip-Flop形式表示的register觸發器。

6、reg和wire的區別:

reg型數據保持最后一次的賦值,而wire型數據需要持續的驅動。wire用在連續賦值語句assign中;reg用于always過程賦值語句中。

在連續賦值語句assign中,表達式右側的計算結果可以立即更新到表達式的左側,可以理解為邏輯之后直接連接了一條線,這個邏輯對應于表達式的右側,這條線對應于wire;

在過程賦值語句中,表達式右側的計算結果在某種條件的觸發下放到一個變量當中,這個變量可以聲明成reg型,根據觸發條件的不同,過程語句可以建模不同的硬件結構:

(1)如果這個條件是時鐘上升沿或下降沿,那硬件模型就是一個觸發器,只有是指定了always@(posedge or negedge)才是觸發器。

(2)如果這個條件是某一信號的高低電平,那這個硬件模型就是一個鎖存器。

(3)如果這個條件是賦值語句右側任意操作數的變化,那這個硬件模型就是一個組合邏輯。

7、過程賦值語句always@和連續賦值語句assign的區別:

(1)wire型用于assign的賦值,always@塊下的信號用reg型。這里的reg并不是真正的觸發器,只有敏感列表內的為上升沿或下降沿觸發時才綜合為觸發器。

(2)另一個區別,舉例:

wire???? a;

reg????? b;

assign???? a = 1'b0;

always@(*)

b = 1'b0;

上面例子仿真時a將會是0,但是b的狀態是不確定的。因為Verilog規定,always@(*)中的*指的是該always塊內的所有輸入信號的變化為敏感列表,就是說只有當always@(*)塊內輸入信號發生變化,該塊內描述的信號才會發生變化。

像always@(*)? b= 1'b0; 中由于1‘b0是個常數,一直沒有變化,由于b的足組合邏輯輸出,所有復位時沒有明確的值--即不確定狀態,又因為always@(*)塊內沒有敏感信號變化,此時b信號一直保持不變,即不確定是啥,取決于b的初始狀態。

標簽:

來源: https://blog.csdn.net/kebu12345678/article/details/85529791

總結

以上是生活随笔為你收集整理的reg类型变量综合电路_verilog语言中wire型变量和reg 型变量的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。