作者:zzssdd2
E-mail:[email protected]
1、需求描述
FPGA
内部是SRAM
储存结构,掉电后程序就会丢失,故需要将FPGA程序保存在掉电不丢失的储存介质中(比如FLASH、EMMC、SD卡等),在每次上电时读取程序进行配置。
2、功能分析
项目中使用的FPGA型号是Altera
公司(现属于Intel
)的Cyclone
系列。在Altera的文档
《Cyclone Device Handbook,Volume1》的第13章节讲述了该系列FPGA的几种配置方式。
FPGA’的三种配置模式
模式 | 描述 |
---|---|
AS(Active serial)模式 | FPGA主动配置。该模式由FPGA主动从外部储存器读取配置数据 |
PS(Passive serial)模式 | FPGA被动控制。该模式由外部控制器对FPGA进行配置 |
JTAG模式 | 通过外部下载器下载到FPGA内部SRAM中 |
FPGA选择配置模式
通过MSEL0
和MSEL1
引脚不同的电平来选择配置方式(如果使用JTAG配置则可以忽略这些引脚配置)
MSEL1 | MSEL0 | 模式 |
---|---|---|
0 | 0 | AS |
0 | 1 | PS |
x | x | JTAG |
最终确定的方案是使用PS模式通过MCU来升级、配置FPGA。下面主要讲使用MCU对FPGA进行PS模式下的配置过程。
PS模式配置引脚时序
- 发起配置请求
- nCONFIG引脚拉低
tCFG
时间然后拉高,等待nSTATU拉低响应请求- 进行配置
- FPGA在DCLK引脚的上升沿采集DATA引脚Bit数据,LSB在前传输方式
- 配置完成
- 等待CONF_DONE引脚回应一个高电平表示配置完成
PS配置模式时序参数
3、功能实现
配置FPGA用到的变量和标志
static uint8_t fpga_cfg_buf[W25Q_SECTOR_SIZE]; //储存从FLASH读出数据
static __IO uint8_t fpga_cfg_sta = 0x00; //记录配置状态
//配置过程用到的标识
enum
{
FPGA_CFG_ENABLE = 0x01,
FPGA_CFG_START = 0x02,
FPGA_CFG_DONE = 0x04,
FPGA_CFG_OVER = 0x08,
};
MCU与FPGA连接引脚配置
/*
**********************************************************************
* 函 数: fpga_config_init
* 功 能: 配置FPGA引脚
* 输 入: 无
* 输 出: 无
**********************************************************************
*/
void fpga_config_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
/* 引脚时钟使能 */
FPGA_PIN_CLK_ENABLE();