pullup和pulldown在verilog中的使用方法

0 前言
這段時(shí)間涉及到了IO-PAD,在IO-PAD的RTL的時(shí)候注意到了pullup和pulldown,對這個(gè)知識比較好奇,就研究了一下,順便記錄下來,IO-PAD的內(nèi)容等我再研究研究再考慮記錄吧 >_<
1 pullup和pulldown的介紹
pullup和pulldown并非是verilog的內(nèi)置原語,僅在仿真或綜合過程中起作用,用來設(shè)置信號的默認(rèn)狀態(tài)
在實(shí)際的硬件電路中,用來代表上拉和下拉,就比如在I2C中,SCL和SDA兩個(gè)信號是open-drain的,在實(shí)際使用過程中往往需要接上拉電阻,如下圖

接在VCC的兩個(gè)電阻就是上拉電阻,這個(gè)上拉電阻在verilog中就可以用pullup表示
下面結(jié)合實(shí)例來看看怎么使用
2 不使用pullup和pulldown的情況
在這個(gè)例子中,當(dāng)sel = 1'b1
時(shí)輸出highz
,sel = 0
時(shí)輸出0
,在initial·
中對sel先后賦值0和1,來看看運(yùn)行結(jié)果

可以看到當(dāng)sel = 0
時(shí),dout = 0
,當(dāng)sel = 1
時(shí),dout = z
,這個(gè)結(jié)果符合預(yù)期
注意,在這個(gè)例子中,并沒有使用到pullup
,下面給出使用pullup
的例子
2 使用pullup和pulldown的情況
同樣的例子,加上了pullup(dout)
語句(第7行),其他的均為改變,首先可以看到pullup
有被highlight,說明這是一個(gè)關(guān)鍵詞
下面開始編譯

報(bào)錯(cuò)了,給的原因是logic
聲明的變量不能連接到帶有驅(qū)動(dòng)強(qiáng)度的gate輸出端,那把logic
聲明改成wire
,修改后的代碼如下
再次編譯

編譯通過,下面執(zhí)行仿真,來看看仿真結(jié)果

可以看到在這個(gè)例子中,當(dāng)sel = 1
時(shí),dout = 1
,不再是highz
3 push-pull和open-drain的介紹
就那mos管來簡單介紹一下吧

這是一個(gè)push-pull的電路,由兩個(gè)mos管組成,上面的是PMOS,下面的是NMOS
當(dāng)IN = 1
時(shí),NMOS導(dǎo)通,PMOS截止,最終OUT = 0
,電流方向?yàn)?code>OUT -> NMOS,這個(gè)過程叫挽
當(dāng)IN = 0
時(shí),NMOS截止,PMOS導(dǎo)通,最終OUT = 1
,電路方向?yàn)?code>PMOS -> OUT,這個(gè)過程叫推
這就是push-pull(推挽)

這是open-drain,與push-pull不同的是上面的PMOS換成了電阻,這個(gè)電阻就是上拉電阻
同樣的,當(dāng)IN = 1
時(shí),NMOS導(dǎo)通,OUT = 0
那當(dāng) IN = 0
時(shí)呢?NMOS截止,如果此時(shí)不接上拉電阻,那么OUT
端此時(shí)的狀態(tài)是不確定的(單看這個(gè)電路的情況下)
當(dāng)接入一個(gè)上拉電阻后,由于MOS管截止后,電阻可以看做是無窮大,此時(shí)從VDD -> GND
就可以看做是一個(gè)電阻R和一個(gè)電阻無窮大的NMOS串聯(lián),那么在OUT點(diǎn)的電壓自然約等于VDD
OK,先這樣,至于在用pullup的時(shí)候?yàn)槭裁床荒苡胠ogic聲明,下次介紹吧