固件远程更新之STARTUPE2原语(fpga控制flash)

本文详细介绍了FPGA远程更新固件的技术原理,尤其关注以太网和自定义局域网的应用场景。深入探讨了STARTUPE2原语在控制外部Flash时钟信号中的关键作用,以及如何通过Verilog实现这一功能,确保更新过程的顺利进行。

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

转至: https://blog.youkuaiyun.com/jiuzhangzi/article/details/79471365

 

有的项目需要远程更新固件,更新完成后断电、重启即可。那远程更新是如何实现的呢?用的最多的应该是以太网或者自定义的局域网为主,当然还可以使用pcie、串口之类的,像xilinx还有golden image,以防止远程更新失败启动不起来,它主要是flash存有两个启动文件,正常情况下启动默认的,当默认的被损坏,就从备用的启动。本文章主要讲解的是STARTUPE2原语,这和远程更新有什么关系呢?请接着向下看。
我们知道,fpga掉电丢失,一般使用外部flash存储代码,flash有spi、bpi、qspi等接口,外部存储器的时钟管脚一般与fpga的CCLK_0连接,当使用远程更新时,首先fpga内部有控制flash的驱动(即逻辑控制flash时序),当然flash时钟也需要控制了,但这时时钟管脚已经连接到CCLK_0,那该如何操作啊,你直接约束分配管脚试试,是通不过的,这时STARTUPE2就派上用场了,那该如何使用啊,如下(verilog):

STARTUPE2  #(
    .PROG_USR("FALSE"), // Activate program event security feature. Requires encrypted bitstreams.
    .SIM_CCLK_FREQ(0.0) // Set the Configuration Clock Frequency(ns) for simulation
)
STARTUPE2_inst
(
    .CFGCLK(), // 1-bit output: Configuration main clock output
    .CFGMCLK(), // 1-bit output: Configuration internal oscillator clock output
    .EOS(), // 1-bit output: Active high output signal indicating the End Of Startup.
    .PREQ(), // 1-bit output: PROGRAM request to fabric output
    .CLK(0), // 1-bit input: User start-up clock input
    .GSR(0), // 1-bit input: Global Set/Reset input (GSR cannot be used for the port name)
    .GTS(0), // 1-bit input: Global 3-state input (GTS cannot be used for the port name)
    .KEYCLEARB(1), // 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
    .PACK(1), // 1-bit input: PROGRAM acknowledge input
    .USRCCLKO(flash_clk), // 1-bit input: User CCLK input
    .USRCCLKTS(0), // 1-bit input: User CCLK 3-state enable input
    .USRDONEO(1), // 1-bit input: User DONE pin output control
    .USRDONETS(1) // 1-bit input: User DONE 3-state enable outpu
);

其中flash_clk就是你时序控制的flash时钟信号,连接到这就行了,其它的不需要改动,也无需约束此管脚(因为此管脚不需要在顶层作为输出信号了)。当然你也可以例化qspi ip看里面是如何使用的。
顺便说一下,对于数据信号,一般是inout类型,对于单bit可以如下使用:

assign data = data_en ? data_reg : 1'bz;

多bit可以如下使用:

//data_en=1:data_in--valid;0:data_out--valid
generate
  genvar  j;
       for (j = 0; j <= 3; j = j + 1)
           begin : bidir_IO
          IOBUF IOBUF_i (
              .IO   (flash_data[j]),
              .I    (data_out[j]),
              .O    (data_in[j]),
              .T    (data_en)                
          );
      end
endgenerate

data_en、data_in、data_out是时序控制的信号,flash_data为顶层的inout类型信号(直接接芯片引脚)。
 

### 关于 Vivado 中 STARTUPE2 原语的使用方法 STARTUPE2 是 Xilinx FPGA 设备中的一个重要原语,主要用于配置和初始化 FPGA 的功能模块。它通常用于 UltraScale 架构下的器件中,并提供了一系列的功能接口来实现对 FPGA 配置模式、时钟源以及启动过程的控制。 #### 功能概述 STARTUPE2 提供了多种信号输入/输出端口,这些端口可以用来设置 FPGA 的工作状态,例如全局复位、配置完成标志等。以下是其主要用途: - **FPGA 初始化**:通过 `GSR` 和 `GWE` 信号实现全局异步复位和释放。 - **配置监控**:利用 `CFGCLK`, `CFGMCLK`, `EOS` 等信号监测 FPGA 的配置进程。 - **外部时钟注入**:支持从外部引入时钟信号至 FPGA 内部逻辑网络[^3]。 #### 参数说明 在实际项目开发过程中,可以通过实例化该原语并合理分配参数值来进行具体应用设计。下面列举了一些常用的属性及其作用: | 属性名 | 描述 | |----------------|----------------------------------------------------------------------------------------| | PROG_B | 当此引脚拉低时会触发整个芯片重新进入加载流程 | | CLK | 外接时钟源 | | CCLKSTOPPED | 表明内部产生的CCLK已经停止 | #### 实例代码展示 以下是一个简单的 Verilog HDL 示例程序片段,展示了如何正确调用 STARTUPE2 组件: ```verilog // Example instantiation of the STARTUPE2 primitive. STARTUPE2 your_instance_name ( .PROG_B(PROG_B), // Input signal to initiate reconfiguration process .CLK(CLK), // Clock input pin .CCLKSTOPPED(CCLKSTOPPED) // Output indicating status of internal clock generation circuitry ); ``` 以上代码定义了一个名为 `your_instance_name` 的组件对象,并将其连接到了顶层实体相应的物理管脚之上。 #### 注意事项 当涉及到跨不同频率域之间的数据交换时,应特别注意同步机制的设计以免发生亚稳态现象影响系统的稳定性[^4]。另外,在综合阶段还需要针对特定路径施加合适的约束条件以满足性能需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值