案例一:
clk和rst_n信号连接到FPGA,FPGA将复位信号直接给MCU,时钟信号经二分频提供给MCU,非常简单吧,分频程序如下:
assign rst_mcu_n=rst_n;
always @ (posedge clk or negedge rst_n)
if(rst_n==1'b0)
clk_mcu<=1'b0;
else
clk_mcu<=!clk_mcu;
这样的程序在MCU在执行过程中就会出问题,原因是大部分MCU要求时钟在复位信号无效前必须维持多个周期,而显然上述程序做不到这一点,复位信号变无效后,才开始输出时钟信号的。
案例2:
外部输入的硬复位做全局复位信号?大家似乎对这点从未怀疑过,是啊,硬复位内部所有的触发器还有各种IP核等,似乎是无可争议的事情?但是你想过么:
电源加电后,FPGA上电配置时间有的超过几百ms(不同存储容量的FLASH,加载时间不一样),我们常用的看门狗信号max706,复位有效时间是200ms,所以如果上电加载配置时间大于200ms的话..........呵呵,你懂得,内部触发器不能保证复位到默认值。
所以我的设计方案是:
assign rst_cnt_n=(count==16'hDCBA)?1:0;
assign rst_syn=rst_n & rst_cnt_n;//rst_syn用作全局复位信号
always @ (posedge clk or negedge rst_n)
if(rst_n==1'b0)
count<=16'b0;
else if(count==16'hDCBA)
count<=16'hDCBA;
else
count<=count+1;
希望这两个小案例对大家有所帮助!