第一部分 設計概述?
1.1設計目的
隨著車輛的普及,出行安全已經成為人們熱切關注的話題,每年因為不當的駕駛行為而造成的交通事故日益增加,在科學技術迅速發展的大環境下,科學保障人們的生命安全已經成為必不可少的社會要點。據統計,2001年中國交通事故死亡人數為10萬人,而同年美國的數字為4萬人,日本為1萬人。據全球各交通和警察部門的統計,2003年全世界交通事故死亡人數為50萬人。其中,中國交通事故死亡人數為10.4萬。我國交通事故的致死率也是世界最高的,為27.3%,因疲勞駕駛而造成的交通事故占總數的20%左右,重特大傷亡事故中約40%是由于疲勞駕駛造成的,高速路上20%的事故都是因為疲勞駕駛。據公安部交管局統計數據顯示深夜、凌晨或午后為“疲勞駕駛”事故高發期。 基于當前的這些數據以及現狀,在疲勞駕駛的問題中,我們應該盡量減少事故的發生概率,即在駕駛過程使駕駛人保持清醒,若遇到駕駛人疲勞時,我們需要采取一些方法來使駕駛人清醒或者提醒停車休息即“疲勞駕駛檢測功能”同時輔助多樣化全面的人性化行車輔助功能,以此高度保障人身安全,使行車更安全和智能,為駕駛者以及乘客提供一個更科學、可靠、便捷的輔助平臺。
? 1.2應用領域
本作品所設計的智能行車輔助系統通過核心算法功能“疲勞駕駛檢測”,通過對駕駛員眨眼、打哈欠等行為的分析,實時檢測疲憊狀況并及語音提示駕駛員保持清醒,多種輔助系統可使行車更便捷應用于私家、貨車、大巴等多種輛以及經常需要夜間長途出行的特定群體。行車輔助系統不僅具有疲勞駕駛檢測功能,同時還配備智的行車輔助系統的功能,如語音播報、超聲波測距倒車影像座椅按摩等多種便捷的且貼心功能,語音播報、超聲波測距倒車影像座椅按摩等多種便捷的且可以通過語音控制可達到真正解放雙手的目,使駕駛更專心、方便。 ?
1.3適用范圍 本行車輔助系統不僅可用于個人的安全,也應用于車輛管理公司,如出租車、貨運輸等需要集體配備行車輔助系統的團體,更智能 、安全便捷的行車輔助效果會更加明顯。 ?
第二部分 系統組成及功能說明
2.1系統介紹
本作品的核心系統疲勞駕駛檢測搭載于 XILINX Zynq-7000 系列 PYNQ-Z2 開發板,開發板如圖 2.1 所示,其主芯片為 XC7Z020CLG400-1,該芯片為 FPGA+ARM 架構并且可用于 python 開發,同時提供了豐富的 python API 和完 善的硬件設計流程,為較復雜算法的編寫及應用提供了新思路。同時使用 Artix-7 核心板為輔助功能模塊顯示控制中心,如圖 2.2 所示。系統主要包含:疲勞駕駛檢測、倒車輔助、語音控制平臺、安全車距檢 測等部分組成,總體流程圖如 2.3 所示。系統可實現開機自啟,并實時檢測 駕駛者的疲憊情況,輔助功能模塊由語音控制功能協調控制,實現解放雙手 安心駕駛的目的,同時語音播報提醒駕駛員疲憊狀況以及車輛周圍障礙物情 況并及時反饋給駕駛者,達到預防交通事故發生的目的。
? 2.2 各模塊介紹
2.2.1.疲勞駕駛檢測系統
(一)系統總體方案設計 考慮到疲勞狀態圖像處理的實時性和疲勞狀態檢測的準確性。采用 PYNQ 開發板作為系統的嵌入式控制單元,用于運行圖像采集和圖像處理的程序,以及控制各個預警模塊;使用 usb 攝像頭 實時采集機動車駕駛員的人臉和眼部圖像視頻流。該視頻流的每一幀圖像作 為駕駛員疲勞狀態監測的源數據; 采用 OpenCV 計算機視覺庫、Dlib 機器 學習庫和 Python 開發語言對駕駛員的人臉圖像進行處理,通過計算 EAR 參 數來實時檢測眼部張合度,判斷駕駛員的疲勞狀態。當檢測到駕駛員處于疲 勞駕駛的狀態時,通過語音預警及座椅震動按摩的方式提醒駕駛員注意安全行車。
? (二)系統軟硬件平臺
(1)嵌式控制單元 考慮到圖像采集和圖像處理算法的復雜性,以及疲勞駕駛檢測的應用場 景對體積、安裝與成本的要求,采用 PYNQ 開發板作為控制單元,PYNQ-Z2 開 發板支持 PYNQ 項目,這是一個新的開源框架,使嵌入式編程人員能夠在無 需設計可編程邏輯電路的情況下即可充分發揮 Xilinx Zynq All Programmable SoC(APSoC) 的功能。與常規方式不同的是,通過 PYNQ,用戶可以使用 Python 進行APSoC 編程,并且代碼可直接在 PYNQ-Z2 上進 行開發和測試。通過 PYNQ,可編程邏輯電路將作為硬件庫導入并通過其 API 進行編程,其方式與導入和編程軟件庫基本相同。 PYNQ-Z2 開發板是 PYNQ 開源框架的硬件平臺。在 ARM A9 CPU 上運行的 軟件包括: ? 載有 Jupyter Notebooks 設計環境的網絡服務器 ? IPython 內核和程序包 ? Linux ? FPGA 的基本硬件庫和 API ?
(2)實時視頻圖像采集單元 圖像的采集使用的是 NUOXI ZL-008 型號USB 攝像頭,該攝像頭支持分辨率640*480,幀率 30 幀/秒,增強像素數1200 萬,可以滿足本文研究中對 圖像的清晰度和實時性的要求。將攝像頭連接到PYNQ 的USB 接口,并將攝像頭放置在車子內部的儀表盤上方。在 PYNQ 上,使用 Python 的 imutils 包采集實時的視頻流,進而獲取視 頻流的每一幀圖像,用于后續的圖像處理。 ?
圖 2 核心板 ? FPGA中實現的SoC框圖如圖3所示: ?
圖3 SoC原理框圖 ? ?
圖 4 SoC的RTL視圖
? 2.2.1.1 PRV332處理器內核
?
圖5 CPU內核 ? 整個SoC的PRV332處理器核心如圖5所示,PRV332SV0處理器內核是一款支持RISCV-32 I和A拓展指令集,完全實現RISCV定 義的所有功能的處理器,不僅具備機器模式(M)模式下運行,還支持虛擬內存MMU 和系統(S)用戶(U)模式,理論上完全具備運行類linux系統的能力。這款處理器內核主要由BIU(總線接口單元),EXU(執行單元),INS-CSR-GPR(指 令-CSR-通用寄存器單元),中斷控制器組成,簡單原理框圖如圖6所示。
圖6 CPU原理框圖 ? 整個CPU以狀態機的方式運行,常規指令需要6T:T0:BIU準備開始下一條指令的地址。T1:BIU(總線接口單元)發出地址和總線控制信號。T2:BIU(總線接口單元)根據總線上的信號(訪問失敗信號、準備好信號)選擇是否存入總線上的數據,若總線訪問失敗,則跳轉到T10,若準備好信號為0,則保持T2狀態,若準備好為高,則寄存總線上的數據并進入下一狀態。T3:BIU發出準備好信號, 同時把指令通過BIU的指令輸出總線輸出給指令解碼單元(INS_DEC)開始指令解碼。T4:EXU開始動作,常規的加減法和邏輯運算將在這個周期內完成,如果是移位指令等則需要多個周期才能完成。T5:寫回階段,CPU內部的寄存器根據指令譯碼器譯碼結果進行寄存,同時PC(程序計數器)值在這個階段被更改,指向下一條要被執行的指令的位置。如果在這個執行階段中斷控制器接受了某個外部中斷,則跳到T10。當處理器遇到內存訪問指令,需要增加額外的四個執行周期 T6-T9。T6:BIU準備開始下一條指令的地址。T7:BIU(總線接口單元)發出地址和總線控制信號。T8:BIU(總線接口單元)根據總線上的信號(訪問失敗信號、準備好信號)選擇是否存入總線上的數據,若總線訪問失敗,則跳轉到T10,若準備好信號為0,則保持T2狀態,若準備好為高,則寄存總線上的數據并進入下一狀態。T9:BIU發出準備好信號, 同時把數據放在內部數據總線上。當處理器遇到中斷或者發生異常,需要增加一個執行周期T10,T10可以插入到以上執行周期的T2或T5或T8之后。在T10里處理器將根據錯誤類型將PC值自動撥到對應的中斷向量上,同時儲存當前發生異常的PC值和異常值到MEPC和MTVAL寄存器里。 *關于RISCV的中斷和異常處理可參考《The RISC-V Instruction Set Manual Volume II : Privileged Architecture》
? 2.2.1.2 BOOTROM(程序只讀儲存器)
?
圖7 BOOT-ROM ? PVS332具有一個片上BOOT-ROM,如圖7,在BOOT-ROM里面預置了開機啟動代碼,系統復位后處理器首先執行該ROM里面的程序,通過修改該BOOT-ROM里面程序的內容可以實現多種功能。 ? 2.2.1.3 OCRAM(片上內存)
圖8 OCRAM ? PVS332具備一個4K字節的片上RAM,如圖8所示,該內存為同步SRAM,可以在2T周期內讀寫數據,工作頻率和CPU同步。具備比較高的讀寫帶寬。可以在系統沒有拓展內存的情況下使用。 ? 2.2.1.4 SPI收發器
??圖9 SPI收發器
PVS332具備一個硬件SPI收發器,如圖9所示,可以使用額外的門電路可以同時管理八個從設備。以下截圖來自于《PVS332處理器編程手冊》,描述的是SPI收發器的地址和操作,分別如圖10、圖11所示。
? 圖10 SPI收發器寄存器
圖11 SPI寄存器定義 ? 2.2.1.5 EXT-SLOT(拓展插槽)
圖12 拓展插槽適配器 ? PVS332通過該適配器,如圖12所示,支持最多8個,每個2MB的多功能拓展插槽,這些插槽都支持等待狀態,同時插槽的地址直接被映射在處理器外部地址里面,程序可以直接訪問到這些插槽上面的設備。拓展槽使用32個雙向IO作為數據總線(SRAM_Data),22條地址總線(SRAM_Add),4條字節選擇線(SRAM_BSEL),外部設備準備好信號線(rdy),讀寫信號線(SRAM_OE,SRAM_WR)和外部片選信號線(SRAM_CS)。外部總線讀寫分四個周期。(a)讀時序當PVS332處理器內置的PRV332SV0處理器訪問的內存屬于外部儲存器時,PVS332自動將內存選擇到外部,進入讀周期。T1:SRAM_CS拉低,SRAM_OE拉低,SRAM_Add送出地址,SRAM_BSEL的某幾個位拉低以指示是哪個字節被讀寫。在下一個時鐘上升沿進入T2狀態T2:保持T1狀態,在下一個時鐘上升沿進入T3狀態。T3:保持T2狀態,當rdy=1時候,在下一個時鐘沿進入T4狀態,否則等待在T3狀態T4:保持T3狀態,在T4周期結束的時候進行數據采樣,同時回到等待狀態TW。(b)寫時序T1:SRAM_CS拉低,SRAM_Add送出地址 ,SRAM_Data送出數據,SRAM_BSEL某幾個位拉低以指示要操作哪個字節,在下一個上升沿進入T2周期。T2:SRAM_WR拉低,其余參數保持和T1一致,在下一個時鐘上升沿進入T3周期。T3:保持T2狀態,等待rdy信號之后在下一個時鐘上升沿進入T4周期T4: SRAM_WR拉高,其余參數保持和T1一致,在下一個時鐘上升沿進入TW。
? 2.2.1.6 GPIO
?
圖13 GPIO ? PVS332處理器支持128個GPIO, 所設計的模塊如圖13所示,在目前系統里面因為FPGA引腳較少,實際只使用了GPIOC的22個GPIO。GPIO有關的控制寄存器如下圖14所示。
圖14 GPIO控制寄存器 ? *以上設備的匯編測試程序可見SIM-TESTCODE文件夾。 *以上設備的寄存器定義可以見附錄中的PVS332編程手冊。 ? 2.2.1.7 UART16550
圖 15 UART16550 如圖15,PVS332支持一個帶FIFO的UART收發器,具備16字節深度的FIFO,最高支持波特 率為9600。UART16550的控制寄存器如圖16所示: ?
圖16 UART16550控制寄存器 *詳情可以參考附錄中的PVS332編程手冊 ?
2.2.1.8 控制寄存器組
圖17 控制寄存器組 ? PVS332 SoC中有一個控制寄存器(圖17 控制寄存器組)控制整個SoC的各項功能。控制寄存器組里面包含了:(1)系統定時器PVS332 SoC支持RISCV架構定義的系統的定時器(MTIME、MTIMECMP)這兩個寄存器在0x0ffc0000-0x0ffc000f的空間里。該定時器在MTIME計時到MTIMECMP之后會產生定時器中斷,只有當程序更新了MTIME或者MTIMECMP寄存器之后中斷才會被清除。(2)軟件中斷控制器軟件中斷控制器可以讓程序使用置1的方式產生同步的軟件中斷。(3)中斷控制器(SIC)SIC可以支持最多256個外部中斷的管理,并可以配置它們的優先級,由這個寄存器管理的中斷源最后都連接在PRV332處理器的ext_int中斷上,觸發中斷之后PRV332的xcause寄存器將會被更新為外部中斷,軟件可以查詢SIC里面的中斷掛起寄存器而找到是哪個外部設備發起了中斷。圖18是SIC的寄存器列表,詳情可見附錄中的《PVS332編程手冊》??
圖18 SIC控制寄存器 *詳情可見附錄中的《PVS332編程手冊》。 ?
2.2.2 系統主板
系統主板分為3大部分,分別為FPGA插座部分、拓展插槽部分、SPI和GPIO和flash部分。 ?
2.2.2.1 FPGA插座部分
圖19 FPGA核心板插座部分 ? 如圖19,在這個部分里的CPU位置,可以插入上述FPGA核心板作為系統主板的CPU,該核心板一共有96個可用IO,我們將IO分配為:拓展卡IO、通用輸入輸出(GPIO)、SPI收發器 三個部分。在旁邊的穩壓器部分,主要為板上的邏輯芯片供電。同時我們搭載了多個指示燈用于指示系統的運行狀態。
? 2.2.2.2 拓展插槽部分
圖20 拓展插槽部分 ? ? 在拓展插槽上圖20所示,我們使用32個IO作為雙向數據總線,22個IO作為地址總線,4個IO作為字節選擇線, 2個IO作為讀寫使能線,1個IO作為準備好信號輸入線。總線工作頻率為8MHz(FPGA工作頻率33MHz時)。最大傳輸速度為32MB/s。為了實現多個外部設備,我們將A19-A21作為一個3-8譯碼器的輸入信號,使用該3-8譯碼器獲得8個譯碼器信號,這樣外部就可以獲得8個插槽的片選信號。其余的A0-A18作為地址線,配合四個字節選擇線可以尋址8 * 512K * 4Byte的空間。 ?
2.2.2.3 SPI、GPIO和flash部分
圖21 SPI、IO和外部FLASH ? SPI部分同樣使用3-8譯碼器作為從設備選擇信號,而后使用一片8-1數據選擇器作為八個SPI從設備的MISO選擇。FLASH部分使用額外的74系列邏輯芯片搭建了復用器,在調試器對系統進行復位時(/RESET為低),此時復用器將FLASH的引腳切換給調試器的MOSI、MISO、SCK、CS使用。當調試器燒錄FLASH完成之后,/RESET被拉高,此時該復用器將FLASH切換給主系統的SPI收發器使用。 ?
2.2.2.4 主板PCB圖
圖 22 主板PCB圖 ?
2.2.2.5 主板實物
PVS332可以搭配配套的PVS332-XC7MB主板,板上引出了七個SPI,16個GPIO和 燒錄器用的插針。同時引出了四個可以直接使用的拓展槽接口和一個需要外接其它拓展電路的接口。主板實物如圖23所示:
圖23 主板實物圖
? 2.2.3 調試器
調試器使用ESP32作為主控,使用ESP32通過藍牙/WIFI等多種方式連接系統主板和電腦端軟件。該調試器可以和電腦端配套軟件聯合使用,執行包括對系統主板進行復位、燒錄外部FLASH、監視系統主板串口并回傳數據等一系列任務。調試器通過自定義排線接口與系統主板相連接,自定義接口的引腳定義如圖24所示:
圖24 調試器電路 ? ?
調試器通過上圖中MISO,MOSI,SCK,/CS來完成對系統主板的復位和調試工作。在/RESET為0時(即系統復位), 調試器作為SPI從機,MOSI,MISO,SCK,CS引腳控制系統主板上的外部FLASH;在/RESET為高(即系統正常工作)時,MOSI,MISO,SCK為SoC的SPI收發器0引腳,此時調試器作為SPI 從機,可以監視串口數據。調試器實物如圖25所示:
圖25 調試實物圖 ?
? 2.2.4內存拓展卡
外置內存拓展卡是兩片IS62WV51216構成的,一共2兆字節。可以插在主板上的拓展插槽內,可以讓系統獲得額外的2MB內存。拓展卡如圖26所示:
圖26 內存拓展卡 ? ?
2.2.5 PC端IDE
軟件部分我們完全自主研發了一個IDE-PRV332IDE,具備編輯RISCV匯編,生成多種機器碼文件的能力,可以極大的方便程序驗證和調試工作。IDE界面如圖27所示:
圖27 IDE界面 ?
2.2.5.1 IDE各項功能介紹
圖28 IDE功能 如圖28所示,IDE功能從上到下依次為:復制文件、剪切文件、新建文件、生成二進制文件、生成Hex文件、生成coe文件、縮進、換行。其中生成二進制文件可以讓匯編代碼直接被仿真器仿真;生成的Hex文件可以直接燒錄到flash里面,配合SoC內部的BOOTLOADER程序使用;生成的coe文件可以作為xilinx FPGA的ROM里面的內容。 ?
2.2.5.2 IDE實現技術特點 Prv332ide使用pyqt編寫圖形界面同時重構了原有的riscv匯編工具鏈,是一個總代碼約2000行的輕量級prv332定制的可以直接燒錄的ide.匯編工具鏈上拋棄傳統的兩遍掃描算法使用高效的一遍掃描算法,同時利用散列算法進行加速使得匯編翻譯和地址分配速度非常快。不僅在速度上進行了優化,同時利用python面向對象的優點預留多個接口,配合圖
形界面可以直接生成用于仿真的二進制文件(直接用于modelsim仿真),coe文件(用于直接燒錄xilinx的BROM),hex文件(用于直接燒錄到soc的片外flash)。大大方便了驗證和調試工作。圖形界面使用pyqt開發,除了匯編工具鏈生成的之外還可以利用socket直連jttag接收soc傳來的數據以及燒錄工作。 ? 第三部分 完成情況及性能參數 3.1綜合完成FPGA邏輯資源占用
圖29 FPGA布線占用 ? ?
圖30 FPGA資源占用 ? 圖29和圖30可看到,綜合布線完成后共占用邏輯單元3628個,一共使用總邏輯單元數量的45.35%。片內RAM共使用8KB,占用總片內RAM資源的80%。在總的資源占用上較為良好的達到了對輕量的需求。
? 3.2 在MODELSIM里面進行匯編代碼仿真(以SPI收發器為例)
首先我們在配套的匯編軟件中寫SPI收發器的匯編代碼,圖31所示:
圖31 SPI收發器驅動
此程序寫了一個使用SPI收發器完成發送一系列字符串的程序的程序。程序流程如下:設置SPI收發器的基地址、設置要發送的數據、使能SPI收發器、檢查SPI收發器的TXOK位,若為1則繼續發送下一個字節的數據。其次我們使用PRV332IDE生成給modelsim仿真使用的二進制文件,如圖32所示:?
圖32 生成的二進制文件 ? 然后我們打開modelsim,直接開始仿真,可以看到SoC的SPI有關引腳上出現了我們希望看到的數據,如圖33所示。?
圖33 仿真波形
? 3.3 PVS332實機啟動演示
首先我們將上述仿真過的匯編代碼使用PRV332IDE生成COE文件,如圖34所示;接著我們將該COE文件作為PVS332系統里面BOOTROM的內容燒錄到FPGA里面。為了更好的觀察SPI收發器的工作情況,我們搭建如圖35所示的測試電路。在該測試電路里,系統主板的調試接口和調試器通過排線連接在一起,由于系統主板的SPI收發器0和調試器有硬件連接,調試器監視SPI0收發器的數據,故我們用示波器觀察系統主板上SPI0的SCK和MOSI線上的數據。
圖34 COE文件 ?
圖35測試電路 ? 系統啟動之后可以看到從BOOTROM啟動的SPI程序發出的信息,如圖36所示:
圖36 啟動信息 ? 同時在示波器上也可以看到SPI收發器正常工作,圖37所示:
圖37 示波器觀察到的波形 ?
第四部分 總結 4.1主要創新點
(1)本系統完全自主研發了一個簡單的SoC,主CPU同樣為自主研發,拋棄了MCS51,X86等落后的指令集,采用了新型的RISCV指令集, (2)本系統同時完全自主研發了一個匯編語言IDE,在保證簡單易用的前提下,實現了生成多種文件的功能,極大的方便了調試。 (3)本系統的SoC不僅可以在仿真軟件上運行,我們還制作了相應的系統主板,突破了目前國內同類教學用RISCV系統只有仿真文件的問題。
? 4.2可擴展之處 (1)目前只支持少量的通信設備(八個SPI一個UART),以及非常少的拓展卡設備可以用(只有一個2MB拓展內存卡,最多只能拓展16MB的外部儲存空間)。 (2)目前的匯編器只支持匯編語言開發,以后可以移植GCC編譯器讓該系統可以用于C語言編程下的微機教學。 (3)目前本系統暫時不支持JTAG等調試機制,以后有望移植JTAG讓調試更加簡單。? ?
第五部分 參考文獻
[1]水頭一壽,CPU自制入門[M].北京:人民郵電出版社,2014
[2]胡振波,手把手教你設計CPU-RISC-V處理器[M].武漢:人民郵電出版社,2018
[3]胡振波,RISC-V架構與嵌入式開發快速入門[M].武漢:人民郵電出版社,2018
[4]夏宇聞,Verilog數字系統設計教程(第四版)[M].北京:北京航空航天大學出版社,2017
[5]Andrew Waterman, Krste Asanovic, SiFive Inc.The RISC-V Instruction Set Manual Volume II :Privileged Architecture[Z].Califorina:University of California, Berkeley,July 27,2019.
[6]Andrew Waterman, Krste Asanovic, SiFive Inc.The RISC-V Instruction Set Manual Volume I :Unprivileged Architecture[Z].Califorina:University of California, Berkeley,July 27,2019.
審核編輯:黃飛
?
評論
查看更多