verilog中pullup和pulldown的用法


pullup、pulldown的用法:

pullup或pulldown只對對當前無驅動的線wire才會有作用,若有驅動應該按照驅動信號來決定!
當線wire為z時,pullup或pulldonw才起作用!
也就是‘Z’可以變成‘1’或‘0’,而不是‘0’能變‘1’(‘1’變‘0’),否則就跟你設計想法不一樣了。

以下的例子進一步說明了這個問題:

`timescale 1ns/1ps
module test();
reg a;
reg d;
wire b;
wire c;
wire e;
reg clk;

always #10 clk = ~clk;

initial begin
clk =1'b0;
d = 1'bx;
#100;
a = 1'b1;
#100;
a = 1'b0;
#100;
d = 1'bz;
#100;
$finish;
end
pulldown(b);
pulldown(c);
pulldown(e);
assign b = a;
assign e = d;

always@(posedge clk) begin
  $display("@%0t   a = %b  b = %b  c= %b  d = %b  e = %b  ",$realtime,a,b,c,d,e);
end

endmodule

結果如下所示:

@10000   a = x  b = x  c= 0  d = x  e = x  
@30000   a = x  b = x  c= 0  d = x  e = x  
@50000   a = x  b = x  c= 0  d = x  e = x   
@70000   a = x  b = x  c= 0  d = x  e = x  
@90000   a = x  b = x  c= 0  d = x  e = x   //pulldown(b);pulldown(c);pulldown(e);
@110000   a = 1  b = 1  c= 0  d = x  e = x  //#100  a=1'b1;assign b=a;assign e=d
@130000   a = 1  b = 1  c= 0  d = x  e = x  
@150000   a = 1  b = 1  c= 0  d = x  e = x  
@170000   a = 1  b = 1  c= 0  d = x  e = x  
@190000   a = 1  b = 1  c= 0  d = x  e = x  
@210000   a = 0  b = 0  c= 0  d = x  e = x  //#100 a=1'b0;assign a=b;assign e=d
@230000   a = 0  b = 0  c= 0  d = x  e = x  
@250000   a = 0  b = 0  c= 0  d = x  e = x  
@270000   a = 0  b = 0  c= 0  d = x  e = x  
@290000   a = 0  b = 0  c= 0  d = x  e = x  
@310000   a = 0  b = 0  c= 0  d = z  e = 0  //#100 d=1'bz;assign a=b;assign e=d
@330000   a = 0  b = 0  c= 0  d = z  e = 0  
@350000   a = 0  b = 0  c= 0  d = z  e = 0  
@370000   a = 0  b = 0  c= 0  d = z  e = 0  
@390000   a = 0  b = 0  c= 0  d = z  e = 0 

reg a沒有驅動,所以為x;#100后,a被賦值為1;#100后,a被賦值為0;
wire b一直被a驅動,b和a的值一樣,雖然有assign b=a, 但是a為開始為x,所以a和b一致;
wire c無驅動,但是有pulldown(c),所以c為0;
reg d剛開始被賦值為x,后來被賦值為z;
wire e一直被reg d驅動,剛開始d為x,所以e也為x,后來d被賦值為z,因為pulldown(e),所以e為1。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM