(1)沒有PLL
/********************************************************************
* File Name : System_Ctrl
* Author : Crazy Bingo
* Version : Quartus II 9.1
* Date : 2010/12/4
* Function : 雙鎖相環系統異步復位
* Description :
*********************************************************************/
module System_Ctrl0
(
input clk, //FPAG輸入時鐘信號50MHz
input rst_n, //系統復位信號,低有效
output sys_rst_n //系統復位信號,低有效
);
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 : 雙鎖相環系統異步復位
* Description :
*********************************************************************/
module System_Ctrl1
(
input clk, //FPAG輸入時鐘信號50MHz
input rst_n, //系統復位信號,低有效
output sys_rst_n, //系統復位信號,低有效
output clk_125, //PLL1輸出125MHz時鐘
output clk_65 //PLL2輸出65MHz時鐘
);
//----------------------------------------------
//PLL復位信號產生,高有效,異步復位,同步釋放輸出
wire pll_rst; //PLL復位信號,高有效
reg rst_r1,rst_r2; //DFF觸發,穩定信號
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;
//----------------------------------------------
//系統復位信號產生,低有效,異步復位,同步釋放
//等待兩個鎖相環都輸出穩定的時候,系統釋放復位
wire locked; //PLL輸出有效標志位,高表示PLL輸出有效
wire sysrst_nr0 = rst_n & locked; //系統復位直到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產生模塊
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 : 雙鎖相環系統異步復位
* Description :
*********************************************************************/
module System_Ctrl
(
input clk1, //FPAG輸入時鐘信號50MHz
input clk2, //FPAG輸入時鐘信號50MHz
input rst_n, //系統復位信號,低有效
output sys_rst_n, //系統復位信號,低有效
output clk_125, //PLL1輸出125MHz時鐘
output clk_125_2, //PLL1輸出125MHz時鐘(-3.5ns)
output clk_65 //PLL2輸出65MHz時鐘
);
//----------------------------------------------
//PLL1,PLL2復位信號產生,高有效,異步復位,同步釋放輸出
wire pll_rst1; //PLL1復位信號,高有效
wire pll_rst2; //PLL2復位信號,高有效
reg rst_r1,rst_r2; //DFF觸發,穩定信號
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;
//----------------------------------------------
//系統復位信號產生,低有效,異步復位,同步釋放
//等待兩個鎖相環都輸出穩定的時候,系統釋放復位
wire locked1,locked2; //PLL輸出有效標志位,高表示PLL輸出有效
wire sysrst_nr0 = rst_n & locked1 & locked2; //系統復位直到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產生模塊
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產生模塊
PLL2 PLL2
(
.areset(pll_rst2), //PLL2復位信號,高電平復位
.inclk0(clk2), //PLL2輸入時鐘,50MHz
.c0(clk_65), //PLL2輸出125MHz時鐘
.locked(locked2) //PLL2輸出有效標志位,高表示PLL2輸出有效
);
endmodule