標題: 全局時鐘--復位設(shè)計 [打印本頁]

作者: 51黑fan    時間: 2016-1-31 04:22
標題: 全局時鐘--復位設(shè)計
簡單來說,就是利用雙觸發(fā)器將復位信號打慢一拍來保證穩(wěn)定性
另外,亞穩(wěn)態(tài)的形成,簡單來理解,就是異步操作中,建立時間和保持時間沒有符合要求所出現(xiàn)的異常狀態(tài)
另外,關(guān)鍵的關(guān)鍵,讀別人的代碼一定要有耐心,從代碼中去理解前人的思路

=========================================================

所謂亞穩(wěn)態(tài),是指“trecovery(recovery time <恢復時間>)指的是原本有效的異步復位信號釋放(對低電平有效的復位來說就是上跳沿)與緊跟其后的第一個時鐘有效沿之間所必須的最小時間。tremoval(removal time<去除時間>)指的是時鐘有效沿與緊跟其后的原本有效的異步復位信號變得無效之間所必須的最小時間。如果異步復位信號的上跳沿(以低電平有效為例)落在trecovery與tremoval的窗口之內(nèi),觸發(fā)器的輸出端的值將是不確定的,可能是高電平,可能是低電平,可能處于高低電平之間,也可能處于震蕩狀態(tài)),并且在未知的時刻會固定到高電平或低電平。這種狀態(tài)就稱為亞穩(wěn)態(tài)。反映到仿真模型中,輸出端的值是不定態(tài)X。圖中tclk-q是觸發(fā)器時鐘端到Q端的延時,tMET是保證亞穩(wěn)態(tài)不傳播到下一級所允許的亞穩(wěn)態(tài)持續(xù)的最大時間。”
  個人理解:如果RST_n的釋放發(fā)生在靠近時鐘沿或者離時鐘沿很近的電,電路可能級沒有足夠的時間維持RST_n的值,也沒有足夠的時間維持D輸入端口的值,從而造成亞穩(wěn)態(tài),并通過最后一級與非門傳到Q端輸出。
同步復位:(復位信號的產(chǎn)生依賴于系統(tǒng)時鐘信號)
優(yōu)缺點:更好的避免亞穩(wěn)態(tài),但是消耗更多的LE
時鐘起到了過濾復位信號小毛刺的作用
同步復位需要一個脈寬沿展器來保證復位信號有一定脈沖寬度,以確保時鐘的有效沿能采樣到
always@(posedge CLK)
begin
    if(!RST_n)
        b <= 0;
    else
        b <= a;
end
異步復位:(復位信號和系統(tǒng)時鐘信號相互獨立,可以發(fā)生在任何時候)
優(yōu)缺點:消耗更少的LE,但是難以避免LE的消耗
always@(posedge CLK or negedge RST_n)
begin
    if(!RST_n)
        b <= 0;
    else
        b <= a;
end
因此,如果對復位信號的處理,能夠同步復位+異步復位,那將會是很完美,基于這樣的設(shè)計能夠避免亞穩(wěn)態(tài)的發(fā)生,因為他讓RST_n信號的釋放再晚了一點(寄存器)
根據(jù)特權(quán)和eBoy的設(shè)計,我加之以深化,歸納了3中我們會用到的復位與亞穩(wěn)態(tài)問題
(1)沒有PLL
(2)有一個PLL
(3)多個PLL
具體如下:
(1)沒有PLL
/********************************************************************
* File Name          : System_Ctrl
* Author             : Crazy Bingo
* Version            : Quartus II 9.1
* Date               : 2010/12/4
* Function             : 雙鎖相環(huán)系統(tǒng)異步復位
* Description        :
*********************************************************************/
module System_Ctrl0
(
    input         clk,        //FPAG輸入時鐘信號50MHz
    input         rst_n,        //系統(tǒng)復位信號,低有效
    output         sys_rst_n    //系統(tǒng)復位信號,低有效
);
reg    rst_nr1,rst_nr2;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)    rst_nr1 <= 0;
    else        rst_nr1 <= 1;
end
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)    rst_nr2 <= 0;
    else        rst_nr2 <= rst_nr1;
end
assign    sys_rst_n = rst_nr2;
endmodule

(2)一個PLL
/********************************************************************
* File Name          : System_Ctrl
* Author             : Crazy Bingo
* Version            : Quartus II 9.1
* Date               : 2010/12/4
* Function             : 雙鎖相環(huán)系統(tǒng)異步復位
* Description        :
*********************************************************************/
module System_Ctrl1
(
    input         clk,        //FPAG輸入時鐘信號50MHz
    input         rst_n,        //系統(tǒng)復位信號,低有效
    output         sys_rst_n,    //系統(tǒng)復位信號,低有效
    output         clk_125,    //PLL1輸出125MHz時鐘
    output        clk_65        //PLL2輸出65MHz時鐘
);
//----------------------------------------------
//PLL復位信號產(chǎn)生,高有效,異步復位,同步釋放輸出
wire    pll_rst;            //PLL復位信號,高有效
reg     rst_r1,rst_r2;        //DFF觸發(fā),穩(wěn)定信號
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)  rst_r1 <= 1'b1;
    else        rst_r1 <= 1'b0;
end
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)     rst_r2 <= 1'b1;
    else        rst_r2 <= rst_r1;
end
assign pll_rst = rst_r2;
//----------------------------------------------
//系統(tǒng)復位信號產(chǎn)生,低有效,異步復位,同步釋放
//等待兩個鎖相環(huán)都輸出穩(wěn)定的時候,系統(tǒng)釋放復位
wire     locked;            //PLL輸出有效標志位,高表示PLL輸出有效
wire     sysrst_nr0 = rst_n & locked;    //系統(tǒng)復位直到PLL有效輸出;
reg     sysrst_nr1,sysrst_nr2;
always @(posedge clk_125 or negedge sysrst_nr0)
begin
    if(!sysrst_nr0)
        begin
        sysrst_nr1 <= 1'b0;
        sysrst_nr2 <= 1'b0;
        end        
    else
        begin
        sysrst_nr1 <= 1'b1;
        sysrst_nr2 <= sysrst_nr1;
        end
end
assign sys_rst_n = sysrst_nr2;
//----------------------------------------------
//例化PLL1產(chǎn)生模塊
PLL1     PLL1
(
    .areset(pll_rst),    //PLL復位信號,高電平復位
    .inclk0(clk),        //PLL輸入時鐘,50MHz
    .c0(clk_125),        //PLL輸出125MHz時鐘        
    .c1(clk_65),        //PLL輸出125MHz時鐘(-3.5ns)        
    .locked(locked)        //PLL輸出有效標志位,高表示PLL輸出有效
);
endmodule
(3)多個PLL
/********************************************************************
* File Name          : System_Ctrl
* Author             : Crazy Bingo
* Version            : Quartus II 9.1
* Date               : 2010/12/4
* Function             : 雙鎖相環(huán)系統(tǒng)異步復位
* Description        :
*********************************************************************/
module System_Ctrl
(
    input         clk1,        //FPAG輸入時鐘信號50MHz
    input        clk2,        //FPAG輸入時鐘信號50MHz
    input         rst_n,        //系統(tǒng)復位信號,低有效
    output         sys_rst_n,    //系統(tǒng)復位信號,低有效
    output         clk_125,    //PLL1輸出125MHz時鐘
    output         clk_125_2,    //PLL1輸出125MHz時鐘(-3.5ns)
    output        clk_65        //PLL2輸出65MHz時鐘
);
//----------------------------------------------
//PLL1,PLL2復位信號產(chǎn)生,高有效,異步復位,同步釋放輸出
wire    pll_rst1;            //PLL1復位信號,高有效
wire    pll_rst2;            //PLL2復位信號,高有效
reg     rst_r1,rst_r2;        //DFF觸發(fā),穩(wěn)定信號
always @(posedge clk1 or negedge rst_n)
begin
    if(!rst_n)  rst_r1 <= 1'b1;
    else        rst_r1 <= 1'b0;
end
always @(posedge clk1 or negedge rst_n)
begin
    if(!rst_n)     rst_r2 <= 1'b1;
    else        rst_r2 <= rst_r1;
end
assign pll_rst1 = rst_r2;
assign pll_rst2 = rst_r2;
//----------------------------------------------
//系統(tǒng)復位信號產(chǎn)生,低有效,異步復位,同步釋放
//等待兩個鎖相環(huán)都輸出穩(wěn)定的時候,系統(tǒng)釋放復位
wire     locked1,locked2;            //PLL輸出有效標志位,高表示PLL輸出有效
wire     sysrst_nr0 = rst_n & locked1 & locked2;    //系統(tǒng)復位直到PLL有效輸出;
reg     sysrst_nr1,sysrst_nr2;
always @(posedge clk_125 or negedge sysrst_nr0)
begin
    if(!sysrst_nr0)
        begin
        sysrst_nr1 <= 1'b0;
        sysrst_nr2 <= 1'b0;
        end        
    else
        begin
        sysrst_nr1 <= 1'b1;
        sysrst_nr2 <= sysrst_nr1;
        end
end
assign sys_rst_n = sysrst_nr2;
//----------------------------------------------
//例化PLL1產(chǎn)生模塊
PLL1     PLL1
(
    .areset(pll_rst1),    //PLL1復位信號,高電平復位
    .inclk0(clk1),        //PLL1輸入時鐘,50MHz
    .c0(clk_125),        //PLL1輸出125MHz時鐘        
    .c1(clk_125_2),        //PLL1輸出125MHz時鐘(-3.5ns)        
    .locked(locked1)    //PLL1輸出有效標志位,高表示PLL1輸出有效
);
//例化PLL2產(chǎn)生模塊
PLL2     PLL2
(
    .areset(pll_rst2),    //PLL2復位信號,高電平復位
    .inclk0(clk2),        //PLL2輸入時鐘,50MHz
    .c0(clk_65),        //PLL2輸出125MHz時鐘            
    .locked(locked2)    //PLL2輸出有效標志位,高表示PLL2輸出有效
);
endmodule









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1