W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
連續(xù)賦值延時語句中的延時,用于控制任意操作數(shù)發(fā)生變化到語句左端賦予新值之間的時間延時。
時延一般是不可綜合的。
寄存器的時延也是可以控制的,這部分在時序控制里加以說明。
連續(xù)賦值時延一般可分為普通賦值時延、隱式時延、聲明時延。
下面 3 個例子實現(xiàn)的功能是等效的,分別對應 3 種不同連續(xù)賦值時延的寫法。
//普通時延,A&B計算結(jié)果延時10個時間單位賦值給Z
wire Z, A, B ;
assign #10 Z = A & B ;
//隱式時延,聲明一個wire型變量時對其進行包含一定時延的連續(xù)賦值。
wire A, B;
wire #10 Z = A & B;
//聲明時延,聲明一個wire型變量是指定一個時延。因此對該變量所有的連續(xù)賦值都會被推遲到指定的時間。除非門級建模中,一般不推薦使用此類方法建模。
wire A, B;
wire #10 Z ;
assign Z =A & B
在上述例子中,A 或 B 任意一個變量發(fā)生變化,那么在 Z 得到新的值之前,會有 10 個時間單位的時延。如果在這 10 個時間單位內(nèi),即在 Z 獲取新的值之前,A 或 B 任意一個值又發(fā)生了變化,那么計算 Z 的新值時會取 A 或 B 當前的新值。所以稱之為慣性時延,即信號脈沖寬度小于時延時,對輸出沒有影響。
因此仿真時,時延一定要合理設(shè)置,防止某些信號不能進行有效的延遲。
對一個有延遲的與門邏輯進行時延仿真。
module time_delay_module(
input ai, bi,
output so_lose, so_get, so_normal);
assign #20 so_lose = ai & bi ;
assign #5 so_get = ai & bi ;
assign so_normal = ai & bi ;
endmodule
testbench 參考如下:
`timescale 1ns/1ns
module test ;
reg ai, bi ;
wire so_lose, so_get, so_normal ;
initial begin
ai = 0 ;
#25 ; ai = 1 ;
#35 ; ai = 0 ; //60ns
#40 ; ai = 1 ; //100ns
#10 ; ai = 0 ; //110ns
end
initial begin
bi = 1 ;
#70 ; bi = 0 ;
#20 ; bi = 1 ;
end
time_delay_module u_wire_delay(
.ai (ai),
.bi (bi),
.so_lose (so_lose),
.so_get (so_get),
.so_normal (so_normal));
initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end
endmodule
仿真結(jié)果如下:
信號 ?so_normal
?為正常的與邏輯。
由于所有的時延均大于 5ns,所以信號 ?so_get
?的結(jié)果為與操作后再延遲 5ns 的結(jié)果。
信號 ?so_lose
?前一段是與操作后再延遲 20ns 的結(jié)果。
由于信號 ai 第二個高電平持續(xù)時間小于 20ns,?so_lose
?信號會因慣性時延而漏掉對這個脈沖的延時檢測,所以后半段 ?so_lose
?信號仍然為 0。
點擊這里下載源碼
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: