一般FPGA属于易失性芯片,类似于RAM,芯片上的数据和程序在掉电后不会保留,上电后程序需要从外部非易失性芯片加载,如EPCS系列芯片,也可以通过FPGA上JTAG接口或者串行接口写入。
▲而MAX 10系列FPGA的配置则很灵活,因其芯片内嵌配置闪存模块CFM(Configuration Flash Memory),可用于存放程序映象。如上图所示。MAX 10系列FPGA的配置过程在内部进行,首先通过JTAG将配置数据写入到CFM中,然后内部配置过程自动从CFM加载配置数据至MAX 10的配置内存CRAM(Configuration RAM)。
深入CFM内部,可分为3个扇区:CFM0,CFM1和CFM2。如下表,MAX 10内部配置可分为5种模式,分别对应对2个扇区的不同使用情况:
上表中内部配置共有5种模式:
1) Dual Compressed Image:双压缩映像
2) Single Uncompressed Image:单未压缩映像
3) Single Uncompressed Image with Memory Initialization:单未压缩映像带内存初始化数据
4) Single Compressed Image with Memory Initialization:单压缩映像带内存初始化数据
5) Single Compressed Image:单压缩映像
其中第1,2,5种模式,3个CFM扇区都用于存放映像;而第3,4种模式,未使用的扇区,主要是CFM1和CFM2,可配置成用户闪存模块UFM(User Flash Memory)。
▼在QuartusII 14.1中,可设置内部配置的模式,以生成对应的映像文件:
l 打开Device and Pin Options à Configuration;
l Configuration scheme选择Internal Configuration;
l Configuration mode中选择5种模式中的1种;
可以发现,内部配置模式有一种是Dual Compressed Image,即在CFM中可以存放两个压缩映像,也就是说MAX 10 FPGA支持双启动模式Dual Boot。
下面通过实例演示下MAX 10 FPGA的配置:
----------------------------------- 单映像配置 -----------------------------------
QuartusII 14.1默认配置就是Single Uncompressed Image(912Kbits UFM),因此无需另外设置内部配置模式。
在LED_FLASH工程的基础上修改了下,将LED的功能由闪烁效果改成呼吸灯的效果:▼新建呼吸灯版本,不同的版本可以在源代码相同的情况下选择不同的工程设置。
▼修改顶层源码:例化了呼吸灯模块BreathLeds;加粗部分代码,根据宏BREATH_EN选择LED的输出
1 module LED_Flash_all( 2 input clk, 3 output LED1, 4 output LED2, 5 output LED3, 6 output LED4, 7 output LED5 8 ); 9 10 …… (此处省略N行代码) 11 12 // Breath Led 13 wire bled; 14 BreathLeds breathleds_u( 15 .clk(clk), 16 .rst(1‘b0), 17 18 .led(bled) 19 ); 20 21 `ifdef BREATH_EN 22 assign LED1 = bled; 23 assign LED2 = bled; 24 assign LED3 = bled; 25 assign LED4 = bled; 26 assign LED5 = bled; 27 `else 28 assign LED1 = dec_cntr ; 29 assign LED2 = dec_cntr ; 30 assign LED3 = dec_cntr ; 31 assign LED4 = dec_cntr ; 32 assign LED5 = dec_cntr ; 33 `endif 34 35 endmodule
▼只在LED_BREATH版本中加入宏:Settings à Compiler Settings à Verilog HDL Input设置中,添加Verilog HDL macro:BREATH_EN。这种方法的好处就是无需在Verilog HDL源码中定义宏
工程编译后默认只生成.sof文件,内部配置所需的.pof文件手动从.sof文件转换得到
▼打开File --> Convert Programming Files…
▼sof --> pof 转换
1. Mode 选择为 Internal Configuration
2.设置Options/Boot info…
3.输入pof文件名
4.勾选Create Memory Map File项,.map包含CFM和UFM地址,其中含有通过Option/Boot Info选项而进行的ICB设置。
5.选择sof文件
6.点击Generate生成pof文件
▼按以上步骤生成pof文件完成
▼通过Programmer下载pof,在Program/Configure勾选CFM扇区,由于当前内部配置模式为Single Uncompressed Image,三个扇区都需要使用
▼点击Start开始下载
▼下载完成
▼演示视频
----------------------------------- 双映像配置 -----------------------------------
工程继续使用LED_FLASH,上篇中新建了LED_BREATH版本,工程中共有两个版本:LED_Flash和LED_BREATH▼
▼制作双配置映像,需要相应地在设置中奖内部配置模式设置Dual Compressed Image
▼然后开始编译,但是出现了错误Error (169130): Configuration mode specified as Remote but remote update block is not found in design,是缺少了什么模块
查阅相关文档,原来是缺少这货:Altera Dual Boot IP,必须在工程中例化这个IP才能实现双映像配置。由于此IP接口是Avalon-MM的,需要先在Qsys中包装一下▼
▼在IP Catalog中搜索Dual Boot IP,然后点击添加
▼只需配置此IP的时钟,此例中为50MHz
▼将clk和reset连接后,一个基于Dual Boot IP的简单Qsys系统完成了
▼点击Generate HDL…,在弹出对话框中设置后,点击Generate
▼系统生成后,在顶层Verilog代码中例化生成的Qsys系统
1 dualboot dualboot_u( 2 .clk_clk(clk), // clk.clk 3 .reset_reset_n(1‘b0) // reset.reset_n 4 );
▼成功编译后,可在层次结构中看到dualboot系统模块
▼切换另一个版本,记得内部配置模式也设置成Dual Compressed Image,不同的版本其设置是独立的,然后重新编译;两个版本分别生成两个sof文件:LED_Flash.sof和LED_BREATH.sof。
▼下一步是将两个sof文件装换成单个pof文件;与制作单映像配置方法相同,通过convert programming files生成pof,但有些不同,在Input files to convert需要添加两个sof文件
▼打开Programmer,添加LED_DualBoot.pof文件,在Program/Configure中勾选CFM,点击Start开始下载
▼下载成功
▼在双压缩映像模式中,可以使用BOOT_SEL 管脚来选择配置映像,在MAX 10评估套件中对应拨码开关DIP的第6位:ON状态选择第一个映像;OFF状态选择第二个映像
▼演示视频:上电默认加载第一个映像:呼吸灯程序;切换BOOT_SEL管脚状态后,加载了第二个映像:闪烁灯程序