找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3209|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

全局時(shí)鐘--復(fù)位設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104287 發(fā)表于 2016-1-31 04:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
簡(jiǎn)單來說,就是利用雙觸發(fā)器將復(fù)位信號(hào)打慢一拍來保證穩(wěn)定性
另外,亞穩(wěn)態(tài)的形成,簡(jiǎn)單來理解,就是異步操作中,建立時(shí)間和保持時(shí)間沒有符合要求所出現(xiàn)的異常狀態(tài)
另外,關(guān)鍵的關(guān)鍵,讀別人的代碼一定要有耐心,從代碼中去理解前人的思路

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

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




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表