在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在MAX78000上開發功耗優化應用

星星科技指導員 ? 來源:ADI ? 作者:ADI ? 2023-02-17 11:20 ? 次閱讀

功耗是邊緣人工智能AI) 應用的關鍵因素,其中整個系統由小型電池供電,預計無需充電或更換電池即可運行數月。MAX78000超低功耗AI微控制器專為物聯網邊緣的此類應用而設計。本文介紹了各種配置,使用戶能夠在MAX78000上開發功耗優化應用,并提供基準測試示例。功耗優化方法應用于兩個案例研究應用:20個關鍵詞的關鍵詞發現(KWS20)和人臉識別(FaceID),報告的結果可作為用戶應用的指南。

介紹

MAX78000為超低功耗微控制器,具有專用卷積神經網絡(CNN)加速器。這種架構能夠在能源受限的環境中開發非常節能的 AI 應用程序。MAX78000提供多種選擇,便于開發低功耗應用(詳見數據資料[1]),例如可根據目標應用選擇不同的振蕩器時鐘源和工作模式。以下部分概述了這些選項,包括MAX78000評估板的實際示例和實際測量結果。有關詳細信息,請遵循本文檔中的參考資料

注:本應用筆記給出的測量結果基于MAX78000評估板上的示例代碼。用戶平臺和特定應用程序的實際結果可能會有所不同。

MAX78000

MAX78000是新一代AI微控制器,用于以超低功耗執行神經網絡,并位于物聯網邊緣。該產品將最節能的AI處理與Maxim Integrated成熟的超低功耗微控制器相結合。基于硬件的 CNN 加速器使電池供電的應用程序能夠執行 AI 推理,同時僅消耗微焦耳的能量。MAX78000具有帶FPU微控制器的Atarm Cortex-M4,通過超低功耗深度神經網絡加速器實現高效的系統控制。還集成了一個RISC-V內核,可以執行應用和控制代碼以及驅動CNN加速器。圖1所示為MAX78000的頂層架構。

pYYBAGPu8nqARp5uAACo-uh3EhY945.jpg?imgver=1

圖1.MAX78000的結構

MAX78000評估板(EV kit)提供了一個平臺,利用MAX78000的功能構建新一代AI器件。評估板具有板載硬件,如數字麥克風、串行端口、攝像頭模塊支持和3.5英寸觸摸彩色薄膜晶體管TFT)顯示屏[2]。它還包括用于監控和顯示功率電平的電路。MAX34417 [3] 監測 VCOREA 和 VCOREB 電壓以及

pYYBAGPu8nyAFhiCAABOERtMmcA564.jpg?imgver=1

圖2.電源監視器。

MAX78000,并將累積功率報告給MAX32625,MAX2用作電源數據處理器,同時控制功率顯示,如圖<>所示。

電源監視器以兩種模式運行;瞬時,顯示平均功率、電源電流和電壓,以及窗口能量累積,根據觸發事件測量 CNN 功率或總系統功率。瞬時測量通常用于快速、粗略地估計功率電平。另一方面,窗口測量非常適合測量用戶定義的開始實例和完整實例之間的累積能量。這些事件由MAX78000的兩個GPIO(P0.2和P0.3)的切換觸發,這兩個GPIO也連接到LED1和LED2以及MAX32625功率數據處理器的端口。有關使用電源監視器的詳細信息,請參閱 [4]。

MAX78000時鐘和工作模式

MAX78000支持不同的時鐘源和低功耗工作模式,可聯合配置以實現優化的功耗和性能。本應用筆記簡要介紹了每種模式,以指導讀者根據所需應用設置模式。有關更詳細的描述,請參閱 [5]。

時鐘

MAX78000包括多個可配置時鐘,供不同外設使用。用戶可以根據需要配置時鐘源,以選擇性能和電源效率的組合。選定的系統振蕩器(SYS_OSC)是大多數內部模塊的時鐘源。以下振蕩器源可用,可以選擇SYS_OSC:

內部初級振蕩器 (IPO) – 100MHz:
IPO 是頻率最快的振蕩器,消耗的功率最大。當進入低功耗模式(LPM)時,該振蕩器可以關斷。

內部次級振蕩器 (ISO) – 60MHz:
這是一款低功耗內部次級振蕩器,是SYS_OSC的上電復位默認設置。

內部納米環振蕩器 (INRO) – 8kHz-30kHz:
INRO 是一種超低功耗內部振蕩器,可以選擇作為SYS_OSC并始終啟用。頻率可配置為 8kHz、16kHz 或 30kHz(默認)。

內部波特率振蕩器 (IBRO) – 7.3728MHz:
這是一款功耗非常低的內部振蕩器,可以選擇作為SYS_OSC。該時鐘可以選擇用作UART的專用波特率時鐘。

外部實時時鐘振蕩器 (ERTCO) – 32.768kHz:
ERTCO 是一款功耗極低的內部振蕩器,可以選擇作為SYS_OSC。ERTCO可以選擇使用32.768kHz輸入時鐘或8kHz獨立納米環振蕩器代替外部晶體。該振蕩器是實時時鐘 (RTC) 的默認時鐘,一旦啟用 RTC,就會自動啟用。

所選SYS_OSC是系統振蕩器分頻器的輸入,用于生成系統時鐘 (SYS_CLK)。分頻器可在 0 到 7 之間選擇,得到 1、2、4、8、16、32、64 或 128 的除數。SYS_CLK驅動帶有 FPU 內核的 Arm Cortex-M4,以及系統中的所有高級高性能總線 (AHB) 主站。通過兩個分頻器的固定分頻后,它還可以生成高級外設總線(APB)時鐘,為CNN加速器、RISC-V和外設供電。有關時鐘源、配置和要設置的寄存器列表的更多詳細信息,請參閱 [3] 的第 1.5 節。

表 1 中列出了用于設置時鐘的 API

應用程序接口 描述
int MXC_SYS_ClockSourceEnable (mxc_sys_system_clock_t clock) 啟用時鐘源而不選擇它;以下來源可用:
MXC_SYS_CLOCK_IPO、MXC_SYS_CLOCK_IBRO、MXC_SYS_CLOCK_ISO、MXC_SYS_CLOCK_INRO、MXC_SYS_CLOCK_ERTCO MXC_SYS_CLOCK_EXTCLK
int MXC_SYS_Clock_Select (mxc_sys_system_clock_t clock) 選擇要用于SYS_CLK的時鐘源;有關列表,請參閱時鐘部分
void SystemCoreClockUpdate(void) 根據所選時鐘源更新系統核心時鐘
無效MXC_SYS_ClockEnable(mxc_sys_periph_clock_t時鐘) 支持外設時鐘:
MXC_SYS_PERIPH_CLOCK_GPIO0 至 2
MXC_SYS_PERIPH_CLOCK_DMA
MXC_SYS_PERIPH_CLOCK_SPI0和 1
MXC_SYS_PERIPH_CLOCK_UART0 至 3
MXC_SYS_PERIPH_CLOCK_I2C0 至 2
MXC_SYS_PERIPH_CLOCK_TMR0 至 5
MXC_SYS_PERIPH_CLOCK_ADC
MXC_SYS_PERIPH_CLOCK_CNN
MXC_SYS_PERIPH_CLOCK_PT
MXC_SYS_PERIPH_CLOCK_TRNG
MXC_SYS_PERIPH_CLOCK_SMPHR
MXC_SYS_PERIPH_CLOCK_OWIRE

MXC_SYS_PERIPH_CLOCK_CRC MXC_SYS_PERIPH_CLOCK_AES
MXC_SYS_PERIPH_CLOCK_I2S
MXC_SYS_PERIPH_CLOCK_PCIF
MXC_SYS_PERIPH_CLOCK_WDT0
MXC_SYS_PERIPH_CLOCK_CPU1 // RISC-V 時鐘
MXC_SYS_PERIPH_CLOCK_WDT1
MXC_SYS_PERIPH_CLOCK_LPCOMP1 至 3
無效MXC_SYS_ClockDisable(mxc_sys_periph_clock_t時鐘) 禁用外設時鐘;有關列表,請參閱時鐘部分

操作模式

MAX78000包括多種工作模式,能夠微調電源選項以優化性能和功耗。系統支持以下操作模式,如表 2 所示。

Operation Mode Arm RISC-V Oscillators System CNN Quadrants CNN RAM Peripherals
ACTIVE On On All available Available Active, Configurable Active, Configurable Available
SLEEP Retention On/ Retention All available Available Active, Configurable Active, Configurable Available
LPM Retention On/ Retention ISO, IBRO,
ERTCO, INRO
0,1: Retention
2,3: Available
Active, Configurable Active, Configurable Available
UPM Retention Retention IBRO,
ERTCO, INRO
Retention Optionally off Selectable retention Retention,
LPUART0, LPTMR0-1 LPWDT0, LPCOMP0-3,
GPIO, WUT, RTC available
STANDBY Retention Retention IBRO,
ERTCO, INRO
Retention Off Selectable retention Retention,
WUT, RTC, COMP0, GPIO available
BACKUP Off Off ERCO Configurable
retention
Off Selectable retention Off
WUT, RTC, COMP0, GPIO available
POWER
DOWN
Off Off Off Off Off Off Off,
Configurable P3.0/1

活動模式:

在這種模式下,Arm 和 RISC-V 內核都可以執行應用代碼,并且所有數字和模擬外設均可按需提供。動態時鐘禁用未使用的外設,提供高性能和低功耗的最佳組合。每個外設都可以在活動模式下單獨使能或斷電。CNN 和四個 CNNx16_n 處理器陣列中的每一個及其相關存儲器都可以根據需要關閉電源或設置為活動狀態。

睡眠模式:

當 Arm 或 RISC-V 執行代碼時,可以使用此模式,在此期間,另一個進入睡眠狀態以降低功耗。可以選擇啟用時鐘以加快喚醒過程。CNN 可供使用,四個CNNx16_n象限中的每一個都可以單獨配置為關斷。除非明確禁用,否則所有外圍設備均處于打開狀態

To enter SLEEP Mode:
     SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;  // Needed just once

Either directly set sleep mode bit in MXC_GCR->pm register, or use WFI instruction:
?  MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
MXC_GCR->pm   |= MXC_S_GCR_PM_MODE_CM4;
?  Or use WFI:
o   Arm:  __WFI(); // Enter to sleep and wait for interrupt to wake up
o   RISC-V: asm volatile("wfi");

To enter into this mode on Arm, MXC_LP_EnterSleepMode() API call can also be used.

低功耗模式:

如果RISC-V希望在Arm處于深度睡眠狀態時從啟用的外設收集和移動數據,則可以使用此模式。如果未使用 RISC-V 并且處于睡眠模式,則 Arm 還可以處理數據并在外圍設備或 CNN 處于活動狀態并在中斷時喚醒時切換到 LPM。Arm、DMA 和 SPI0 處于狀態保留狀態。CNN 象限、內存和其他外設處于活動狀態且可配置。請注意,CNN 只能喚醒 RISC-V,而不能喚醒 LPM 中的 Arm。在這種情況下,如果 CNN 處理時間已知,則喚醒計時器 (WUT) 可用于喚醒 Arm。或者,CNN中斷可以喚醒RISC-V,RISC-V反過來可以喚醒Arm,然后RISC-V可以重新進入睡眠狀態。

Before going to LPM:
Make sure the clock source is enabled during LPM in MXC_GCR->pm, for example:
 MXC_GCR->pm &= ~MXC_F_GCR_PM_ISO_PD;  // enable ISO during sleep

Power Sequencer Registers (PWRSEQ) are used to configure clock source and wake up source. The clock source for peripherals and RISC-V needs to be specified. By default, it uses ISO during LPM. If needed, set this field to 1 to use the PCLK (APB Clock = SYS_CLK/2)
PWRSEQ_LPCN ->lpcn |= MXC_F_PWRSEQ_LPCN_LPMCLKSEL;

The wakeup source of the low power peripheral (e.g GPIO, RISC-V) needs to be enabled. For example:
MXC_PWRSEQ->lppwen |= MXC_F_PWRSEQ_LPPWEN_CPU1;  // wake up on RISC-V interrupt

To enter LPM:
     SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;  // Needed just once
     /* Write 1 to clear */
    MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
    MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
    MXC_PWRSEQ->lppwst  = 0xFFFFFFFF; 
    MXC_MCR->ctrl |= MXC_F_MCR_CTRL_ERTCO_EN; // enable ERTCO 

Either directly set sleep mode bit in MXC_GCR->pm register, or use WFI instruction:
  • MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE; MXC_GCR->pm |= MXC_S_GCR_PM_MODE_LPM;
  • Or use WFI:
    • Arm:__WFI(); // Enter to deepsleep, wait for interrupt to wake up

在LPM中,IPO斷電,應使用IBRO,ERTCO,INRO或ISO。

注意:如果 Arm 內核進入 LPM,RISC-V 可以根據需要繼續執行并進入睡眠狀態。如果需要在兩個內核之間管理 LPM 的入口,則可以使用多處理器通信來確保兩個內核都處于已知狀態。有關詳細信息,請參閱 [3] 中的第 3.3.5 節。

微功耗模式:

此模式用于極低的功耗,同時使用最少的外設集來提供喚醒功能。在此模式下,將保留 Arm 和 RISC-V、系統和 CNN RAM 以及非 UPM 外設的狀態。CNN 象限可以關閉。IPO 和 ISO 振蕩器斷電,IBRO、ERTCO和INRO啟用。以下外設可用作喚醒源:WUT、LPUART0、LPTMR0、LPTMR1、LPWDT0、LPCOMP0-LPCOMP3 和 GPIO

To enter UPM Mode:
      /* Write 1 to clear */
     MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
     MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
     MXC_PWRSEQ->lppwst  = 0xFFFFFFFF; 
     MXC_MCR->ctrl |= MXC_F_MCR_CTRL_ERTCO_EN; // enable ERTCO 

Set UPM mode bit in MXC_GCR->pm register:
      MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
MXC_GCR->pm |= MXC_S_GCR_PM_MODE_UPM;

To enter into this mode on Arm, MXC_LP_EnterDeepSleepMode() API call can also be used.

這種模式在低活動循環應用中最有利于節省能源。

為了確保確定性地進入 UPM 模式,Arm 和 RISC-V 可能需要使用多處理器通信進行同步。有關更多信息,請參閱 [3] 中的第 3.4.5 節。

待機模式:

在此模式下,RTC 運行時保留系統狀態;Arm、RISC-V、System RAM、GPIO 和外設也保留其狀態。CNN 象限關閉,CNN 內存具有可選擇的保留。IPO 和 ISO 振蕩器斷電,ERTCO、INRO 和 IBRO 啟用。如果需要對應用進行占空比,此模式可提供進一步的功耗降低。

To enter STANDBY Mode:
     /* Write 1 to clear */
    MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
    MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
    MXC_PWRSEQ->lppwst = 0xFFFFFFFF; 
    MXC_MCR->ctrl |= MXC_F_MCR_CTRL_ERTCO_EN; // enable ERTCO 

Set STANDBY mode bit in MXC_GCR->pm register:
    MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
    MXC_GCR->pm |= MXC_S_GCR_PM_MODE_STANDBY;

To enter into this mode on Arm, MXC_LP_EnterStandbyMode() API call can also be used.

為了確保確定性地進入待機模式,Arm 和 RISC-V 可能需要使用多處理器通信進行同步。有關更多信息,請參閱 [3] 中的第 3.5.5 節。

備份模式:

此模式用于保留系統內存。在此模式下,Arm、RISC-V、所有外設和除 ERTCO 之外的所有振蕩器都將關閉電源。系統 RAM 0-3 可以獨立配置為使用 PWRSEQ_LPCN 寄存器保留狀態。

進入備份模式不需要 Arm 和 RISC-V 之間的同步,任何一個內核都可以將 GCR_PM.mode 設置為 BACKUP,這會導致設備立即進入 BACKUP。

To enter BACKUP Mode:
     /* Write 1 to clear */
    MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
    MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
    MXC_PWRSEQ->lppwst  = 0xFFFFFFFF; 

 Set BACKUP mode bit in MXC_GCR->pm register:
    MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
    MXC_GCR->pm |= MXC_S_GCR_PM_MODE_BACKUP

To enter into this mode on Arm, MXC_LP_EnterBackupMode() API call can also be used.

掉電模式:

此模式在產品級別的分發和存儲期間使用。ARM、RISC-V、存儲器、外設和振蕩器均斷電。在此模式下沒有數據保留,但閃存中的值會保留。在此模式下,V雷吉POR電壓監視器正在運行。

如果已配置,可通過外部復位 (RSTN) 或 P3.0 或 P3.1 上的喚醒事件退出 PDM。

To enter PDM Mode:
 MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
 MXC_GCR->pm |= MXC_S_GCR_PM_MODE_POWERDOWN

To enter into this mode on Arm, MXC_LP_ShutDownMode() API call can also be used.

喚醒配置

需要將 Arm 和 RISC-V 配置為在發生喚醒事件時喚醒。有關不同操作模式下的喚醒源列表,請參閱 [3] 中的第 4.5 節。

手臂喚醒配置:

應啟用中斷。在 SLEEP 的情況下,Arm 內核會喚醒 after__WFI() 以響應任何中斷。

對于低功耗模式,需要啟用喚醒源:

在電源排序器寄存器 (PWRSEQ) 中:在低功耗外設喚醒中啟用外設和特定 GPIO 源 啟用寄存器(PWRSEQ_LPWKEN0 至 3,PWRSEQ_LPPWEN)

在全局控制寄存器 (GCR) 中:在電源管理寄存器 (GCR_PM) 中啟用 GPIO 喚醒使能和 RTC 報警喚醒啟用

Example of Arm wakeup configuration: 
Wakeup from LPM on GPIO:
 MXC_GCR->pm  |= MXC_F_GCR_PM_GPIO_WE;  // enable wakeup from GPIOs
 MXC_PWRSEQ->lpwken2 |= (1 << 7);   // Pb2: GPIO2.7 is selected for wakeup

Wakeup from LPM on RISC-V interrupt:
 MXC_PWRSEQ->lppwen |= MXC_F_PWRSEQ_LPPWEN_CPU1; // wakeup on RISC-V interrupt

RISC-V 喚醒配置:

要將RISC-V配置為在中斷時喚醒,需要啟用IRQ和EVENT。

Example of RISC-V wakeup configuration: 
 __enable_irq();
 NVIC_EnableIRQ(CNN_IRQn);
 NVIC_EnableEVENT(CNN_IRQn);

表 3 顯示了 Arm 和 RISC-V 代碼的示例。Arm 進入 LPM(深度睡眠),RISC-V 初始化并啟動 CNN,然后進入睡眠狀態,直到 CNN 推理完成。之后,CNN中斷喚醒RISC-V,然后喚醒ARM也。

有關此示例的完整代碼,請參閱 [6]。

Arm RISC-V
mnist-riscv
int main(void)
{
MXC_ICC_Enable(MXC_ICC0); // 啟用緩存
// 切換到 100 MHz 時鐘
MXC_SYS_Clock_Select(MXC_SYS_CLOCK_IPO);
SystemCoreClockUpdate();
設置 RISC-V 引導地址
MXC_FCR->urvbootaddr = (uint32_t) &__FlashStart_;
啟用森帕霍爾時鐘MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SMPHR);設置喚醒 ISR NVIC_SetVector(RISCV_IRQn, WakeISR
); 不要刪除此行:
MXC_Delay(SEC(2));如果需要,讓調試器中斷 啟用 RISC-V 時鐘
MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CPU1);
轉到 LPM,等待 RISC-V 喚醒
MXC_LP_ClearWakeStatus();
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // SLEEPDEEP=1
__WFI(); // 轉到深度睡眠,讓 RISC-V 運行
返回 0;
} void WakeISR(void)
{
MXC_SEMA->irq0 = MXC_F_SEMA_IRQ0_EN & ~MXC_F_SEMA_IRQ0_CM4_IRQ;
}
int main(void)
{
Debug_Init(); // 設置 RISCV JTAG
MXC_ICC_Enable(MXC_ICC1); // 啟用緩存 使能外設, CNN 中斷, CNN 時鐘 // CNN 時鐘
: 50 MHz 分區 1
cnn_enable(MXC_S_GCR_PCLKDIV_CNNCLKSEL_PCLK, MXC_S_GCR_PCLKDIV_CNNCLKDIV_DIV1); cnn_init();使狀態機進入一致的狀態
cnn_load_weights();加載內核
cnn_load_bias();
cnn_configure();配置狀態機
load_input();加載數據輸入

cnn_start(); // 在 (cnn_time == 0)
asm volatile(“WFI”) 時啟動 CNN 處理; 睡眠,等待 CNN 完成 // 現在信號 Arm 喚醒
MXC_SEMA->irq0 = MXC_F_SEMA_IRQ0_EN |MXC_F_SEMA_IRQ0_CM4_IRQ;
} int cnn_enable(uint32_t clock_source, uint32_t clock_divider)
{ // 重置所有域,恢復 CNN 的電源 MXC_BBFC->reg3 = 0xf; // 重置 MXC_BBFC->reg1 = 0xf; // 屏蔽內存
MXC_BBFC->reg0 = 0xf; // Power
MXC_BBFC->reg2 = 0x0; // iso

MXC_BBFC->reg3 = 0x0; /
/ 重置
MXC_GCR->pclkdiv = (MXC_GCR->pclkdiv & ~(MXC_F_GCR_PCLKDIV_CNNCLKDIV |MXC_F_GCR_PCLKDIV_CNNCLKSEL))
|clock_divider |clock_source;
啟用 CNN 時鐘MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CNN);
在 CNN
上啟用中斷和喚醒完成 __enable_irq();
NVIC_EnableIRQ(CNN_IRQn);
NVIC_EnableEVENT(CNN_IRQn);
返回CNN_OK;
}

不同模式下的功耗

在開發應用時,用戶可以將MAX78000切換到不同的工作模式,并相應地安排任務以節省功耗。了解每種操作模式下的功耗以及啟動或喚醒所需的時間,有助于用戶選擇合適的模式并規劃任務的占空比。電源監視器可在系統電源模式 [4] 下使用,以測量幾種情況下的功耗和喚醒或啟動時間。在此測試中,RISC-V和外圍設備關閉,Arm在不同的操作模式下進行測試。對于喚醒時間測試,RISC-V用作Arm的喚醒源。 圖3顯示了該實驗的結果。使用ISO振蕩器在60MHz下測量活動功率和睡眠功率。其他低功耗模式在休眠期間采用 ERTCO (32kHz)(API 默認值)。

還測試了不同時鐘頻率的啟動時間(定義為從上電到開始執行主代碼的時間)和喚醒時間,如圖4所示。喚醒時間隨所選時鐘頻率進行縮放。啟動時間以上電默認時鐘(ISO 在 60MHz)測量。

pYYBAGPu8n6AdUiDAAAsFeS5Ckg180.jpg?imgver=1

圖3.不同運行模式下的功耗。

poYBAGPu8oCAKeUpAABFMAtt0n0686.jpg?imgver=1

圖4.不同頻率的啟動和喚醒時間。

美國有線電視新聞網電源

人工智能應用程序的核心是由CNN加速器執行的推理。根據應用程序的不同,推理可以連續地對傳入的數據進行,也可以按特定的時間間隔定期進行。CNN推理可以在輸入數據準備就緒后開始(例如KWS案例研究),也可以在FIFO模式下(例如FaceID示例)開始,一旦FIFO中存儲了足夠的數據來開始該過程,它就會開始。CNN 功耗分三個階段測量:

加載權重(內核):在活動模式下將權重加載到 CNN 內存中發生一次

加載輸入數據:每次有新的推理時。在FIFO模式下,它可以與推理重疊

推理:對輸入數據進行操作并生成分類結果

功率監視器使用 GPIO 信號觸發每個事件,并在 CNN 功率模式下測量每個相位的功率 [4]。為了進行測量,在Maxim SDK中選擇了兩個示例:KWS20和FaceID。每個示例都經過訓練[7]、合成[8],并閃存到MAX78000評估板中。可以指示合成腳本僅為 Arm(默認:RISC-V 關閉)或 RISC-V(帶有 --deepsleep --riscv --riscv-debug 標志)生成代碼,其中 Arm 初始化 RISC-V 并進入睡眠狀態。合成腳本還可以包括 GPIO 信號,以指示電源監視器在 CNN 電源模式 (--energy) 下運行。能量、時間、非活動 (I) 和活動 (A) 功率測量值顯示在功率監視器顯示屏上。KWS20和FaceID在不同操作模式和時鐘源(100MHz時的IPO和60MHz的ISO)下的測試結果如表4和表5所示。請注意,FIFO用于FaceID,因此推理時間也包括加載時間。根據結果,當CNN使用相同的時鐘時,僅使用ARM以及ARM和RISC-V的推理時間和能量是相似的。使用較慢的時鐘源加載權重和數據需要更長的時間,從而導致能量顯著增加。用戶應考慮加載內核和輸入所需的能量,以決定如何調度應用程序。在活動周期較小時的情況下,重新加載重量可能會改善整體功耗。在睡眠模式或LPM中,推理時間和能量預計不會改善,因為它們僅在CNN的活動窗口內測量。但是,它們會顯著影響應用程序的總體功耗,如下文所示。

選擇ARM和RISC-V在空閑時間都處于睡眠狀態的案例,通過應用不同的時鐘頻率和源來測試振蕩器頻率的影響。RISC-V驅動加載權重和輸入,以及管理CNN。通過降低時鐘頻率,推理時間和能量呈指數級增長。這表明以最高速度執行加載和推理,然后進入更長的睡眠期往往會改善整體能耗。該實驗的結果如圖5和圖6所示。

KWS20:
操作
模式
時鐘頻率(兆赫) 內核加載 輸入加載 推理
Arm RISC-V CNN E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) A(毫瓦)
Arm Only 始終處于活動狀態 100 不適用 50 0.146 11.6 7.2 19.8 0.013 1.1 7.2 19.27 0.14 2 37.45
SLEEP 100 不適用 50 0.148 11.6 7.02 19.8 0.013 1.1 7.02 19.33 0.136 2 35.82
LPM 60 不適用 30 0.154 19.3 5.33 13.29 0.014 1.8 5.33 13.06 0.139 4.1 18.32
Arm 和 RISC-V 始終處于活動狀態 100 50 50 0.42854 34.72 5.47 17.81 0.04001 3.31 10.45 22.52 0.1401 1.99 21.86
Only Arm SLEEP 100 50 50 0.04036 3.31 5.5 17.71 0.14077 2.01 21.89
Both SLEEP 100 50 50 0.03829 3.15 5.47 17.63 0.14055 2.19 21.41
Both SLEEP 60 30 30 0.487 50.3 3.48 13.16 0.0481 5.53 3.63 12.31 0.14595 3.38 13.06
LPM 60 30 30 0.0456 4.7 3.48 12.92 0.1424 3.5 13.67
面容ID:
操作
模式
時鐘頻率(兆赫) 內核加載 輸入加載 先進先出加載
+ 推理
Arm RISC-V CNN E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) A(毫瓦)
Arm Only 始終處于活動狀態 100 不適用 50 0.158 12.2 7.03 20.01 0.132 12.1 7.03 17.91 0.435 14 38.19
SLEEP 100 不適用 50 0.156 12.2 7.22 20.01 0.13 12.1 7.22 17.93 0.43 14 38
LPM 60 不適用 30 0.188 20.3 4.6 13.5 0.162 20 4.6 12.61 0.472 24 24.1
Arm 和 RISCV 始終處于活動狀態 100 50 50 0.26 36 3.52 10.64 0.30203 24.82 14.54 26.72 0.57958 24.37 38.39
Only Arm SLEEP 100 50 50 0.29813 24.32 5.46 17.47 0.57823 24.87 29.3
Both SLEEP 100 50 50 0.29899 24.82 5.48 17.53 0.57921 24.37 29.18
Both SLEEP 60 30 30 0.53 52 3.45 13.48 0.36954 41.47 3.57 12.49 0.65009 40.72 19.52
LPM 60 30 30 0.328 36.5 3.45 12.45 0.608 36.1 20.36
LPM, Fast FIFO 60 30 30 不適用 不適用 不適用 不適用 0.524 25.2 24.29
LPM 60 60 60 不適用 不適用 不適用 不適用 0.254 18.2 6.02 19.19 0.533 18 35.58
Both SLEEP 60 60 60 不適用 不適用 不適用 不適用 不適用 不適用 不適用 不適用 0.471 12.6 43.57

pYYBAGPu8oOAWmJuAAIH-CW_DYs377.png?imgver=1

圖5.時鐘頻率對KWS20、Arm in SLEEP和RISC-V的影響驅動CNN并在空閑時間休眠。

pYYBAGPu8oWAKlvzAAE3ugxc5as815.png?imgver=1

圖6.時鐘頻率對FaceID的影響;手臂處于睡眠狀態;RISC-V驅動CNN并在空閑時間休眠。

在 CNN 內存中保留權重

四個 CNN 掩碼 RAM(CNN 權重存儲)中的每一個都可以配置為在 UPM、備份或待機的情況下保留權重。另一方面,無論 CNN 掩碼 RAM 保留設置如何,CNN 配置寄存器在任何這些省電模式下(SLEEP 和 LPM 除外)都會丟失,并且需要重新加載。

對于某些低占空比應用,用戶可以選擇關閉掩碼RAM,以進一步降低睡眠期間的功耗。在這種情況下,應考慮用于反復重新加載砝碼的額外功率的影響。表 6 顯示了在 UPM 期間,當 FaceID 示例保留 CNN 權重時,功耗從 0.17mW 增加到 0.38mW。在這種情況下,CNN 配置重新加載只需幾分之一毫秒。但是,如果 CNN 掩碼 RAM 關閉,則權重和配置的總重新加載時間大于 12 毫秒。用戶可以研究這種權衡,以優化其應用程序的計劃和操作模式。以下示例演示如何打開/關閉體重保留以及如何在喚醒后重新初始化 CNN。


Example: Turn on weight retention 
 MXC_BBFC->reg3 = 0xf; // Reset on
 MXC_BBFC->reg1 = 0x0; // turn off CNN RAM0-3 power
 MXC_BBFC->reg3 = 0x0; // Reset off
Example: Loading weights and configuring CNN with CNN Mask RAMs retention

 // wake up from UPM, BACKUP, or STANDBY – CNN memory was retained
 cnn_init(); // Bring state machine into consistent state
 cnn_load_bias();
 cnn_configure(); // Configure state machine
 …
 // proceed to loading data  
Example: Turn off weight retention prior to sleep (must turn back on after waking up)
 MXC_BBFC->reg3 = 0xf; // Reset on
 MXC_BBFC->reg1 = 0x0; // turn off CNN RAM0-3 power
 MXC_BBFC->reg3 = 0x0; // Reset off
  
 /* get ready to go to sleep */
 MXC_LP_EnterDeepSleepMode(); // Arm enters LPM, waits for wakup

 /* restore power to CNN RAM0-3 after wakeup, or prior to next cnn_load() */
 MXC_BBFC->reg3 = 0xf; // Reset
 MXC_BBFC->reg1 = 0xf; // turn on CNN RAM0-3 power
 MXC_BBFC->reg3 = 0x0; // Reset
Example: Loading weights and configuring CNN without CNN Mask RAMs retention

 // Power up or wake up from UPM, BACKUP or STANDBY, CNN memory not retained
 cnn_init(); // Bring state machine into consistent state
 cnn_load_weights(); // Load kernels
 cnn_load_bias();
 cnn_configure(); // Configure state machine
 …
 // proceed to loading data  

UPM 從 UPM 喚醒后加載權重/CNN 配置
CNN Weight Retention P(毫瓦) E(μJ) T(毫秒) P(毫瓦)
Off 172 242.38 12.16 19.93
On 0.387 1.956 0.1089 17.95

應用功率

開發應用時,選擇每個內核的工作模式、時鐘頻率和占空比非常重要。通常,在 Arm 上運行的應用程序可以以更高的頻率(100MHz 而不是 50MHz APB 時鐘)執行,并具有更優化的代碼,這可能導致更低的總能耗。如果存在可以同時分配給 Arm 和 RISC-V 內核的并行任務,則為每個內核使用正確的操作模式非常重要。在 SLEEP 和 LPM 中,內核可以獨立運行或休眠。但是,在其他節能模式(如 UPM 或待機)中,兩個內核同時斷電。在這種情況下,Arm 和 RISC-V 可能需要協調,以便它們都使用多處理器通信進入低功耗模式,如 [8] 的第 2.5 節所述。

對于需要偶爾較短活動時間的應用程序,可以選擇 UPM、待機、備份或關機模式。用戶可以評估在睡眠期間在CNN內存中維持權重的能量成本,并與在每個活動窗口之前重新加載權重的能量進行比較。MAX78000評估板上的功率監測電路可用于測量一段時間內的整體系統功耗[4]。這有助于用戶根據需要在運行時分析應用程序電源。

案例研究 1:在 Arm 和 CNN 上進行關鍵字發現 (KWS20) 演示

本示例應用演示了使用MAX20評估板[78000]識別一組9個關鍵字。應用程序讀取 I2S麥克風以16kHz采樣,并監視128個采樣窗口的閾值。一旦超過靜默閾值,應用程序就會捕獲一秒鐘的樣本,對樣本運行 CNN 推理,并在 TFT 顯示屏上顯示分類結果。

在此基準測試示例中,不使用RISC-V,Arm內核處理整個任務。測試了幾種操作模式。系統電源模式下的功率監視器用于以十秒間隔測量總能量,無論是在完全靜音(即無推理或 TFT 更新)時,還是當關鍵字以每秒一個單詞的速度說出時(十個推理和 TFT 更新)。結果如表7所示。在活動模式下,Arm 內核始終運行。無論靜默還是檢測,此模式下的功率約為20mW,因為推理能量只是總功耗的一小部分。通過在收集 I 的空閑時間內使用 LPM2S采樣以及推理時間,通過在推理后關閉CNN時鐘(功耗大幅降低),功耗降至8.3mW(靜默期間為6.58mW)。

poYBAGPu8oeANoq3AAERLRpFnkE919.png?imgver=1

圖7.KWS20的占空比和平均功率示例在靜音或關鍵字檢測期間,TFT可以打開或關閉。

圖7分析并演示了表7中最后兩種功耗優化工作模式的平均功耗和活動占空比。

案例研究 2-A:Arm 和 CNN 上的 FaceID 演示

該演示應用演示了在MAX78000上使用面部識別識別對象。FaceID CNN模型從評估板相機拍攝的實時圖像中生成尺寸為512的嵌入。計算嵌入與已知主題嵌入的距離,如果大于閾值,則選擇最佳候選者。已知嵌入的數據庫是從主題的圖片創建的,并與固件集成。推理在每個圖像的 160x120 面框上執行。為了增強識別性能,推理在幀上執行三次,每次在圖片上稍微移動面部框時執行。

在本案例研究中,RISC-V處于關閉狀態,整個任務由Arm驅動并按順序執行。Arm 在推理期間進入睡眠模式,并在幀之間進入 UPM 或待機模式約半秒。表 8 總結了 FaceID 主要功能的執行時間和功能。表 9 顯示了每種操作模式下的時間和功耗。

處理一幀 平均能源
系統時鐘 CNN Clock Arm duty cycle E(μJ ) T(毫秒) P(毫瓦)
ARM-100兆赫 50兆赫 圖像捕獲 1189.8 171.2 6.95
CNN 內核負載(用于備用或 UPM) 935.3 37.5 24.94
3 x CNN 運行 1164.7 42 27.73
3 x CNN 卸載 1.6 0.15 10.7
3x 距離計算 470.4 48 9.8
在 TFT 上顯示圖像 620.5 49.4 12.56
4382.2 348.25
模式 Active UPM Sleep Total
時間(毫秒) 227 498 160 885
功率(毫瓦) 18.14 0.3 6.92
能量(微焦) 4118 150 1112 5380
模式 積極 待機
時間(毫秒) 227 497 160 884
功率(毫瓦) 18.14 0.03 6.92
能量(微焦) 4118 15 1112 5245

poYBAGPu8omAHf0nAAFoA1LkgjI091.png?imgver=1

圖 8:在 Arm 上運行的 FaceID 示例的占空比和平均功率。

案例研究2-B:Arm,RISC-V和CNN上的FaceID演示

在這種情況下,Arm處理TFT控制和顯示(只能通過MAX78000評估板上的Arm訪問),RISC-V驅動從相機捕獲的圖像、CNN加載和推理,以及針對數據庫的嵌入距離計算。共享內存和郵箱用于協調 Arm 和 RISC-V 通信。

表 10 總結了此模式下 FaceID 主要功能期間的執行時間和功耗。處理完幀后,Arm 和 RISC-V 會像前一種情況一樣進入待機模式大約半秒鐘。

Processing One Frame 平均能源
系統時鐘 美國有線電視新聞網時鐘 RISC-Arm E(μJ) T(毫秒) P(毫瓦)
ARM-100MHz RISCV-60MHz 50兆赫 圖像捕獲 1392.6 169 8.24
CNN 內核加載 818.3 35.5 23.05
3 x CNN 運行 7910.1 327 24.19
3 x CNN 卸載 9.5 0.9 10.5
3x 距離計算 699.6 66 10.6
在TFT上顯示圖像(在手臂上與RISC-V處理并行顯示圖像) 60 12.48
10830 658.9
模式 Active Standby Sleep Total
時間(毫秒) 448 500 169 1117
功率(毫瓦) 18.14 0.05 7.89
能量(微焦) 8126.72 25 1333.41 9485.13

pYYBAGPu8ouAcymuAADnn8gzwzs862.png?imgver=1

圖9.在 Arm 和 RISC-V 上運行的 FaceID 示例的占空比和平均功率。

pYYBAGPu8o6AE1aNAABH17Pom1I678.png?imgver=1

圖 10.比較在實現FaceID時使用Arm,或同時使用Arm和RISC-V。

通過比較圖 10 中 FaceID 的兩種實現,很明顯,使用 Arm 處理幀的總能量顯著降低,這主要是由于其速度更高,而不是 RISC-V(100MHz,vs 50MHz),導致活動狀態的持續時間更短。

總結

本應用筆記概述了MAX78000支持的功耗優化技術,以及與關鍵字識別和FaceID應用配合使用時的結果。以下摘要重點介紹了一些改善功耗的一般建議:

通常越快越好。通常,使用更高的時鐘速率可以加快執行速度,并減少恒定靜態功耗的影響,從而改善整體功耗。

如果沒有太多并行任務要執行,則首選單核。在RISC-V上運行任務由于其時鐘速率而較慢,并且與Arm相比,往往會導致能源使用量增加。

在沒有活動時利用 UPM、備份和備用。當 Arm 在某些外圍設備運行時可以休眠時,請考慮使用 LPM。

加載內核(權重)一次并保留在內存中,以避免在 UPM、備份和待機模式下重新加載能量。但是,如果活動占空比非常低,請考慮禁用砝碼保持或使用 POWERDOWN 模式并在每個周期中重新加載砝碼。

確保在 CNN 處理完成后關閉 CNN 時鐘,并在下一個活動期間再次訪問 CNN 之前將其打開。

當 CNN 正在運行并且 Arm 正在等待推理完成時,請使用 LPM。要喚醒,請使用RISC-V或喚醒定時器。CNN 中斷無法在 LPM 中直接喚醒 Arm。

使用快速FIFO或四快速FIFO(僅在RISC-V驅動CNN時才支持)顯著改善了輸入加載時間和推理能量(--fast-fifo,--fast-fifo-quad)[8]。

審核編輯:郭婷


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7649

    瀏覽量

    152109
  • 加速器
    +關注

    關注

    2

    文章

    807

    瀏覽量

    38087
  • 電池
    +關注

    關注

    84

    文章

    10675

    瀏覽量

    131316
收藏 人收藏

    評論

    相關推薦

    基于MAX78000FTHR的機器學習實時處理方案

    MAX78000本質是一個ARM Cortex-M4F微控制器,周邊有很多硬件,其中包括Maxim設計的神經網絡(CNN)加速器(圖1)。這種機器學習(ML)支持使芯片能夠實時處理諸如識別
    的頭像 發表于 01-16 11:22 ?4475次閱讀
    基于<b class='flag-5'>MAX78000</b>FTHR的機器學習實時處理方案

    Maxim將AI推向邊緣 MAX78000功耗神經網絡加速微控制器

    特性,那就意味著即使將其應用在電池供電的物聯網(IoT)設備里,芯片性能并未受到影響。 如上圖所示,新芯片MAX78000包括兩個超低功耗內核Arm Cortex-M4內核和RISC-V內核一個基于FPU的微控制器和一個卷積神
    發表于 10-10 10:27 ?1387次閱讀

    MAX78000將能耗和延遲降低100倍,從而在IoT邊緣實現復雜的嵌入式決策

    通過集成專用的神經網絡加速器,MAX78000克服了這些局限性,憑借本地以低功耗實時執行AI處理,使機器能夠看到和聽到復雜的型態。由于MAX78000執行推理的
    的頭像 發表于 11-04 09:54 ?1866次閱讀

    Maxim Integrated新型神經網絡加速器MAX78000 SoC貿澤開售

    MAX78000處理器提供高效的電源管理,最大限度地延長電池供電的物聯網 (IoT) 設備的續航時間。
    的頭像 發表于 12-09 16:53 ?2855次閱讀

    美信半導體新型神經網絡加速器MAX78000 SoC

    ? ? 新型神經網絡加速器 Maxim Integrated的新型MAX78000芯片,基于雙核MCU,結合了超低功耗深度神經網絡加速器,為高性能人工智能 (AI) 應用提供所需的算力,是機器視覺
    的頭像 發表于 01-04 11:48 ?3056次閱讀

    MAX78000 開發功耗優化應用

    發表于 11-16 21:01 ?0次下載
    <b class='flag-5'>在</b> <b class='flag-5'>MAX78000</b> <b class='flag-5'>上</b><b class='flag-5'>開發</b><b class='flag-5'>功耗</b><b class='flag-5'>優化</b>應用

    使用MAX78000進行人臉識別

    本應用筆記演示了MAX78000中實現人臉識別模型,以及如何在超低功耗MAX78000平臺上部署,用于資源受限的邊緣或物聯網應用。該應用遵循基于知識蒸餾的模型
    的頭像 發表于 12-16 16:12 ?1940次閱讀
    使用<b class='flag-5'>MAX78000</b>進行人臉識別

    MAX78002開發功耗優化應用

    功耗是邊緣人工智能 (AI) 應用的關鍵因素,其中整個系統由小型電池供電,預計無需充電或更換電池即可運行數月。MAX78002超低功耗AI微控制器專為物聯網邊緣的此類應用而設計。本文介紹了各種選項,使用戶能夠
    的頭像 發表于 02-17 11:31 ?1441次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>MAX</b>78002<b class='flag-5'>上</b><b class='flag-5'>開發</b><b class='flag-5'>功耗</b><b class='flag-5'>優化</b>應用

    用于MAX78000模型訓練的數據加載器設計

    應用程序開發周期中,第一步是準備和預處理可用數據以創建訓練和驗證/測試數據集。除了通常的數據預處理外,MAX78000運行模型還需要考
    的頭像 發表于 02-21 12:11 ?1435次閱讀

    厲害了,這3個項目獲得了MAX78000設計大賽一等獎!

    AX78000FTHR開發板。 AI微控制器 MAX78000 MAX78000是一款先進的片系統,集成帶FPU CPU的Arm ? C
    的頭像 發表于 03-10 19:45 ?899次閱讀

    MAX78000開發功耗優化應用

    MAX78000為超低功耗微控制器,具有專用卷積神經網絡(CNN)加速器。這種架構能夠能源受限的環境中開發非常節能的 AI 應用程序。MAX780
    的頭像 發表于 06-16 11:41 ?804次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>MAX78000</b><b class='flag-5'>上</b><b class='flag-5'>開發</b><b class='flag-5'>功耗</b><b class='flag-5'>優化</b>應用

    MAX78000人工智能設計大賽第二季回歸!賽題廣任意玩,獎勵足直接沖!

    MAX78000設計大賽(第2季) MAX78000設計大賽(第2季)于9月1日正式上線,完成項目不止全額返還,還有千元現金大獎等你來領,摩拳擦掌的伙伴們沖沖沖!!!萬分期待朋友們的精彩項目! 大賽
    的頭像 發表于 09-13 18:40 ?594次閱讀
    <b class='flag-5'>MAX78000</b>人工智能設計大賽第二季回歸!賽題廣任意玩,獎勵足直接沖!

    MAX78000: Artificial Intelligence Microcontroller with Ultra-Low-Power Convolutional Neural Network Accelerator Data Sheet MAX78000: Artific

    電子發燒友網為你提供ADI(ADI)MAX78000: Artificial Intelligence Microcontroller with Ultra-Low-Power
    發表于 10-17 18:53
    <b class='flag-5'>MAX78000</b>: Artificial Intelligence Microcontroller with Ultra-Low-Power Convolutional Neural Network Accelerator Data Sheet <b class='flag-5'>MAX78000</b>: Artific

    MAX78000進串口通信的驗證和調試

    該資源提供了一個完整的工程,可在MAX78000開發板上進行UART2阻塞式發送字符串的測試。以下是相關的引腳配置信息:UART2引腳配置:UART2的發送引腳為P1.1?(TXD2)。UART2
    發表于 02-18 09:43 ?0次下載

    SEGGER為ADI超低功耗微控制器提供SystemView軟件分析工具

    2024年11月,SEGGER宣布ADI公司為選擇其超低功耗(ULP)微控制器的用戶免費提供SystemView軟件分析工具,從而實現強大的開箱即用的開發體驗,可用的處理器包括MAX78000
    的頭像 發表于 11-09 17:32 ?729次閱讀
    主站蜘蛛池模板: 亚洲高清视频一区 | 黑人40厘米全进去xxxx猛交 | 激情六月丁香婷婷 | 奇米在线 | 免费视频网站在线看视频 | 欧美一级在线观看 | 天天干狠狠干 | 欧美不卡视频在线 | 日本污全彩肉肉无遮挡彩色 | 轻点灬大ji巴太粗太长了啊h | 色婷婷视频在线观看 | 亚洲黄色小说网站 | 涩涩97在线观看视频 | 男人午夜小视频 | 国产三级在线 | 国产精品 视频一区 二区三区 | 末发育娇小性色xxxxx视频 | 小说区v天堂网 | 黄a大片| 五月婷婷在线观看视频 | 你懂的网址在线观看 | 超黄视频在线观看 | 人人操天天射 | 色播基地 | 高颜值美女啪啪 | 可以免费看黄色的网站 | 黄色污网站在线观看 | 人人澡人人人人夜夜爽 | 国产在线观看福利 | 国产高清小视频 | 18年大片免费在线观看 | 中文字幕在线一区 | 国产小视频在线观看免费 | 国产欧美亚洲精品 | 丁香综合网 | 我把美女日出白浆 | 成人深夜视频 | 一区二区三区四区五区 | 精品视频69v精品视频 | 欧美一区二区三区在线观看 | 黄色视屏在线免费观看 |