gs001588 发表于 2021-12-20 00:42

【国产FPGA高云GW1N-4系列开发板测评】——5、内部Flash和外部Flash程序固化测试

本帖最后由 gs001588 于 2021-12-20 00:47 编辑

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;【国产FPGA高云GW1N-4系列开发板测评】&mdash;&mdash;5、内部Flash和外部Flash程序固化测试</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;FPGA在功能调试过程中是把程序下载到SRAM中,断电后丢失。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;要实现断电重新上电后程序自动运行,需要将程序固化到Flash中。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;开发板使用的GW1N-4B系列FPGA,可通过内部Flash加载程序,也可通过外部Flash加载程序,通过模式选择位MODE0、MODE1来区分。外部Flash开发板上默认不焊,自己已采购并焊接,型号为华邦的W25Q64JVSIQ。在之前的开箱贴中有说过(【国产FPGA高云GW1N-4系列开发板测评】&mdash;&mdash;2、补个开箱贴开发板与购买的Flash <a href="https://bbs.eeworld.com.cn/thread-1189058-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1189058-1-1.html</a>)</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;在用户手册&ldquo;DK_MINI_GW1N-LV4LQ144C6I5_V1.1.pdf&rdquo;中有相关内部介绍。如下图所示:</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;在开发板实物,MODE0、MODE1位置,及&ldquo;0&rdquo;、&ldquo;1&rdquo;设置,如下图所示。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;开发板背面有管脚标示如下图,分别为1、3脚。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp; 对照原理图&ldquo;DK_MINI_GW1N-LV4LQ144C6I5_V1.1_Sch.pdf&rdquo;中相关部分如下图,跳线帽短接1、2脚,相当于MODE1接3.3V,逻辑高电平&ldquo;1&rdquo;;跳线帽短接2、3脚,逻辑低电平&ldquo;0&rdquo;。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp; 为测试如何程序固化,仍然使用LED闪灯来实现,代码如下。代码比较简单,时钟分频、LED状态翻转。</span></span></p>

<pre>
<code>--*******************************************************************************
--*-------------------------- 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:        INSTD_LOGIC;        --50MHz系统时钟
                     
-------------------------------------------------------------------------------
--系统全局复位 RESET
-------------------------------------------------------------------------------
    NRESET:   INSTD_LOGIC;
                               
-------------------------------------------------------------------------------
--系统状态指示灯
-------------------------------------------------------------------------------
    LED:                        OUTSTD_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 &lt;=LED_Reg;

PROCESS(NRESET,CLK_50M)
BEGIN
        IF (NRESET = '0') THEN
      COUNTER &lt;= 0;
        ELSIF (RISING_EDGE(CLK_50M)) THEN
      IF (COUNTER &lt; 50000000-1) THEN
            COUNTER &lt;= COUNTER + 1;
      ELSE
            COUNTER &lt;= 0;
      END IF;
        END IF;               
END PROCESS;

PROCESS(NRESET,CLK_50M)
BEGIN
        IF (NRESET = '0') THEN
      LED_Reg &lt;= "0101";
        ELSIF (RISING_EDGE(CLK_50M)) THEN
      IF (COUNTER = 25000000-1) OR (COUNTER = 50000000-1)THEN
            LED_Reg &lt;= NOT LED_Reg;
      END IF;
        END IF;               
END PROCESS;

END MY_CODE;
</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp; 程序工程中使用了4个LED灯,LED(1)到LED(4)分别对应开发板实物的D7、D8、D9、D20,开发板上D7、D9在左边,D8、D20在右边。对照原理图如下图,可以知到LED灯是低电平&ldquo;0&rdquo;点亮。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;为区别内部Flash程序和外部Flash程序效果,程序代码稍做区分。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;给内部Flash烧写程序的代码第67行,LED初始状态&ldquo;0101&rdquo;,表示复位时右边的D8、D20点亮,左边的D7、D9灭状态。每秒左边、右边的两个灯分别交替亮灭一次。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;给外部Flash烧程序的代码第67行,LED初始状态&ldquo;1100&rdquo;,表示复位时上边的D7、D8点亮,下边的D9、D20灭状态。每秒上边、下边的两个灯分别交替亮灭一次。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;烧写内部Flash,首先将MODE0、MODE1分别设置为&ldquo;0&rdquo;、&ldquo;0&rdquo;,使用工程&ldquo;hello_led1&rdquo;生成的目标文件&ldquo;hello_led.fs&rdquo;。双击&ldquo;Operation&rdquo;列的下面的方式选项,弹出的&ldquo;Device configuration&rdquo;窗口,访问模式选择内嵌Flash方式,操作方式选择内嵌Flash擦除、编程、验证(也可以选择内嵌Flash擦除、编程,不需要验证,这里选验证只是个人习惯,不选验证一般也不会出问题)。设置完毕,保存设置,关闭器件配置窗口。最后先&ldquo;程序/配置&rdquo;按钮开始向内部Flash烧录程序。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;烧录过程中擦除和编程都很快,不足5秒。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;在最后的验证阶段用了三十多秒。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;烧录完毕,在输出窗口有相关信息提示,具体内容无需比较明确,无需过多解释。值得注意的是最后一条,用时40.82秒,主要花在了验证阶段。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;烧录完成,按开发板左下角的复位按键SW5(目前实际为重配置功能),可看到左边、右边的两个灯分别每秒交替亮灭一次,与预期效果一致。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;至此,内部Flash程序固化功能实现。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;烧写外部Flash,将MODE0、MODE1分别设置为&ldquo;1&rdquo;、&ldquo;1&rdquo;,使用工程&ldquo;hello_led2&rdquo;生成的目标文件&ldquo;hello_led.fs&rdquo;。双击&ldquo;Operation&rdquo;列的下面的方式选项,弹出的&ldquo;Device configuration&rdquo;窗口,访问模式选择外部Flash方式,操作方式选择外部Flash擦除、编程、验证通过GAO-Bridge(与上面相同,选择验证项,纯性个人习惯)。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;整个烧录过程用时9.52秒。单纯的擦除、编程两个步骤,内部Flash要快一些;加上验证后,外部Flash要快些。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"></span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;烧录完成,将MODE0、MODE1分别设置为&ldquo;0&rdquo;、&ldquo;1&rdquo;,按开发板左下角的复位按键SW5(目前实际为重配置功能),可看到上边、下边的两个灯分别每秒交替亮灭一次,与预期效果一致。</span></span></p>

<p><span style="font-size:16px;"><span style="font-family:宋体;">&nbsp; &nbsp;至此,外部部Flash程序固化功能实现。</span></span></p>

<p>&nbsp;</p>

<p><font face="宋体"><span style="font-size: 16px;">&nbsp; &nbsp;从按</span></font><span style="font-size:16px;"><span style="font-family:宋体;">复位按键SW5到FPGA正式执行程序,使用内部Flash要比外部Flash用时短一些,具体原因未作研究。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><span style="font-family:宋体;"><br />
</span></span><br />
<br />
&nbsp;</p>

gs001588 发表于 2021-12-20 02:22

<p><span style="font-size:16px;"><span style="font-family:宋体;">在外部Flash器件选择列表中没找到 W25Q64JVSIQ,需要选 <span style="color:#ff0000;"><strong>W25Q64BV</strong></span>。</span></span></p>

Jacktang 发表于 2021-12-20 07:31

<p>整的不错</p>

<p>用内部Flash要比外部Flash用时短一些这比较正常,</p>

<p>&nbsp;</p>

<p>华邦的W25Q64JVSIQ是64Mb FLASH 存储器</p>

<p>好像价格下来了,几元一片</p>

<p>&nbsp;</p>

怀揣少年梦 发表于 2021-12-20 08:17

<p>学习一下</p>

annysky2012 发表于 2021-12-20 08:34

<p>测试的很详细。楼主还可以使用一种自动模式切换启动方式。这个可以自己研究一下</p>
页: [1]
查看完整版本: 【国产FPGA高云GW1N-4系列开发板测评】——5、内部Flash和外部Flash程序固化测试