1. 亞穩態
亞穩態是指觸發器無法在某個規定的時間段內到達一個可以確認的狀態。
發生情況
在跨時鐘域傳輸或者異步信號采集時可能發生。
- 跨時鐘域信號傳輸
由于源寄存器時鐘和目的寄存器時鐘相移未知,所以源寄存器數據發出數據,數據可能在任何時間到達異步時鐘域的目的寄存器,所以無法保證滿足目的寄存器和
的要求;
- 異步信號采集
由于異步信號可以在任意時間點到達目的寄存器,所以也無法保證滿足目的寄存器和
的要求;復位信號一般都是異步,常常會產生亞穩態。
如何避免
發生概率
概率 = (建立時間 + 保持時間)/ 采集時鐘周期
可見隨著clk頻率的增加,亞穩態發生的幾率是增加。
串擾
一般使用異步信號時,好的設計會采用多級D觸發器級聯,來同步異步信號,如下圖所示。
這樣即使第一級產生亞穩態,第二級也有很大概率穩定輸出。下圖就是當第一個寄存器發生亞穩態后,經過Tmet的振蕩穩定后,第二級寄存器能采集到一個穩定的值。
但是當Tmet時間長到大于一個采集周期后,那第二級寄存器就會采集到亞穩態,如下圖所示。亞穩態產生了串擾,從第一級寄存器傳到了第二級寄存器,同樣也可能從第二級寄存器串擾到第三級寄存器。
兩級觸發器可防止亞穩態傳播的原理
假設第一級觸發器的輸入不滿足其建立保持時間,它在第一個脈沖沿到來后輸出的數據就為亞穩態,那么在下一個脈沖沿到來之前,其輸出的亞穩態數據在一段恢復時間后必須穩定下來,而且穩定的數據必須滿足第二級觸發器的建立時間,如果都滿足了,在下一個脈沖沿到來時,第二級觸發器將不會出現亞穩態,因為其輸入端的數據滿足其建立保持時間。有效的條件:
第一級觸發器進入亞穩態后的恢復時間 + 第二級觸發器的建立時間 <= 時鐘周期
更確切地說,輸入脈沖寬度必須大于同步時鐘周期與第一級觸發器所需的保持時間之和。最保險的脈沖寬度是兩倍同步時鐘周期。所以,這樣的同步電路對于從較慢的時鐘域來的異步信號進入較快的時鐘域比較有效,對于進入一個較慢的時鐘域,則沒有作用。
常用的消除亞穩態
- 相位控制,一個時鐘由DLL或PLL產生,周期不同,相位相同;
- 采用FIFO對跨時鐘域數據通信進行緩沖設計;
- 打兩拍技術,就是上面觸發器級聯;
- 降低時鐘頻率,根據前面的概率計算
2. 鎖存器和觸發器
- 鎖存器 latch
透明,電平觸發。
在不鎖存數據時,輸出端的信號隨輸入信號變化;鎖存時,輸入信號不起作用。不能過濾毛刺,避免產生鎖存器很重要。 - 觸發器 flip-flop
不透明,邊沿觸發。
可由鎖存器和反相器構成。輸入變化時,輸出不同時變化。
3. 系統最高頻率計算
:觸發器中數據從輸入端到輸出端的延時,
:組合邏輯的延時
:建立時間
則為了確保數據能被下一級觸發器接收到,在滿足下一級觸發器的建立時間之前,不能來新的時鐘沿,所以時鐘有如下約束:
即Tmin =Tco+Tdelay+Tsetup,最快的時鐘頻率Fmax =1/Tmin。
4. 鎖相環
顧名思義,就是鎖定相位的環路,利用外部輸入的參考信號控制環路內部振蕩信號的頻率和相位。
- PLL:Phase lock loop
又稱模擬鎖相環,由鑒相器、環路濾波器和壓控振蕩器組成,鑒相器用來鑒別輸入信號Ui與輸出信號Uo之間的相位差,并輸出誤差電壓Ud。Ud中的噪聲和干擾成分被低通性質的環路濾波器濾除。形成壓控振蕩器(Vco)的控制電壓Uc,Uc作用于壓控振蕩器的結果是把它的輸出震蕩頻率fo拉向環路輸入信號頻率fi,當二者相等時,環路被鎖定,稱為入鎖。PLL并不是直接對晶振進行倍頻,而是將頻率穩定的晶振作為基準信號,與PLL內部振蕩電路生成的信號分頻后進行比較,使PLL輸出的信號頻率穩定 - DLL:Delay Lock Loop
又稱數字鎖相環,基于數字抽樣方式,在輸入時鐘和反饋時鐘之間插入延遲,使輸入時鐘和反饋時鐘的上升沿一致來實現的。
上圖是兩者的原理,兩者功能上都可以實現倍頻、分頻、占空比調整,但是PLL調節范圍更大。DLL數字電路實現,抗噪聲,低功耗,抗抖動,移植性好。
5. LUT查找表
查找表(look-up-table)簡稱為LUT,LUT本質上就是一個RAM。目前FPGA中多使用4輸入的LUT,所以每一個LUT可以看成一個有 4位地址線的16x1的RAM。當用戶通過原理圖或HDL語言描述了一個邏輯電路以后,PLD/FPGA開發軟件會自動計算邏輯電路的所有可能的結果,并把結果事先寫入RAM,這樣,每輸入一個信號進行邏輯運算就等于輸入一個地址進行查表,找出地址對應的內容,然后輸出即可
6. 常用的邏輯電平
常用邏輯電平:12V,5V,3.3V
常用邏輯電平:TTL、CMOS、LVTTL、LVCMOS、ECL(Emitter Coupled Logic)、PECL(Pseudo/Positive Emitter Coupled Logic)、LVDS(Low Voltage Differential Signaling)、GTL(Gunning Transceiver Logic)、BTL(Backplane Transceiver Logic)、ETL(enhanced transceiver logic)、GTLP(Gunning Transceiver Logic Plus);RS232、RS422、RS485(12V,5V,3.3V)
TTL和CMOS 不可以直接互連,由于TTL是在0.3-3.6V之間,而CMOS則是有在12V的有在5V的。CMOS輸出接到TTL是可以直接互連。TTL接到 CMOS需要在輸出端口加一上拉電阻接到5V或者12V。用CMOS可直接驅動TTL;加上拉電阻后,TTL可驅動CMOS.
7. MOORE 與 MEELEY
- Moore 狀態機的輸出僅與當前狀態值有關, 且只在時鐘邊沿到來時才會有狀態變化。
- Mealy 狀態機的輸出不僅與當前狀態值有關, 而且與當前輸入值有關。
8. STA與DTA
- 靜態時序分析 STA
靜態時序分析是采用窮盡分析方法來提取出整個電路存在的所有時序路徑,計算信號在這些路徑上的傳播延時,檢查信號的建立和保持時間是否滿足時序要求,通過對最大路徑延時和最小路徑延時的分析,找出違背時序約束的錯誤。
優點:
1.它不需要輸入向量就能窮盡所有的路徑;
2.運行速度很快、占用內存較少,不僅可以對芯片設計進行全面的時序功能檢查,而且還可利用時序分析的結果來優化設計。
缺點:
- 靜態時序分析不能檢驗設計功能
- 靜態時序分析只能對同步電路進行分析,而不能對異步電路進行時序分析。
- 動態時序分析 DTA
動態時序模擬就是通常的仿真,是所有的輸入信號都會給一個不同時刻的激勵,在testbech(.sp或者.v)中設置一段仿真時間,最后對仿真結果進行時序和功能分析。 這里的仿真可以是門級或者晶體管級,包括spice格式和RTL格式的網表。
優點:
比較精確,而且同靜態時序相比較,它適用于更多的設計類型。
缺點:
1.分析的速度比較慢
2.關鍵路徑無法檢查全,里面可能有fail的path,芯片流片出來無法工作
關鍵路徑就是輸入到輸出延時最大的路徑
8. MOS管
用MOS管搭與非門,上面畫的是電子的流向,P溝道是G低導通。
9. 可編程邏輯器件
PAL,PLA,GAL,CPLD,FPGA
10. 建立時間和保持時間
建立時間(setup time)
觸發器在時鐘沿到來之前,其數據的輸入端的數據必須保持不變的時間;建立時間決定了該觸發器之間的組合邏輯的最大延遲。保持時間(hold time)
觸發器在時鐘沿到來之后,其數據輸入端的數據必須保持不變的時間;保持時間決定了該觸發器之間的組合邏輯的最小延遲。
Tffpd:觸發器輸出的響應時間,也就是觸發器的輸出在clk時鐘上升沿到來之后多長的時間內發生變化并且穩定,也可以理解為前面的Tco。
Tcomb:觸發器的輸出經過組合邏輯所需要的時間,也就是前面的組合邏輯延遲Tdelay。
Tsetup:建立時間
Thold:保持時間
Tclk:時鐘周期
建立時間容限:相當于保護時間,這里要求建立時間容限大于等于0。
保持時間容限:保持時間容限也要求大于等于0。
- 恢復時間
復位、清零信號在時鐘有效沿之前保持的最小時間長度- 移除時間
復位、清零信號在時鐘有效沿之后保持的最小時間長度
11. 用傳輸門和反相器器搭一個邊沿觸發器(DFF)
12. OTP、MASK、FLASH
MCU按其存儲器類型可分為MASK(掩模)ROM、OTP(一次性可編程)ROM、FLASHROM等類型。
- MASKROM
掩模片,價格便宜,但程序在出廠時已經固化,適合程序固定不變的應用場合; - FALSHROM
程序可以反復擦寫,靈活性很強,但價格較高,適合對價格不敏感的應用場合或做開發用途 - OTP ROM
One Time Programmable,僅能編程一次,價格介于前兩者之間,適合既要求一定靈活性,又要求低成本的應用場合
13. 天線效應
在芯片生產過程中,暴露的金屬線或者多晶硅(polysilicon)等導體,就象是一根根天線,會收集電荷(如等離子刻蝕產生的帶電粒子)導致電位升高。天線越長,收集的電荷也就越多,電壓就越高。若這片導體碰巧只接了MOS 的柵,那么高電壓就可能把薄柵氧化層擊穿,使電路失效。
隨著工藝技術的發展,柵的尺寸越來越小,金屬的層數越來越多,發生天線效應的可能性就越大。
14. 異步FIFO
FIFO是一種現先進先出的數據緩沖器,特點是沒有外部的讀寫地址。根據滿和空信號設計寫使能和讀使能來寫/讀FIFO,當FIFO滿的時候不可以往里面寫、當FIFO空的時候不能讀數據。
異步FIFO常用于跨時鐘域傳輸。
常見信號
- wfull: 滿標志, 表示FIFO已經滿,不能再寫入數據。
- rempty:空標志,表示FIFO已經空,不能再讀取數據。
- wclk: 寫時鐘
- rclk: 讀時鐘
- winc: 寫使能
- rinc: 讀使能
- wdata:寫數據
- rdata: 讀數據
- wrst_n: 寫復位
- rrst_n:讀復位
空滿標志產生
- 判空:讀指針追上寫指針的時候,兩者相等,為空。
- 判滿:寫指針追上讀指針的時候,兩者相等,為滿。
如何判斷誰追上誰
表示讀寫指針的數據位寬上再加1位來區分是滿還是空。比如FIFO的深度位8,那么需要3位二進制數來表地址,則需要再最高之前再加一位,變成4位。一開始讀寫都是0000,FIFO為空。當寫指針增加并越過最后一個存儲單元的時候,就將這個最高位取反,變成1000。這時是寫地址追上了讀地址,FIFO為滿。同理,當讀地址越過最后一個存儲單元的時候把讀地址的最高位也取反。
當最高位相同,并且剩下的位也相同時,FIFO為空;
當最高位不同,并且剩下的位相同時,FIFO為滿。
異步時鐘下判斷空滿
需要將讀寫指針進行同步化才可以進行判斷。通過兩級D觸發器。
- 在判斷空的時候,需要將寫地址同步到讀時鐘域下進行判斷。
- 在判斷滿的時候,需要將讀時鐘域中的讀指針同步到寫時鐘域進行判斷。
格雷碼表示地址
將讀指針發送到寫時鐘域下進行同步時,如果仍然采用自然二進制,那么就會面臨地址同時有多位變化的情況。因此采用格雷碼來表示地址,每次只改變一位。
格雷碼與二進制轉換
- 二進制轉格雷碼
gray = (bin >> 1) ^ bin
異或 - 格雷碼轉二進制
格雷碼記法:
- 0位:0 1 1 0重復
- 1位:00 11 11 00重復
- 2位:0000 1111 1111 0000重復
- 3位:00000000 11111111 11111111 00000000
格雷碼判空滿
- 判滿:格雷碼的最高位和次高為不同,剩下的都同,就是滿。
- 判空:格雷碼完全相同,就是空。
可以參考下面圖片,隔8個為滿,相同為空。可見前兩位不同,其余相同就是滿。
模塊設計
如上圖所示的同步模塊synchronize to write clk,其作用是把讀時鐘域的讀指針rd_ptr采集到寫時鐘(wr_clk)域,然后和寫指針wr_ptr進行比較從而產生或撤消寫滿標志位wr_full;類似地,同步模塊synchronize to read clk的作用是把寫時鐘域的寫指針wr_ptr采集到讀時鐘域,然后和讀指針rd_ptr進行比較從而產生或撤消讀空標志位rd_empty。
另外還有寫指針wr_ptr和寫滿標志位wr_full產生模塊,讀指針rd_ptr和讀空標志位rd_empty產生模塊,以及雙端口存儲RAM模塊。
代碼實現
代碼搬運于網絡
// 頂層模塊
module AsyncFIFO#(
parameter ADDR_SIZE = 4,
parameter DATA_SIZE = 8
)
(
input [DATA_SIZE-1:0] wdata,
input winc,
input wclk,
input wrst_n,
input rinc,
input rclk,
input rrst_n,
output [DATA_SIZE-1:0] rdata,
output wfull,
output rempty
);
wire [ADDR_SIZE-1:0] waddr,raddr;
wire [ADDR_SIZE:0] wptr,rptr,wq2_rptr,rq2_wptr;
// 時鐘同步
sync_r2w #(
.ADDR_SIZE(ADDR_SIZE)
)
I1_sync_r2w(
.wq2_rptr(wq2_rptr),
.rptr(rptr),
.wclk(wclk),
.wrst_n(wrst_n)
);
sync_w2r #(
.ADDR_SIZE(ADDR_SIZE)
)I2_sync_w2r(
.rq2_wptr(rq2_wptr),
.wptr(wptr),
.rclk(rclk),
.rrst_n(rrst_n)
);
// 雙口RAM
DualRAM #(
.ADDR_SIZE(ADDR_SIZE),
.DATA_SIZE(DATA_SIZE)
)I3_DualRAM(
.rdata(rdata),
.wdata(wdata),
.waddr(waddr),
.raddr(raddr),
.wclken(winc),
.wclk(wclk)
);
// 空判斷
rptr_empty #(
.ADDR_SIZE(ADDR_SIZE)
)I4_rptr_empty(
.rempty(rempty),
.raddr(raddr),
.rptr(rptr),
.rq2_wptr(rq2_wptr),
.rinc(rinc),
.rclk(rclk),
.rrst_n(rrst_n));
// 滿判斷
wptr_full #(
.ADDR_SIZE(ADDR_SIZE)
)I5_wptr_full(
.wfull(wfull),
.waddr(waddr),
.wptr(wptr),
.wq2_rptr(wq2_rptr),
.winc(winc),
.wclk(wclk),
.wrst_n(wrst_n));
endmodule
// 雙口RAM模塊
module DualRAM #(
parameter DATA_SIZE = 8,//數據位寬
parameter ADDR_SIZE = 4//FIFO地址寬度
)(
input wclken,
input wclk,
input [ADDR_SIZE-1:0] raddr,
input [ADDR_SIZE-1:0] waddr,
input [DATA_SIZE-1:0] wdata,
output [DATA_SIZE-1:0] rdata
);
localparam RAM_DEPTH = 1<<ADDR_SIZE;//RAM深度,1左移4位為16
reg [DATA_SIZE-1:0] mem [0:RAM_DEPTH-1];//開辟內存
always@(posedge wclk) begin
if(wclken==1'b1) begin
mem[waddr] <= wdata;
end
else begin
mem[waddr] <= mem[waddr];//保持
end
end
assign rdata = mem[raddr];//給地址直接出數據
endmodule
// 寫指針同步到讀時鐘
module sync_w2r#(
parameter ADDR_SIZE = 4
)
(
input [ADDR_SIZE:0] wptr,
input rclk,
input rrst_n,
output reg [ADDR_SIZE:0] rq2_wptr
);
reg [ADDR_SIZE:0] rq1_wptr;
//D觸發器,兩級同步
always@(posedge rclk or negedge rrst_n) begin
if(!rrst_n) begin
{rq2_wptr,rq1_wptr} <=0;
end
else begin
{rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
end
end
endmodule
// 讀指針同步到寫時鐘
module sync_r2w#(
parameter ADDR_SIZE = 4)
(
input [ADDR_SIZE:0] rptr,
input wclk,
input wrst_n,
output reg [ADDR_SIZE:0] wq2_rptr
);
reg [ADDR_SIZE:0] wq1_rptr;
//D觸發器,兩級同步
always@(posedge wclk or negedge wrst_n) begin
if(!wrst_n) begin
{wq2_rptr,wq1_rptr} <= 0;
end
else begin
{wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
end
end
endmodule
// 判空模塊
module rptr_empty#(
parameter ADDR_SIZE = 4
)
(
output reg rempty,
output [ADDR_SIZE-1:0] raddr,//輸出到RAM的讀地址
output reg [ADDR_SIZE:0] rptr,//輸出到寫時鐘域的格雷碼
input [ADDR_SIZE:0] rq2_wptr,
input rinc,
input rclk,
input rrst_n
);
reg [ADDR_SIZE:0] rbin;//二進制地址
wire [ADDR_SIZE:0] rgraynext,rbinnext;//二進制和格雷碼地址
wire rempty_val;
//----------------------------
//地址邏輯
//----------------------------
always@(posedge rclk or negedge rrst_n)begin
if(!rrst_n)begin//
rbin <=0;
rptr <= 0;
end
else begin //
rbin <= rbinnext;
rptr <= rgraynext;
end
end
//地址產生邏輯
assign rbinnext = !rempty ?(rbin+rinc):rbin;
assign rgraynext = (rbinnext>>1)^(rbinnext);
assign raddr = rbin[ADDR_SIZE-1:0];
//FIFO判空
assign rempty_val = (rgraynext==rq2_wptr) ;
always@(posedge rclk or negedge rrst_n)begin
if(!rrst_n)
rempty <= 1'b1;
else begin
rempty <= rempty_val;
end
end
endmodule
// 判滿模塊
module wptr_full#(
parameter ADDR_SIZE = 4
)
(
output reg wfull,
output [ADDR_SIZE-1:0] waddr,
output reg [ADDR_SIZE:0] wptr,
input [ADDR_SIZE:0] wq2_rptr,
input winc,
input wclk,
input wrst_n
);
reg [ADDR_SIZE:0] wbin;
wire [ADDR_SIZE:0] wbinnext;
wire [ADDR_SIZE:0] wgraynext;
wire wfull_val;
always@(posedge wclk or negedge wrst_n) begin
if(!wrst_n)begin
wbin <= 0;
wptr <= 0;
end
else begin
wbin <= wbinnext;
wptr <= wgraynext;
end
end
//地址邏輯
assign wbinnext = !wfull?(wbin + winc):wbin;
assign wgraynext = (wbinnext>>1)^wbinnext;
assign waddr = wbin[ADDR_SIZE-1:0];
//判滿
assign wfull_val = (wgraynext=={~wq2_rptr[ADDR_SIZE:ADDR_SIZE-1],wq2_rptr[ADDR_SIZE-2:0]});//最高兩位取反,然后再判斷
always@(posedge wclk or negedge wrst_n)begin
if(!wrst_n)
wfull <=0;
else begin
wfull <= wfull_val;
end
end
endmodule
15. 低功耗
clock gating 門控時鐘
傳統的設計方法是時鐘信號一直是存活著的(常開),門控時鐘技術就是根據設計,將暫時不用的模塊的時鐘信號通過一個控制信號gating住,降低這個模塊的時鐘信號翻轉率。
幾種門控時鐘的比較-
power gating 門控電源
電源門控是指芯片中某個區域的供電電源被關掉,即該區域內的邏輯電路的供電電源斷開。在數字IC后端設計中,經常采用這個策略降低功耗。在后端實現過程中,加入MTCMOS來控制標準單元的開關。
power gating -
MULT-VT 多閾值電壓
閾值電壓Vt越高的單元,它的漏電功耗越低,但門延遲越長,也就是速度慢;
閾值電壓Vt越低的單元,它的漏電功耗越高,但門延遲越短,也就是速度快。
多閾值電壓
HVT/SVT/LVT的意思
- high Vt
- Standard Vt(也有稱為Regular Vt,即RVT)
- low Vt
閾值電壓越低,因為飽和電流變小,所以速度性能越高;但是因為漏電流會變大,因此功耗會變差。
- MULT-Voltage 多電壓域
不同的模塊根據需要以不同的電壓、不同的頻率工作。 - DVFS 動態電壓頻率調節
根據的芯片當時的實際功耗需要設定工作電壓和時鐘頻率,這樣可以保證提供的功率既滿足要求又不會過剩,從而可以降低功耗。比如CPU的頻率。
16. 綜合
綜合工具:Synplify,XST,Galileo,DC(Design Complier)
綜合的過程一般都分兩個:systhesis和optimization。
- systhesis是把行為級的描述通過一定的算法轉成門級描述,這一過程與具體的工藝庫無關、更與用戶的約束無關。
- Optimization是將已經轉化成門級的描述,在用戶的約束下,通過算法映射到相應的工藝庫中的器件上。對ASIC而言是映射到廠商的Gate庫,而對FPGA而言即映射到FPGA器件的單元結構中
生成文件
- 網表文件(*.v)
- 時序文件(*.SDF)
- 設計約束文件(*.SDC)
代碼風格
- 資源共享的應用限制在同一個module中。這樣綜合工具才能最大限度發揮其資源共享的綜合作用。
- 盡可能將Critical Path上所有相關邏輯放在同一個module中。這樣綜合工具能發揮最佳的綜合效果。
- Critical Path所在的module與其它module分別綜合,對critical path采用速度有限的綜合策略,對其他module采用面積優先的綜合策略。
- 盡可能去Register所有的Output。這樣的話,方便加約束,并且一條路徑上的組合邏輯不。可能分散在各個module中。可以比較方便地達到面積、速度雙贏的目的。
- 一個module的Size不能太大,具體的大小得看綜合工具了。
- 一個module盡量采用一個時鐘,或者整個設計只有一個時鐘。
搬運自風中少年的綜合理解
17. 芯片設計流程
- ASIC設計流程
- 邏輯設計
芯片架構,RTL設計,功能仿真,綜合,DFT(可測試性設計),等價性檢驗(形式驗證),靜態時序分析 - 物理設計
布局規劃,時鐘樹綜合,布局布線,LVS布線圖與原理圖比較,DRC設計規則檢查,簽名靜態時序分析,GDSII
各個步驟用到的軟件
- FPGA設計流程
- 邏輯設計
芯片架構,RTL設計,功能仿真,綜合 - 物理設計
邏輯塊映射,布局布線,基于仿真的SDF,簽名靜態時序分析,設備編程
18. 時序路徑
- 始發點
組合邏輯:數據輸入
時序單元:時鐘輸入 - 終止點
組合邏輯:數據輸出
時序單元:數據輸入
- 觸發器到觸發器(內部時序路徑)
始發點為時序單元的時鐘輸入;
終止點為時序單元的數據輸入; - 觸發器到輸出端(外部時序路徑)
始發點為時序單元的時鐘輸入;
終止點為組合邏輯的數據輸出; - 輸入端到觸發器
始發點為組合邏輯的數據輸入;
終止點為時序單元的數據輸入; - 輸入端到輸出端
始發點為組合邏輯的數據輸入;
終止點為組合邏輯的數據輸出;
分別為下圖中的Path2、Path3、Path1、Path4
19. 異步復位同步釋放
一般來說,同步系統,都使用異步復位。這是因為同步復位的電路實現,比異步復位的電路實現,要浪費更多電路資源。
當不在同一時鐘域的情況下,就需要對異步復位信號做同步處理,即用異步復位同步釋放,否則異步復位信號不滿足恢復釋放時間會產生亞穩態。
同步復位
同步復位就是指復位信號只有在時鐘上升沿到來時,才能有效。
module sync_rst(
input clk,
input rst_n,
input din,
output dout
);
always @(posedge clk) begin
if(!rst_n)
dout <= 1'b0;
else
dout <= din;
end
endmodule
異步復位
異步復位是指無論時鐘沿是否到來,只要復位信號有效,就對系統進行復位。
module async_rst(
input clk,
input rst_n,
input din,
output dout
);
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
dout <= 1'b0;
else
dout <= din;
end
endmodule
異步復位同步釋放
所謂異步復位和同步釋放,是指復位信號是異步有效的,即復位的發生與clk無關。后半句“同步釋放”是指復位信號的撤除(釋放)則與clk相關,即同步的。
異步復位:
顯而易見,rst_async_n異步復位后,兩個觸發器清零,rst_sync_n將拉低,即實現異步復位。同步釋放:
當復位信號rst_async_n撤除時,由于雙緩沖電路的作用,rst_sync_n復位信號不會隨著rst_async_n的撤除而撤除,而要等待clk信號。
代碼實現如下:
module rst(
input clk,
input rst_n, // 異步復位
output rst_sync_n // 同步后的異步信號
);
always @ (posedge clk or negedge rst_n)
if (!rst_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
endmodule
20. VPI接口
VPI,Verilog Procedural Interface,Verilog過程接口
進行RTL仿真時,有時候會遇到HDL工程和C語言工程進行交互,Verilog提供了VPI。
VPI使用介紹DPI,SystemVerilog提供的接口。
21. 組合邏輯消除毛刺
D觸發器的D輸入端,只要毛刺不能出現在時鐘的上升沿并且滿足數據的建立和保持時間,就不會對系統造成危害。因此可以說D觸發器的D輸入端對毛刺不敏感。可以通過給組合邏輯的輸出接觸發器來消除毛刺。
但D觸發器的時鐘端、置位端、清零端,則都是對毛刺敏感的輸入端。