Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Xilinx FPGA程序升级

Xilinx FPGA程序升级

作者头像
瓜大三哥
发布于 2021-02-24 07:59:43
发布于 2021-02-24 07:59:43
4.9K01
代码可运行
举报
文章被收录于专栏:瓜大三哥瓜大三哥
运行总次数:1
代码可运行

Xilixn FPGA提供了一种在线升级的方式,可以通过ICAP指令实现。ICAP(Internal Configuration Access Port) 指的是内部配置访问端口,其主要作用是通过内部配置访问端口(ICAP),用户可以在FPGA逻辑代码中直接读写FPGA内部配置寄存器(类似SelectMAP),从而实现特定的配置功能,例如Multiboot。FPGA实现IPROG通常有两种方式,一种是通过ICAP配置,一种是把相关指令嵌入bit文件中。与通过bit文件实现IPROG相比,通过ICAP更灵活。对Xilinx FPGA的升级其实是Multiboot的操作。如下图所示,基地址存放的是Golden Image(bootloader),而高地址存放的是MultiBoot Image。小编会在本文对Xilinx 7系列的MulTIboot做一些简单介绍。

程序在启动的过程中,首先会加载MultiBoot Image,然后判断配置是否成功,这一步一般都是由外部电路决定,如果成功,则FPGA芯片上运行的是MultiBoot Image,如果失败,程序会自动返回到Golden Image。

1.STARTUP原语

我们都知道fpga掉电程序会丢失,一般使用外部flash存储代码,flash有spi、bpi、qspi等接口,外部存储器的时钟管脚一般与fpga的CCLK_0连接(BANK0),当使用远程更新时,首先fpga内部有控制flash的驱动(即逻辑控制flash时序)的时钟,当然flash时钟也需要控制了,但这时时钟管脚已经连接到CCLK_0,这时候就需要用STARTUPE2(7系列),SPANTAN系列使用STARTUPE原语,而UltraScale系列使用STARTUPE3原语,小编使用的是xc7k325的器件,所以:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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**将SPI的时钟链接到这里**
.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时钟信号,连接到这就行了,其它的不需要改动,也无需约束此管脚(因为约束会报错,小编已经踩过坑了)。 其实在Xilinx上的Xilinx SPI Controller里面包含STARTUP原语,如下图所示,所以对于Xilinx支持的FLASH芯片厂商如:Micron,Winbond,Spansion等,不需要再例化该原语。

SPI-controller

2.ICAP原语

IRPOG命令序列是实现FPGA重加载的重要环节。IPROG命令的效果与在PROGRAM_B引脚产生一个脉冲的效果类似,但是IPROG命令不对重配置[4]逻辑进行复位。Kintex7内部ICAPE2模块能够执行IPROG命令,IPROG命令触发FPGA从SPI Flash中重新加载比特文件,加载地址是Kintex7中WBSTAR寄存器指定的地址。 IPROG命令发送后,FPGA完成3个动作:

  • 发送同步字节(AA995566);
  • 向Kintex7的WBSTAR寄存器写入下一个加载地址(下表地址为00000000);
  • 发送IPORG命令(0000000F)。

下表是通过ICAPE2向重配置模块发送IPROG命令的顺序。

ICAPE2编程命令程序实现如下图所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ICAPE2 #(
   .DEVICE_ID(0'h3651093    ),      // Specifies the pre-programmed Device ID value to be used for simulation
   .ICAP_WIDTH            ("X32"      ),      // Specifies the input and output data width.
   .SIM_CFG_FILE_NAME    ("C:\\VivadoPrj\\FPGAUartProgram\\7Serial\\7Serial_A7\\7Serial_A7.runs\\impl_1\\OnlineProgram_top.bit"      )       // Specifies the Raw Bitstream (RBT) file to be parsed by the simulation model.                                
)
ICAPE2_inst (
   .O        (ICAPE2_O       ),  // 32-bit output: Configuration data output bus
   .CLK        (ICAPE2_CLK     ),  // 1-bit input: Clock Input
   .CSIB    (ICAPE2_CSIB    ),  // 1-bit input: Active-Low ICAP Enable
   .I        (ICAPE2_I       ),  // 32-bit input: Configuration data input bus
   .RDWRB    (ICAPE2_RDWRB   )   // 1-bit input: Read/Write Select input
);

注意有坑在这里哦 坑一:需要注意的是Flash的地址为24bit时候,需要将该Warm addr的高24位置为所需要的切换的镜像地址。

坑二:需要对WBSTAR进行字节内交换

具体实现程序如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ICAPE2_I[0]         <=  icape2_data_r[7];
ICAPE2_I[1]         <=  icape2_data_r[6];
ICAPE2_I[2]         <=  icape2_data_r[5];
ICAPE2_I[3]         <=  icape2_data_r[4];
ICAPE2_I[4]         <=  icape2_data_r[3];
ICAPE2_I[5]         <=  icape2_data_r[2];
ICAPE2_I[6]         <=  icape2_data_r[1];
ICAPE2_I[7]         <=  icape2_data_r[0];


ICAPE2_I[8]      <= icape2_data_r[15];
ICAPE2_I[9]      <= icape2_data_r[14];
ICAPE2_I[10]     <=  icape2_data_r[13];
ICAPE2_I[11]     <=  icape2_data_r[12];
ICAPE2_I[12]     <=  icape2_data_r[11];
ICAPE2_I[13]     <=  icape2_data_r[10];
ICAPE2_I[14]     <=  icape2_data_r[9];
ICAPE2_I[15]     <=  icape2_data_r[8];

ICAPE2_I[16]     <=  icape2_data_r[23];
ICAPE2_I[17]     <=  icape2_data_r[22];
ICAPE2_I[18]     <=  icape2_data_r[21];
ICAPE2_I[19]     <=  icape2_data_r[20];
ICAPE2_I[20]     <=  icape2_data_r[19];
ICAPE2_I[21]     <=  icape2_data_r[18];
ICAPE2_I[22]     <=  icape2_data_r[17];
ICAPE2_I[23]     <=  icape2_data_r[16];


ICAPE2_I[24]     <=  icape2_data_r[31];
ICAPE2_I[25]     <=  icape2_data_r[30];
ICAPE2_I[26]     <=  icape2_data_r[29];
ICAPE2_I[27]     <=  icape2_data_r[28];
ICAPE2_I[28]     <=  icape2_data_r[27];
ICAPE2_I[29]     <=  icape2_data_r[26];
ICAPE2_I[30]     <=  icape2_data_r[25];
ICAPE2_I[31]     <=  icape2_data_r[24];

其实在Xilinx上的Block Design中也有ICAP的IP核,所以在进行设计的时候也可以直接调用该IP进行实现跳转功能。

坑三:需要对外部SPI接口进行约束

约束如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set cclk_delay 6.7
# Following are the SPI device parameters
# Max Tco
set tco_max 7
# Min Tco
set tco_min 1
# Setup time requirement
set tsu 2
# Hold time requirement
set th 3
# Following are the board/trace delay numbers
# Assumption is that all Data lines are matched
set tdata_trace_delay_max 0.25
set tdata_trace_delay_min 0.25
set tclk_trace_delay_max 0.2
set tclk_trace_delay_min 0.2
### End of user provided delay numbers
# This is to ensure min routing delay from SCK generation to STARTUP input
# User should change this value based on the results
# Having more delay on this net reduces the Fmax
# Following constraint should be commented when the STARTUP block is disabled
set_max_delay 1.5 -from [get_pins -hier *SCK_O_reg_reg/C] -to [get_pins -hier *USRCCLKO] -datapath_only
set_min_delay 0.1 -from [get_pins -hier *SCK_O_reg_reg/C] -to [get_pins -hier *USRCCLKO]
# Following command creates a divide by 2 clock
# It also takes into account the delay added by the STARTUP block to route the CCLK
# This constraint is not needed when the STARTUP block is disabled
# The following constraint should be commented when the STARTUP block is disabled
create_generated_clock -name clk_sck -source [get_pins -hierarchical *axi_quad_spi_1/ext_spi_clk] [get_pins -hierarchical *USRCCLKO] -edges {3 5 7} -edge_shift [list $cclk_delay $cclk_delay $cclk_delay]
# Enable the following constraint when STARTUP block is disabled
#create_generated_clock -name clk_virt -source [get_pins -hierarchical *axi_quad_spi_1/ext_spi_clk] [get_ports <SCK_IO>] -edges {3 5 7}
# Data is captured into FPGA on the second rising edge of ext_spi_clk after the SCK falling edge
# Data is driven by the FPGA on every alternate rising_edge of ext_spi_clk
set_input_delay -clock clk_sck -max [expr $tco_max + $tdata_trace_delay_max + $tclk_trace_delay_max] [get_ports IO*_IO] -clock_fall;
set_input_delay -clock clk_sck -min [expr $tco_min + $tdata_trace_delay_min + $tclk_trace_delay_min] [get_ports IO*_IO] -clock_fall;
set_multicycle_path 2 -setup -from clk_sck -to [get_clocks -of_objects [get_pins -hierarchical */ext_spi_clk]]
set_multicycle_path 1 -hold -end -from clk_sck -to [get_clocks -of_objects [get_pins -hierarchical */ext_spi_clk]]
# Data is captured into SPI on the following rising edge of SCK
# Data is driven by the IP on alternate rising_edge of the ext_spi_clk
set_output_delay -clock clk_sck -max [expr $tsu + $tdata_trace_delay_max - $tclk_trace_delay_min] [get_ports IO*_IO];
set_output_delay -clock clk_sck -min [expr $tdata_trace_delay_min -$th - $tclk_trace_delay_max] [get_ports IO*_IO];
set_multicycle_path 2 -setup -start -from [get_clocks -of_objects [get_pins -hierarchical */ext_spi_clk]] -to clk_sck
set_multicycle_path 1 -hold -from [get_clocks -of_objects [get_pins -hierarchical */ext_spi_clk]] -to clk_sck
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FPGA程序升级续
fpga掉电丢失,一般使用外部flash存储代码,flash有spi、bpi、qspi等接口,外部存储器的时钟管脚一般与fpga的CCLK_0连接,当使用远程更新时,首先fpga内部有控制flash的驱动(即逻辑控制flash时序),当然flash时钟也需要控制了,但这时时钟管脚已经连接到CCLK_0,那该如何操作啊,你直接约束分配管脚试试,是通不过的,这时STARTUPE2就派上用场了,那该如何使用啊,如下(K7系列verilog):
瓜大三哥
2020/03/20
7370
【干货】八小时超长视频教你掌握FPGA时序约束!
注:零基础学会FPGA时序约束。本期推送配套相关独家教学视频,关注公众号,后台回复“时序分析培训”或留下您的邮箱,即可获取视频链接。视频内容是由团队郑圆圆同学讲解,欢迎批评指正。以下是节选的视频片段。
网络交换FPGA
2020/06/02
4.1K4
【干货】八小时超长视频教你掌握FPGA时序约束!
FPGA时序约束理论篇之时钟周期约束
  时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束。
猫叔Rex
2020/06/30
2.4K0
FPGA时序约束理论篇之时钟周期约束
FPGA时序约束实战篇之多周期路径约束
  首先来看带有使能的数据,在本工程中的Tming Report中,也提示了同一个时钟域之间的几个路径建立时间不满足要求
猫叔Rex
2020/06/30
9450
FPGA时序约束实战篇之多周期路径约束
FPGA中的时序约束--从原理到实例
建立时间和保持时间是FPGA时序约束中两个最基本的概念,同样在芯片电路时序分析中也存在。
网络交换FPGA
2019/10/29
6.2K0
FPGA中的时序约束--从原理到实例
基于原语的千兆以太网RGMII接口设计
RGMII是GMII的简化版本,发送端信号:TXD[3:0]、 TX_CLK、TX_EN,接收端信号:RX_DV、RXD[3:0]、RX_CLK,当Clock=125MHz,数据位宽4bit(一个时钟周期里,上升沿取TX\RX的0-3bit,下降沿取TX\RX的4-7bit,所以实际还是在一个时钟周期里传输8bit数据),1000Mbps=125 MHz *8bit、100Mbps=25 MHz *8bit、10Mbps=2.5MHz *8bit。
碎碎思
2020/06/30
6K0
Xilinx FPGA芯片内部时钟和复位信号使用
如果FPGA没有外部时钟源输入,可以通过调用STARTUP原语,来使用FPGA芯片内部的时钟和复位信号,Spartan-6系列内部时钟源是50MHz,Artix-7、Kintex-7等7系列FPGA是65MHz。
单片机点灯小能手
2023/10/31
9500
Xilinx FPGA芯片内部时钟和复位信号使用
FPGA之ODDR「建议收藏」
通过oddr把两路单端的数据合并到一路上输出 上下沿同时输出数据 上沿输出a路下沿输出b路 如果两路输入信号一路恒定为1,一路恒定为0,那么输出的信号实际上就是输入的时钟信号
全栈程序员站长
2022/07/23
8060
平头哥开源项目wujian100_open | 基于synplify+vivado生成bitfile
Use the sdc2fdc Tcl shell command to convert the timing constraints.
数字芯片社区
2022/04/06
2.1K0
平头哥开源项目wujian100_open | 基于synplify+vivado生成bitfile
今日说“法”:TimeQuest约束外设之诡异的Create Generated Clocks
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
4500
今日说“法”:TimeQuest约束外设之诡异的Create Generated Clocks
2.2 SPI协议的FPGA实现
  SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上。SPI通信的速度很容易达到好几兆bps,所以可以用SPI总线传输一些未压缩的音频以及压缩的视频。   下图是只有2个chip利用SPI总线进行通信的结构图
碎碎思
2020/06/30
2.3K0
FPGA的虚拟时钟如何使用?
  虚拟时钟通常用于设定输入和输出的延时,即set_input_delay和set_output_delay。可能有同学忘记这两个约束的用法了,这里我们再展示一下:
猫叔Rex
2021/12/10
8480
FPGA的虚拟时钟如何使用?
FPGA时序约束理论篇之时序路径与时序模型
  典型的时序路径有4类,如下图所示,这4类路径可分为片间路径(标记①和标记③)和片内路径(标记②和标记④)。
猫叔Rex
2020/06/30
1.3K0
FPGA时序约束理论篇之时序路径与时序模型
SDC约束
使用SDC命令create_clock创建时钟,时钟周期20,占空比50%的时钟信号;
数字芯片社区
2022/09/19
2K0
SDC约束
FPGA | Xilinx ISE14.7 LVDS应用
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/30
1.3K0
FPGA | Xilinx ISE14.7 LVDS应用
XDC设计之时钟篇
XDC 与UCF 的最主要区别: XDC 可以像UCF 一样作为一个整体文件被工具读入也可以在实现过程中被当做一个单独的命令直接执行。这就决定了XDC也具有Tcl命令的特点,即后面输入的约束在有冲突的情况下会覆盖之前的约束。另外,不同于UCF是全部读入再处理的方式,在XDC中,约束是读一条执行一条,所以先后顺序很重要,例如要设置IO约束之前,相应的clock一定要先创建好。 UCF 是完全以FPGA 的视角看问题,所以缺省认所有的时之间除非预先声明是同步的,否则就视作异步而不做跨时钟域时序分析;XDC则恰
瓜大三哥
2018/02/24
1.3K0
XDC设计之时钟篇
手把手教你在FPGA上搭建一个ARM Cortex-M3软核
上一篇文章介绍了ARM DesignStart计划,其中提到了Cortex-M1/M3 DesignStart FPGA版本,支持Xilinx和国产Gowin平台,本篇文章将手把手教你如何基于ARM DesignStart计划,在FPGA上搭建一个Cortex-M3软核处理器,以Xilinx Artix-7™系列FPGA为例,介绍如何定制一颗ARM Cortex-M3 SoC软核,并添加GPIO和UART外设,使用Keil MDK环境开发应用程序,Jlink下载、调试ARM程序,最终的实现效果是LED闪烁,串口输出Hello World信息。
单片机点灯小能手
2022/04/06
4.2K0
手把手教你在FPGA上搭建一个ARM Cortex-M3软核
【附录A SDC】静态时序分析圣经翻译计划
SDC语法是基于TCL的格式,即所有命令都遵循TCL语法。一个SDC文件会在文件开头包含SDC版本号,其次是设计约束,注释(注释以字符#开始,并在行尾处结束)在SDC文件中可以散布在设计约束中。设计约束中较长的命令行可以使用反斜杠(\)字符分成多行。
空白的贝塔
2021/01/28
1.7K0
FPGA时序约束实战篇之延迟约束
  对于延迟约束,相信很多同学是不怎么用的,主要可能就是不熟悉这个约束,也有的是嫌麻烦,因为有时还要计算PCB上的走线延迟导致的时间差。而且不加延迟约束,Vivado也只是在Timing Report中提示warning,并不会导致时序错误,这也会让很多同学误以为这个约束可有可无。
猫叔Rex
2020/06/30
2.4K0
FPGA时序约束实战篇之延迟约束
XDC
## Timing Assertions Section # Primary clocks # Virtual clocks # Generated clocks # Clock Groups # Bus Skew constraints # Input and output delay constraints ## Timing Exceptions Section # False Paths # Max Delay / Min Delay # Multicycle Paths # Case Analys
瓜大三哥
2018/02/26
1.1K0
相关推荐
FPGA程序升级续
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验