1283331_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

1283331_ja-JP

1283331_ja-JP

DDRモードを有効にする方法

ご存知のように、RTシリーズMCUはXIP (Execute in place) モードをサポートしており、ピン数を節約できるという利点があります。FlexSPIモジュールはシリアルNORフラッシュからコードとデータを非常に効率的に取得してCortex-M7を実行できるため、シリアルNORフラッシュが最も一般的に使用されています。

フェッチ方法はQuad IO Fast Readコマンドを利用して実装されています。一方、シリアルNORフラッシュはSDR(単一データ転送レート)モードで動作し、SCLKの立ち上がりエッジでデータを受信し、SCLKの立ち下がりエッジでデータを送信します。SDRモードと比較すると、DDR(デュアルデータ転送レート)モードはスループット容量が高く、XIPモードでより良いパフォーマンスを提供できるかどうか、またシリアルNORフラッシュをDDRモードで動作させる方法について教えてください。

SDR & DDR mode

SDRモード:

SDR(シングルデータ転送レート)モードでは、データはクロックの一方のエッジ(立ち上がりエッジまたは立ち下がりエッジ)でのみクロックされます。つまり、SDRでデータがX Mbpsで送信されるには、クロック・ビット・レートが2X Mbpsである必要があります。

DDR mode:

DDR(デュアルデータ転送レート)モード(DTR(デュアル転送レート)モードとも呼ばれる)では、データはクロックの立ち上がりエッジと立ち下がりエッジの両方で転送されます。これは、データがX Mbpsで伝送される場合、クロック・ビット・レートもX Mbpsである必要があり、したがって帯域幅が2倍になることを意味します(図1を参照)。

 607d6292-2cbd-4b2a-b38a-12aa28dea35b.png

図1

DDRモードを有効にする

以下の手順は、DDRモードで動作するi.MX RT1060をQSPIから起動する方法を示しています。

注記:ボードは MIMXRT1060、IDEは MCUXpresso IDEです

  • hello_worldをテンプレートとして開きます

  • FDCB(フラッシュデバイス構成ブロック)を変更する

    a) controllerMiscOptionパラメータをDDR読み取りコマンドをサポートするように設定してください。

    b) シリアル・フラッシュ周波数を60MHzに設定します。

    c) DDR読み出しコマンドをコマンド・シーケンスに解析します。
    次の表は、DDR Quad IO FAST READ 命令のテンプレートコマンド・シーケンスを示しており、IS25WP064のFRQDTR (Fast Read Quad IO DTR) シーケンスとほぼ一致しています(図2を参照)。

     464e88df-c827-4e9a-aca7-f186f9deb08b.png

    0c69c7bd-0c2d-4d26-ad63-79215066ef43.png

    図2 FRQDTRシーケンス

    d)ダミーサイクルを調整します。

    ダミーサイクルは特定のシリアルクロック周波数と一致する必要があり、FRQDTRシーケンスコマンドのデフォルトのダミーサイクルは6です(以下の表に示すように)。

     acb79a28-294b-4721-a400-8a1bab9929bd.png

    しかし、シリアルクロックの周波数が60MHzの場合、ダミーサイクルは4に変更する必要があります(以下の表を参照してください)。

     8b35efcb-ba9d-4f53-aa81-06623912b07e.png

    そのため、FDCB に SET READ PARAMETERS コマンドシーケンス(図 3 参照)を手動で追加し、読み取りレジスタの [P6:P3] ビット(下表参照)を設定する必要があります。

    df0c1221-02cf-4dee-abd5-95da48e1fb58.png

    edbd5ad3-70fd-4d48-bf39-914e77e58e88.png

    図3 SET READ PARAMETERS コマンドシーケンス

    さらに、DDRモードでは、SCLKサイクルはシリアル・ルート・クロック・サイクルの2倍になります。オペランドの値は、デバイスのデータシートでダミー・サイクルがどのように定義されているかに応じて 2N、2N-1、または2*N+1 に設定する必要があります。

    最終的に、以下のように調整されたFCDBを取得できます。

    // Set Dummy Cycles
    #define FLASH_DUMMY_CYCLES      8
    // Set Read register command sequence's Index in LUT table
    #define CMD_LUT_SEQ_IDX_SET_READ_PARAM 7
    // Read,Read Status,Write Enable command sequences' Index in LUT table
    #define CMD_LUT_SEQ_IDX_READ           0
    #define CMD_LUT_SEQ_IDX_READSTATUS     1
    #define CMD_LUT_SEQ_IDX_WRITEENABLE    3
    
    const flexspi_nor_config_t qspiflash_config = {
        .memConfig =
            {
                .tag              = FLEXSPI_CFG_BLK_TAG,
                .version          = FLEXSPI_CFG_BLK_VERSION,
                .readSampleClksrc=kFlexSPIReadSampleClk_LoopbackFromDqsPad,
                .csHoldTime       = 3u,
                .csSetupTime      = 3u,
                // Enable DDR mode
                .controllerMiscOption = kFlexSpiMiscOffset_DdrModeEnable | kFlexSpiMiscOffset_SafeConfigFreqEnable,
    
                .sflashPadType    = kSerialFlash_4Pads,
                //.serialClkFreq    = kFlexSpiSerialClk_100MHz,
       .serialClkFreq    = kFlexSpiSerialClk_60MHz,
                .sflashA1Size     = 8u * 1024u * 1024u,
       
                // Enable Flash register configuration 
                .configCmdEnable = 1u,
                .configModeType[0] = kDeviceConfigCmdType_Generic,   
                .configCmdSeqs[0] = 
                    {
                        .seqNum = 1,
                        .seqId = CMD_LUT_SEQ_IDX_SET_READ_PARAM,
                        .reserved = 0,
                    },
          
                .lookupTable =
                    {
                // Read LUTs
         [4*CMD_LUT_SEQ_IDX_READ]     = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xED, RADDR_DDR, FLEXSPI_4PAD, 0x18),
         // The MODE8_DDR subsequence costs 2 cycles that is part of the whole dummy cycles
         [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_DDR, FLEXSPI_4PAD, 0x00, DUMMY_DDR, FLEXSPI_4PAD, FLASH_DUMMY_CYCLES-2),
         [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_DDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
         
         // READ STATUS REGISTER
         [4*CMD_LUT_SEQ_IDX_READSTATUS]   = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR,  FLEXSPI_1PAD, 0x01),
         [4*CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x00, 0, 0, 0),
          // WRTIE ENABLE
         [4*CMD_LUT_SEQ_IDX_WRITEENABLE] = FLEXSPI_LUT_SEQ(CMD_SDR,FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x00),
    
          // Set Read register
         [4*CMD_LUT_SEQ_IDX_SET_READ_PARAM]      = FLEXSPI_LUT_SEQ(CMD_SDR,FLEXSPI_1PAD, 0x63, WRITE_SDR, FLEXSPI_1PAD, 0x01),
         [4*CMD_LUT_SEQ_IDX_SET_READ_PARAM + 1] = FLEXSPI_LUT_SEQ(STOP,FLEXSPI_1PAD, 0x00, 0, 0, 0),
    
                    },
            },
        .pageSize           = 256u,
        .sectorSize         = 4u * 1024u,
        .blockSize          = 64u * 1024u,
        .isUniformBlockSize = false,
    };

    DDRモードは本当に優れていますか?

    RT1060のデータシートによると、以下の表はFlexSPI動作の最大周波数を示しています。MIMXRT1060のオンボードQSPIフラッシュはIS25WP064AJBLEで、MQSピンは含まれていません。MCR0.rxclksrc=1セット(内部ダミー・リード・ストロボとDQSからのループバック)が最も最適なオプションです。

    動作モード RXCLKsrc=0 RXCLKsrc=1 RXCLKsrc=3
    SDR 60 MHz 133 MHz 166 MHz
    DDR 30 MHz 66 MHz 166 MHz

    言い換えると、QSPIは、SDRモードでは最大133 MHzまで動作できるのに対し、DDRモードでは66 MHzです。スループット容量の観点から見ると、ほぼ同じです。DDRモードはIS25WP064AJBLEにとってより良いオプションではないようで、次の実験でその仮定が検証されるでしょう。

    実験

    • mbedtls_benchmark

    最初のテスト・デモとして mbedtls_benchmarkを使用し、以下の条件でデモを実行します。

    1. 100MH、SDRモード;
    2. 133MHz, SDR mode;
    3. 66MHz, DDR mode;

    対応するプリントアウトの情報(以下に示すように)に基づいて、比較用の表を作成し、図4に示すように、上記の3つの条件の中で実装項目のパフォーマンスが最悪のものをマークしました。

    SDR Mode run at 100 MHz.
    FlexSPI clock source is 3, FlexSPI Div is 6, PllPfd2Clk is 720000000
    mbedTLS version 2.16.6
    fsys=600000000
    Using following implementations:
      SHA: DCP HW accelerated
      AES: DCP HW accelerated
      AES GCM: Software implementation
      DES: Software implementation
      Asymmetric cryptography: Software implementation
    
      MD5                      :  18139.63 KB/s,   27.10 cycles/byte
      SHA-1                    :  44495.64 KB/s,   12.52 cycles/byte
      SHA-256                  :  47766.54 KB/s,   11.61 cycles/byte
      SHA-512                  :  2190.11 KB/s,  267.88 cycles/byte
      3DES                     :  1263.01 KB/s,  462.49 cycles/byte
      DES                      :  2962.18 KB/s,  196.33 cycles/byte
      AES-CBC-128              :  52883.94 KB/s,   10.45 cycles/byte
      AES-GCM-128              :  1755.38 KB/s,  329.33 cycles/byte
      AES-CCM-128              :  2081.99 KB/s,  279.72 cycles/byte
      CTR_DRBG (NOPR)          :  5897.16 KB/s,   98.15 cycles/byte
      CTR_DRBG (PR)            :  4489.58 KB/s,  129.72 cycles/byte
      HMAC_DRBG SHA-1 (NOPR)   :  1297.53 KB/s,  448.03 cycles/byte
      HMAC_DRBG SHA-1 (PR)     :  1205.51 KB/s,  486.04 cycles/byte
      HMAC_DRBG SHA-256 (NOPR) :  1786.18 KB/s,  327.70 cycles/byte
      HMAC_DRBG SHA-256 (PR)   :  1779.52 KB/s,  328.93 cycles/byte
      RSA-1024                 :  202.33  public/s
      RSA-1024                 :    7.00 private/s
      DHE-2048                 :    0.40 handshake/s
      DH-2048                  :    0.40 handshake/s
      ECDSA-secp256r1          :    9.00 sign/s
      ECDSA-secp256r1          :    4.67 verify/s
      ECDHE-secp256r1          :    5.00 handshake/s
      ECDH-secp256r1           :    9.33 handshake/s

    DDR Mode run at 66 MHz.
    FlexSPI clock source is 2, FlexSPI Div is 5, PllPfd2Clk is 396000000
    mbedTLS version 2.16.6
    fsys=600000000
    Using following implementations:
      SHA: DCP HW accelerated
      AES: DCP HW accelerated
      AES GCM: Software implementation
      DES: Software implementation
      Asymmetric cryptography: Software implementation
    
      MD5                      :  16047.13 KB/s,   27.12 cycles/byte
      SHA-1                    :  44504.08 KB/s,   12.54 cycles/byte
      SHA-256                  :  47742.88 KB/s,   11.62 cycles/byte
      SHA-512                  :  2187.57 KB/s,  267.18 cycles/byte
      3DES                     :  1262.66 KB/s,  462.59 cycles/byte
      DES                      :  2786.81 KB/s,  196.44 cycles/byte
      AES-CBC-128              :  52807.92 KB/s,   10.47 cycles/byte
      AES-GCM-128              :  1311.15 KB/s,  446.53 cycles/byte
      AES-CCM-128              :  2088.84 KB/s,  281.08 cycles/byte
      CTR_DRBG (NOPR)          :  5966.92 KB/s,   97.55 cycles/byte
      CTR_DRBG (PR)            :  4413.15 KB/s,  130.42 cycles/byte
      HMAC_DRBG SHA-1 (NOPR)   :  1291.64 KB/s,  449.47 cycles/byte
      HMAC_DRBG SHA-1 (PR)     :  1202.41 KB/s,  487.05 cycles/byte
      HMAC_DRBG SHA-256 (NOPR) :  1748.38 KB/s,  328.16 cycles/byte
      HMAC_DRBG SHA-256 (PR)   :  1691.74 KB/s,  329.78 cycles/byte
      RSA-1024                 :  201.67  public/s
      RSA-1024                 :    7.00 private/s
      DHE-2048                 :    0.40 handshake/s
      DH-2048                  :    0.40 handshake/s
      ECDSA-secp256r1          :    8.67 sign/s
      ECDSA-secp256r1          :    4.67 verify/s
      ECDHE-secp256r1          :    4.67 handshake/s
      ECDH-secp256r1           :    9.00 handshake/s

    2021-05-27_16-25-13.png

    図4 パフォーマンス比較

    ほとんどの実装項目は、QSPIが66MHzのDDRモードで動作しているときに最悪のパフォーマンスを示すことがわかります。

    • Coremarkデモ

    2番目のデモは、上記の3つの条件下でCoremarkデモを実行しており、その結果は以下に示されています。

    SDR Mode run at 100 MHz.
    FlexSPI clock source is 3, FlexSPI Div is 6, PLL3 PFD0 is 720000000
    
    2K performance run parameters for coremark.
    CoreMark Size    : 666
    Total ticks      : 391889200
    Total time (secs): 16.328717
    Iterations/Sec   : 2449.671999
    Iterations       : 40000
    Compiler version : MCUXpresso IDE v11.3.1
    Compiler flags   : Optimization most (-O3)
    Memory location  : STACK
    seedcrc          : 0xe9f5
    [0]crclist       : 0xe714
    [0]crcmatrix     : 0x1fd7
    [0]crcstate      : 0x8e3a
    [0]crcfinal      : 0x25b5
    Correct operation validated. See readme.txt for run and reporting rules.
    CoreMark 1.0 : 2449.671999 / MCUXpresso IDE v11.3.1 Optimization most (-O3) / STACK

    SDR Mode run at 133 MHz.
    FlexSPI clock source is 3, FlexSPI Div is 4, PLL3 PFD0 is 664615368
    
    2K performance run parameters for coremark.
    CoreMark Size    : 666
    Total ticks      : 391888682
    Total time (secs): 16.328695
    Iterations/Sec   : 2449.675237
    Iterations       : 40000
    Compiler version : MCUXpresso IDE v11.3.1
    Compiler flags   : Optimization most (-O3)
    Memory location  : STACK
    seedcrc          : 0xe9f5
    [0]crclist       : 0xe714
    [0]crcmatrix     : 0x1fd7
    [0]crcstate      : 0x8e3a
    [0]crcfinal      : 0x25b5
    Correct operation validated. See readme.txt for run and reporting rules.
    CoreMark 1.0 : 2449.675237 / MCUXpresso IDE v11.3.1 Optimization most (-O3) / STACK

    DDR Mode run at 66 MHz.
    FlexSPI clock source is 2, FlexSPI Div is 5, PLL3 PFD0 is 396000000
    
    2K performance run parameters for coremark.
    CoreMark Size    : 666
    Total ticks      : 391890772
    Total time (secs): 16.328782
    Iterations/Sec   : 2449.662173
    Iterations       : 40000
    Compiler version : MCUXpresso IDE v11.3.1
    Compiler flags   : Optimization most (-O3)
    Memory location  : STACK
    seedcrc          : 0xe9f5
    [0]crclist       : 0xe714
    [0]crcmatrix     : 0x1fd7
    [0]crcstate      : 0x8e3a
    [0]crcfinal      : 0x25b5
    Correct operation validated. See readme.txt for run and reporting rules.
    CoreMark 1.0 : 2449.662173 / MCUXpresso IDE v11.3.1 Optimization most (-O3) / STACK

    CoreMarkスコアを比較した後、QSPIが66 MHzのDDRモードで動作しているときに、CoreMarkスコアが最も低くなります。しかし、実際にはかなり近いです。

    上記の2つのテストから、少なくともi.MX RT10xxシリーズMCUにおいて、DDRモードはおそらく最良の選択肢ではないことがわかります。

i.MXRT 102倍i.MXRT 105倍i.MXRT 106倍
タグ(1)
評価なし
バージョン履歴
最終更新日:
‎01-04-2026 11:38 PM
更新者: