(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