【国产FPGA高云GW1N-4系列开发板测评】——5、内部Flash和外部Flash程序固化测试
FPGA在功能调试过程中是把程序下载到SRAM中,断电后丢失。
要实现断电重新上电后程序自动运行,需要将程序固化到Flash中。
开发板使用的GW1N-4B系列FPGA,可通过内部Flash加载程序,也可通过外部Flash加载程序,通过模式选择位MODE0、MODE1来区分。外部Flash开发板上默认不焊,自己已采购并焊接,型号为华邦的W25Q64JVSIQ。在之前的开箱贴中有说过(【国产FPGA高云GW1N-4系列开发板测评】——2、补个开箱贴开发板与购买的Flash https://bbs.eeworld.com.cn/thread-1189058-1-1.html)
在用户手册“DK_MINI_GW1N-LV4LQ144C6I5_V1.1.pdf”中有相关内部介绍。如下图所示:
在开发板实物,MODE0、MODE1位置,及“0”、“1”设置,如下图所示。
开发板背面有管脚标示如下图,分别为1、3脚。
对照原理图“DK_MINI_GW1N-LV4LQ144C6I5_V1.1_Sch.pdf”中相关部分如下图,跳线帽短接1、2脚,相当于MODE1接3.3V,逻辑高电平“1”;跳线帽短接2、3脚,逻辑低电平“0”。
为测试如何程序固化,仍然使用LED闪灯来实现,代码如下。代码比较简单,时钟分频、LED状态翻转。
--*******************************************************************************
--*-------------------------- file ---------------
--* name: hello_led.vhd
--* ver : A
--* date:2021-12-9
--*------------------------------------------------
--*******************************************************************************
---------- LIB ----------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
----------ENTITY -------------------------------------------------------------
ENTITY hello_led IS
PORT (
-------------------------------------------------------------------------------
--系统全局时钟 CLK
-------------------------------------------------------------------------------
CLK_50M: IN STD_LOGIC; --50MHz系统时钟
-------------------------------------------------------------------------------
--系统全局复位 RESET
-------------------------------------------------------------------------------
NRESET: IN STD_LOGIC;
-------------------------------------------------------------------------------
--系统状态指示灯
-------------------------------------------------------------------------------
LED: OUT STD_LOGIC_VECTOR(4 DOWNTO 1));
-------------------------------------------------------------------------------
END hello_led;
-----------ARCHITECTURE-------------------------------------------------------
ARCHITECTURE MY_CODE OF hello_led IS
-----------------------------------------------------------------------
SIGNAL COUNTER: integer range 0 to 50000000;
SIGNAL LED_Reg: STD_LOGIC_VECTOR(3 downto 0);
--**********************************************************************************
--*****
--**********************************************************************************
BEGIN
LED <= LED_Reg;
PROCESS(NRESET,CLK_50M)
BEGIN
IF (NRESET = '0') THEN
COUNTER <= 0;
ELSIF (RISING_EDGE(CLK_50M)) THEN
IF (COUNTER < 50000000-1) THEN
COUNTER <= COUNTER + 1;
ELSE
COUNTER <= 0;
END IF;
END IF;
END PROCESS;
PROCESS(NRESET,CLK_50M)
BEGIN
IF (NRESET = '0') THEN
LED_Reg <= "0101";
ELSIF (RISING_EDGE(CLK_50M)) THEN
IF (COUNTER = 25000000-1) OR (COUNTER = 50000000-1)THEN
LED_Reg <= NOT LED_Reg;
END IF;
END IF;
END PROCESS;
END MY_CODE;
程序工程中使用了4个LED灯,LED(1)到LED(4)分别对应开发板实物的D7、D8、D9、D20,开发板上D7、D9在左边,D8、D20在右边。对照原理图如下图,可以知到LED灯是低电平“0”点亮。
为区别内部Flash程序和外部Flash程序效果,程序代码稍做区分。
给内部Flash烧写程序的代码第67行,LED初始状态“0101”,表示复位时右边的D8、D20点亮,左边的D7、D9灭状态。每秒左边、右边的两个灯分别交替亮灭一次。
给外部Flash烧程序的代码第67行,LED初始状态“1100”,表示复位时上边的D7、D8点亮,下边的D9、D20灭状态。每秒上边、下边的两个灯分别交替亮灭一次。
烧写内部Flash,首先将MODE0、MODE1分别设置为“0”、“0”,使用工程“hello_led1”生成的目标文件“hello_led.fs”。双击“Operation”列的下面的方式选项,弹出的“Device configuration”窗口,访问模式选择内嵌Flash方式,操作方式选择内嵌Flash擦除、编程、验证(也可以选择内嵌Flash擦除、编程,不需要验证,这里选验证只是个人习惯,不选验证一般也不会出问题)。设置完毕,保存设置,关闭器件配置窗口。最后先“程序/配置”按钮开始向内部Flash烧录程序。
烧录过程中擦除和编程都很快,不足5秒。
在最后的验证阶段用了三十多秒。
烧录完毕,在输出窗口有相关信息提示,具体内容无需比较明确,无需过多解释。值得注意的是最后一条,用时40.82秒,主要花在了验证阶段。
烧录完成,按开发板左下角的复位按键SW5(目前实际为重配置功能),可看到左边、右边的两个灯分别每秒交替亮灭一次,与预期效果一致。
至此,内部Flash程序固化功能实现。
烧写外部Flash,将MODE0、MODE1分别设置为“1”、“1”,使用工程“hello_led2”生成的目标文件“hello_led.fs”。双击“Operation”列的下面的方式选项,弹出的“Device configuration”窗口,访问模式选择外部Flash方式,操作方式选择外部Flash擦除、编程、验证通过GAO-Bridge(与上面相同,选择验证项,纯性个人习惯)。
整个烧录过程用时9.52秒。单纯的擦除、编程两个步骤,内部Flash要快一些;加上验证后,外部Flash要快些。
烧录完成,将MODE0、MODE1分别设置为“0”、“1”,按开发板左下角的复位按键SW5(目前实际为重配置功能),可看到上边、下边的两个灯分别每秒交替亮灭一次,与预期效果一致。
至此,外部部Flash程序固化功能实现。
从按复位按键SW5到FPGA正式执行程序,使用内部Flash要比外部Flash用时短一些,具体原因未作研究。
(下载次数: 12, 2021-12-19 23:53 上传)
(下载次数: 6, 2021-12-19 23:53 上传)