reg类型变量综合电路_Verilog中 reg和wire 用法和区别以及always和assign的区别
1、從仿真角度來說,HDL語言面對的是編譯器,相當(dāng)于使用軟件思路,此時(shí):
wire對應(yīng)于連續(xù)賦值,如assign;
reg對應(yīng)于過程賦值,如always,initial;
2、從綜合角度,HDL語言面對的是綜合器,相當(dāng)于從電路角度來思考,此時(shí):
wire型變量綜合出來一般情況下是一根導(dǎo)線。
reg變量在always中有兩種情況:
(1)always @(a or b or c)形式的,即不帶時(shí)鐘邊沿的,綜合出來還是組合邏輯;
(2)always @(posedge clk)形式的,即帶有邊沿的,綜合出來一般是時(shí)序邏輯,會(huì)包含觸發(fā)器(Flip-Flop)
3、設(shè)計(jì)中,輸入信號(hào)一般來說不能判斷出上一級是寄存器輸出還是組合邏輯輸出,對于本級來說,就當(dāng)成一根導(dǎo)線,即wire型。而輸出信號(hào)則由自己來決定是reg還是組合邏輯輸出,wire和reg型都可以。但一般的,整個(gè)設(shè)計(jì)的外部輸出(即最頂層模塊的輸出),要求是reg輸出,這比較穩(wěn)定、扇出能力好。
4、Verilog中何時(shí)要定義成wire型?
情況一:assign語句
例如:
reg a,b;
wire out;
......
assign out = a & b;
如果把out定義成reg型,對不起,編譯器報(bào)錯(cuò)!
情況二:元件實(shí)例化時(shí)必須用wire型
例如:
wire dout;
ram u_ram
(
....
.out(dout);
)
wire為無邏輯連線,wire本身不帶邏輯性,所以輸入什么就的輸出什么。所以如果用always語句對wire變量賦值,對不起,編譯器報(bào)錯(cuò)。
那么你可能會(huì)問, assign c = a & b; 不是對wire的賦值嗎?
并非如此,綜合時(shí)是將 a & b綜合成 a、b經(jīng)過一個(gè)與門,而c是連接到與門輸出線,真正綜合出來的是與門&,不是c。
5、何時(shí)用reg、何時(shí)用wire?
大體來說,reg和wire類似于C、C++的變量,但若此變量要放在begin...end之內(nèi),則該變量只能是reg型;在begin...end之外,則用wire型;
使用wire型時(shí),必須搭配assign;reg型可以不用。
input、output、inout預(yù)設(shè)值都是wire型。
在Verilog中使用reg型,并不表示綜合出來就是暫存器register:在組合電路中使用reg,組合后只是net;在時(shí)序電路中使用reg,合成后才是以Flip-Flop形式表示的register觸發(fā)器。
6、reg和wire的區(qū)別:
reg型數(shù)據(jù)保持最后一次的賦值,而wire型數(shù)據(jù)需要持續(xù)的驅(qū)動(dòng)。wire用在連續(xù)賦值語句assign中;reg用于always過程賦值語句中。
在連續(xù)賦值語句assign中,表達(dá)式右側(cè)的計(jì)算結(jié)果可以立即更新到表達(dá)式的左側(cè),可以理解為邏輯之后直接連接了一條線,這個(gè)邏輯對應(yīng)于表達(dá)式的右側(cè),這條線對應(yīng)于wire;
在過程賦值語句中,表達(dá)式右側(cè)的計(jì)算結(jié)果在某種條件的觸發(fā)下放到一個(gè)變量當(dāng)中,這個(gè)變量可以聲明成reg型,根據(jù)觸發(fā)條件的不同,過程語句可以建模不同的硬件結(jié)構(gòu):
(1)如果這個(gè)條件是時(shí)鐘上升沿或下降沿,那硬件模型就是一個(gè)觸發(fā)器,只有是指定了always@(posedge or negedge)才是觸發(fā)器。
(2)如果這個(gè)條件是某一信號(hào)的高低電平,那這個(gè)硬件模型就是一個(gè)鎖存器。
(3)如果這個(gè)條件是賦值語句右側(cè)任意操作數(shù)的變化,那這個(gè)硬件模型就是一個(gè)組合邏輯。
7、過程賦值語句always@和連續(xù)賦值語句assign的區(qū)別:
(1)wire型用于assign的賦值,always@塊下的信號(hào)用reg型。這里的reg并不是真正的觸發(fā)器,只有敏感列表內(nèi)的為上升沿或下降沿觸發(fā)時(shí)才綜合為觸發(fā)器。
(2)另一個(gè)區(qū)別,舉例:
wire a;
reg b;
assign a = 1'b0;
always@(*)
b = 1'b0;
上面例子仿真時(shí)a將會(huì)是0,但是b的狀態(tài)是不確定的。因?yàn)閂erilog規(guī)定,always@(*)中的*指的是該always塊內(nèi)的所有輸入信號(hào)的變化為敏感列表,就是說只有當(dāng)always@(*)塊內(nèi)輸入信號(hào)發(fā)生變化,該塊內(nèi)描述的信號(hào)才會(huì)發(fā)生變化。
像always@(*) b= 1'b0; 中由于1‘b0是個(gè)常數(shù),一直沒有變化,由于b的足組合邏輯輸出,所有復(fù)位時(shí)沒有明確的值--即不確定狀態(tài),又因?yàn)閍lways@(*)塊內(nèi)沒有敏感信號(hào)變化,此時(shí)b信號(hào)一直保持不變,即不確定是啥,取決于b的初始狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的reg类型变量综合电路_Verilog中 reg和wire 用法和区别以及always和assign的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hover出不来是什么原因css,关于c
- 下一篇: Android开发进阶-接入Google