特权同学的异步复位,同步处理方法总结

来源:互联网 发布:dnf辅助端口免费制卡 编辑:程序博客网 时间:2024/05/13 20:45
//不带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 
原创粉丝点击