時延一般是不可綜合的。
暫存器的時延也是可以控制的,這部分在時序控制裡加以說明。
連續賦值時延一般可分為普通賦值時延、隱式時延、宣告時延。
下面 3 個例子實現的功能是等效的,分別對應 3 種不同連續賦值時延的寫法。
//普通時延,a&b計算結果延時10個時間單位賦值給z
wire z, a, b ;
assign #10 z = a & b ;
//隱式時延,宣告乙個wire型變數時對其進行包含一定時延的連續賦值。
wire a, b;
wire #10 z = a & b;
//宣告時延,宣告乙個wire型變數是指定乙個時延。因此對該變數所有的連續賦值都會被推遲到指定的時間。除非門級建模中,一般不推薦使用此類方法建模。
wire a, b;
wire #10 z ;
assign z =a & b
慣性時延
在上述例子中,a 或 b 任意乙個變數發生變化,那麼在 z 得到新的值之前,會有 10 個時間單位的時延。如果在這 10 個時間單位內,即在 z 獲取新的值之前,a 或 b 任意乙個值又發生了變化,那麼計算 z 的新值時會取 a 或 b 當前的新值。所以稱之為慣性時延,即訊號脈衝寬度小於時延時,對輸出沒有影響。
因此**時,時延一定要合理設定,防止某些訊號不能進行有效的延遲。
對乙個有延遲的與門邏輯進行時延**。
例項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
endinitial begin
bi = 1 ;
#70 ; bi = 0 ;
#20 ; bi = 1 ;
endtime_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 ;
endend
end
endmodule
**結果如下:
訊號 so_normal 為正常的與邏輯。
由於所有的時延均大於 5ns,所以訊號 so_get 的結果為與操作後再延遲 5ns 的結果。
訊號 so_lose 前一段是與操作後再延遲 20ns 的結果。
由於訊號 ai 第二個高電平持續時間小於 20ns,so_lose 訊號會因慣性時延而漏掉對這個脈衝的延時檢測,所以後半段 so_lose 訊號仍然為 0。
蔣麗苑,C 虛成員函式表vtable
通過前兩節的介紹,想必對多型有一定的了解了。這一節將介紹多型是如何實現的,關於如何實現多型,對於程式設計人員來說即使不知道也是完全沒有關係的,但是對於加深對多型的理解具有重要意義,故而在此節中稍微闡述一下多型的實現機制。在c 中通過虛成員函式表vtable實現多型,虛函式表中儲存的是類中虛函式的入口...
蔣麗苑,C語言位域(位段)詳解
在結構體定義時,我們可以指定某個成員變數所占用的二進位制位數 bit 這就是位域。請看下面的例子 struct bs 後面的數字用來限定成員變數占用的位數。成員 m 沒有限制,根據資料型別即可推算出它占用 4 個位元組 byte 的記憶體。成員 n ch 被 後面的數字限制,不能再根據資料型別計算長...