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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

reg类型变量综合电路_Verilog中 reg和wire 用法和区别以及always和assign的区别

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

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的初始狀態。

總結

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

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