/////////////////////////////////////////////////////////////////////////////        
//  top_sin_wave.v       : DDS 电路实验参考代码                                         
//  author               : 杜伟韬                                                   
//  date                 : 2011-10-11                                               
////////////////////////////////////////////////////////////////////////////////
// module powerup_reset() 
// 上电后自动生成复位信号，用于复位其他电路模块
// 根据Altera器件手册，芯片中的D触发器的上电值为0
// 工作原理，使用一个计数器，上电后自动计数到最大值，然后保持不变
// 在计数器计数到最大值之前，输出复位有效信号，之后输出复位无效信号
////////////////////////////////////////////////////////////////////////////////
module powerup_reset(
  CLK       ,   // 时钟   
  RSTOUT    );  // 生成的复位信号

input CLK;
output RSTOUT;
reg RSTOUT;

// 时钟周期50ns，经过实验测定，复位持续时间1/10sec，如果时间过短不起作用
// 猜测和FPGA的加载时间以及电路板设计有关
parameter CNTMAX = 5000000 - 1;

reg [31:0] counterR;

always @ (posedge CLK) begin
  if(counterR < CNTMAX) begin
    counterR <= counterR + 1'b1;
  end
  else begin
    counterR <= CNTMAX;
  end
end

always @ (counterR) begin
  if(counterR < CNTMAX) 
    RSTOUT = 1'b1;  // 输出复位有效
  else 
    RSTOUT = 1'b0;  // 输出复位无效

end

endmodule
