//不带PLL的异步复位,同步释放:
//其实就是用的打节拍的方式将复位信号控制成clk控制的信号而已!
module reset
(
input clk,
input reset,
output reset_2
);
reg reset_1;
reg reset_2;
always@(posedge clk or negedge reset)
if(!reset)
reset_1<=1'b0;
else
reset_1<=1'b1;
always@(posedge clk or negedge reset)
if(!reset)
reset_2<=1'b0;
else
reset_2<=reset_1;
endmodule
//特权同学写的带有PLL的异步复位,同步释放
//思想:先将FPGA的复位信号做一次异步复位,同步处理,将这个复位信号输入给PLL,
//接着在将PLL的复位信号做一次异步复位,同步处理,得到系统的复位信号
//其实就是用的打节拍的方式处理异步信号的,使其都只受时钟控制的信号!
module sys_reset
(
input clk,
input reset,
output sys_reset,
output clk_25,
output clk_100
);
//第一次异步复位,同步处理
reg reset_1;
reg reset_2;
wire pll_reset;
always@(posedge clk or negedge reset)
if(!reset)
reset_1 <= 1'b0;
else
reset_1 <= 1'b1;
always@(posedge clk or negedge reset)
if(!reset)
reset_2 <= 1'b0;
else
reset_2 <= reset_1;
assign pll_reset = reset_2;
//第二次异步复位,同步处理,将系统用的复位信号输出
wire locked;//PLL输出有效标志位,高电平表示PLL输出有效
wire sys_reset_0;
reg sys_reset_1;
reg sys_reset_2;
assign sys_reset_0 = reset & locked;//用这两个信号来标志复位开始,然后用时钟将其控制成同步信号!
always@(posedge clk_100 or negedge sys_reset_0)
if(!sys_reset_0)
sys_reset_1 <= 1'b0;
else
sys_reset_1 <= 1'b1;
always@(posedge clk_100 or negedge sys_reset_0)
if(!sys_reset_0)
sys_reset_2 <= 1'b0;
else
sys_reset_2 <= sys_reset_1;
assign sys_reset =sys_reset_2;
//这个例化其实应该放在第一次异步复位,同步处理之后,这样看的更清楚
pll u1
(
.inclk0(clk),
.areset(pll_reset),
.c0(clk_25),
.c1(clk_100),
.locked(locked)
);
endmodule
//其实就是用的打节拍的方式将复位信号控制成clk控制的信号而已!
module reset
(
input clk,
input reset,
output reset_2
);
reg reset_1;
reg reset_2;
always@(posedge clk or negedge reset)
if(!reset)
reset_1<=1'b0;
else
reset_1<=1'b1;
always@(posedge clk or negedge reset)
if(!reset)
reset_2<=1'b0;
else
reset_2<=reset_1;
endmodule
//特权同学写的带有PLL的异步复位,同步释放
//思想:先将FPGA的复位信号做一次异步复位,同步处理,将这个复位信号输入给PLL,
//接着在将PLL的复位信号做一次异步复位,同步处理,得到系统的复位信号
//其实就是用的打节拍的方式处理异步信号的,使其都只受时钟控制的信号!
module sys_reset
(
input clk,
input reset,
output sys_reset,
output clk_25,
output clk_100
);
//第一次异步复位,同步处理
reg reset_1;
reg reset_2;
wire pll_reset;
always@(posedge clk or negedge reset)
if(!reset)
reset_1 <= 1'b0;
else
reset_1 <= 1'b1;
always@(posedge clk or negedge reset)
if(!reset)
reset_2 <= 1'b0;
else
reset_2 <= reset_1;
assign pll_reset = reset_2;
//第二次异步复位,同步处理,将系统用的复位信号输出
wire locked;//PLL输出有效标志位,高电平表示PLL输出有效
wire sys_reset_0;
reg sys_reset_1;
reg sys_reset_2;
assign sys_reset_0 = reset & locked;//用这两个信号来标志复位开始,然后用时钟将其控制成同步信号!
always@(posedge clk_100 or negedge sys_reset_0)
if(!sys_reset_0)
sys_reset_1 <= 1'b0;
else
sys_reset_1 <= 1'b1;
always@(posedge clk_100 or negedge sys_reset_0)
if(!sys_reset_0)
sys_reset_2 <= 1'b0;
else
sys_reset_2 <= sys_reset_1;
assign sys_reset =sys_reset_2;
//这个例化其实应该放在第一次异步复位,同步处理之后,这样看的更清楚
pll u1
(
.inclk0(clk),
.areset(pll_reset),
.c0(clk_25),
.c1(clk_100),
.locked(locked)
);
endmodule