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

本文介绍了一种异步复位同步释放的设计方法,包括不带PLL的简单实现及带有PLL的复杂实现。该方法通过两级寄存器将异步复位信号转化为同步信号,确保系统稳定工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//不带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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值