Lattice ICE40 FPGA上电RTL复位方法及内置POR相关技术咨询
ICE40 UP5K上电复位方案解答
1. ICE40是否有内置POR信号?
ICE40UP5K系列(包括你使用的ICE40UP5K-SG48ITR)自带内置上电复位(POR)电路,无需额外通过计数器或延迟电路实现基础上电复位。该POR信号会在FPGA上电时自动生成,确保所有寄存器、状态机等逻辑单元在上电初期处于复位状态,直到电源电压(VCCIO和VCCCORE)稳定在阈值以上。
在APIO(底层基于Yosys+NextPNR)环境下,无需显式声明或例化模块,只要代码中包含复位逻辑,工具会自动映射到内置POR资源。
2. 状态机自复位的"鸡生蛋"矛盾解决
如果需要自定义复位逻辑(比如更长的复位延迟),可以通过以下两种方式规避状态机自身复位的矛盾:
方式一:利用寄存器上电初始化值
ICE40的寄存器支持通过Verilog的initial块设置上电初始值,工具会将该值写入配置比特流,确保状态机上电直接进入复位起始状态。示例代码:
(* reset = "none" *) reg [1:0] reset_state; reg internal_rst; reg [9:0] cnt; // 上电时直接初始化到复位状态 initial begin reset_state = 2'b00; internal_rst = 1'b1; cnt = 10'd0; end always @(posedge clk) begin case(reset_state) 2'b00: begin internal_rst = 1'b1; reset_state = 2'b01; end 2'b01: begin cnt <= cnt + 1'd1; if(cnt == 10'd1000) begin internal_rst = 1'b0; reset_state = 2'b10; end end 2'b10: begin internal_rst = 1'b0; end endcase end
方式二:基于内置POR扩展复位逻辑
直接将内置POR作为全局复位信号,先让复位生成状态机完成基础复位,再生成扩展复位信号给其他模块,无需依赖initial块:
reg [9:0] rst_cnt; reg extended_rst; // por_rst由工具自动映射到内置POR信号 always @(posedge clk or posedge por_rst) begin if(por_rst) begin rst_cnt <= 10'd0; extended_rst <= 1'b1; end else begin if(rst_cnt < 10'd1000) begin rst_cnt <= rst_cnt + 1'd1; extended_rst <= 1'b1; end else begin extended_rst <= 1'b0; end end end
3. APIO环境注意事项
在APIO cli环境中,无需对内置POR做特殊配置,只要代码包含复位逻辑,Yosys和NextPNR会自动利用ICE40的内置POR资源。可通过apio sim命令仿真验证,或直接下载到Upduino3开发板测试。
内容的提问来源于stack exchange,提问作者zapta
相关产品推荐
相关产品推荐

