呂達(dá) 張加宏 李敏 冒曉莉 楊天民 謝麗君
關(guān)鍵詞: FIFO; 有限狀態(tài)機(jī); Verilog HDL; ModelSim; FPGA; 存儲控制器; 輪詢時(shí)間; 資源利用率
中圖分類號: TN830.3; TP302; TP332 ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識碼: A ? ? ? ? ? ? ?文章編號: 1004?373X(2019)04?0001?04
Design and implementation of multi?channel FIFO memory controller based on FPGA
L? Da1, ZHANG Jiahong1,2,3, LI Min1,3, MAO Xiaoli1,3, YANG Tianmin1, XIE Lijun1
(1. School of Electronics and Information Engineering, Nanjing University of Information Science & Technology, Nanjing 210044, China; 2. Jiangsu Collaborative Innovation Center of Atmospheric Environment and Equipment Technology, Nanjing University of Information Science & Technology, Nanjing 210044, China;
3. Jiangsu Key Laboratory of Meteorological Observation and Information Processing, Nanjing University of Information Science & Technology, Nanjing 210044, China)
Abstract: A multi?channel FIFO memory controller is designed to solve the conflict problem occurring when multiple functional modules access the same memory unit simultaneously. The work principle of the controller and the architecture design of the system are given. The finite state machine (FSM) and Verilog HDL language are used to design various modules. The pre?simulation and post?simulation are completed by using the ModelSim. The board unloading function verification is completed on the Xilinx FPGA platform. The practical results show that the memory controller can maximize the memory access efficiency on the premise of ensuring no access conflicts occur, provide an easy?to?use user interface, and easily define parameters such as the number of channels and the polling time of each channel according to the specific application, thereby achieving the highest resource utilization rate.
Keywords: FIFO; finite state machine; Verilog HDL; ModelSim; FPGA; memory controller; polling time; resource utilization rate
FPGA在對實(shí)時(shí)性要求高而且數(shù)據(jù)流量大或者算法復(fù)雜度高的應(yīng)用場合中使用越來越廣泛[1]。而FPGA的應(yīng)用一般都會涉及對外部存儲單元數(shù)據(jù)存儲和讀取問題,所以設(shè)計(jì)一款接口簡單易用、訪問效率高、性能穩(wěn)定的存儲控制器至關(guān)重要[2?4]。目前存儲控制器廣泛采用LocalLink接口總線。該接口總線由寫入數(shù)據(jù)線、讀取數(shù)據(jù)線、地址線、指令線和握手信號線組成。其中握手信號線包括local_ready和local_valid。local_ready用于通知外部模塊該控制器處于空閑狀態(tài),此時(shí)外部模塊可對該控制器發(fā)送讀/寫請求。local_valid用于通知外部模塊數(shù)據(jù)可用,此時(shí)外部模塊可從讀取數(shù)據(jù)線上取走數(shù)據(jù)[5]。采用LocalLink接口總線的存儲控制器擁有設(shè)計(jì)難度低、使用簡單等優(yōu)點(diǎn)的同時(shí)也存在以下不足:首先,不支持多個(gè)外部功能模塊同時(shí)訪問同一個(gè)控制器下掛載的存儲單元,外部多個(gè)功能模塊必須分時(shí)使用同一控制器,這就給外部功能模塊之間的協(xié)調(diào)帶來了困難,甚至造成存儲訪問沖突;其次,握手過程需占用時(shí)鐘周期,這就導(dǎo)致了存儲器訪問效率低下問題;最后,由于不帶數(shù)據(jù)緩沖,該存儲控制器只能應(yīng)用在數(shù)據(jù)流量相對穩(wěn)定的場合。
本文設(shè)計(jì)帶FIFO的多通道存儲控制器,使得多個(gè)外部功能模塊通過不同通道可以互不干擾地訪問同一存儲器單元[6]。外部模塊可以在任何時(shí)候?qū)⒅噶?、?shù)據(jù)和地址寫入FIFO或者從FIFO中讀取數(shù)據(jù),而不需要等待該控制器空閑,也無需等待數(shù)據(jù)可用,提高了存儲器訪問效率。通過設(shè)置FIFO深度以滿足不同的突發(fā)訪問要求。對于數(shù)據(jù)流量相對穩(wěn)定的應(yīng)用,可設(shè)置較小的FIFO深度以節(jié)省FPGA資源,而對于短時(shí)間內(nèi)存儲器訪問量大的應(yīng)用,則設(shè)置較大的FIFO深度,以防止數(shù)據(jù)遺漏。本文以ST公司的M25P64 NORFLASH為例,詳細(xì)闡述了帶FIFO的多通道存儲控制器設(shè)計(jì)過程。前仿真和后仿真使用Micron公司提供的M25P64仿真模型,最后在基于Xilinx公司的FPGA芯片XC6SLX45和在線邏輯分析儀ChipScope下板驗(yàn)證和測試。
1.1 ?架構(gòu)設(shè)計(jì)
本文設(shè)計(jì)的帶FIFO的多通道存儲控制器以SPI接口NORFLASH為示例,主要論述各通道仲裁和管理機(jī)制以及設(shè)計(jì)方法,而不是針對SPI接口NORFLASH的讀/寫過程展開敘述。圖1是帶FIFO的四通道存儲控制器系統(tǒng)架構(gòu)簡圖。其中通道0和通道1只支持讀指令,通道2和通道3只支持寫指令和擦除指令。
圖1中PLL是鎖相環(huán)模塊,其不僅負(fù)責(zé)提供該控制器的系統(tǒng)時(shí)鐘,還負(fù)責(zé)提供外部存儲器時(shí)鐘flash_clk、FIFO時(shí)鐘fifo_clk以及外部存儲器數(shù)據(jù)捕獲時(shí)鐘cap_clk。各時(shí)鐘為同頻率異相位關(guān)系,具體各時(shí)鐘的相位關(guān)系在后仿真中初步確定,在下板驗(yàn)證中最終確定。仲裁器的作用是決定各通道是否使能、控制多路器和清零輪詢計(jì)數(shù)。輪詢計(jì)數(shù)器用于記錄每個(gè)通道輪詢時(shí)間。指令FIFO用于存放指令數(shù)據(jù)。讀FIFO用于緩存控制器已經(jīng)從外部存儲讀取到的數(shù)據(jù)。寫FIFO用于緩存用戶將要寫入外部存儲器的數(shù)據(jù)。讀管理器和寫管理器分別負(fù)責(zé)各自通道指令譯碼、執(zhí)行操作和信號反饋等。
本文設(shè)計(jì)的存儲控制器接口簡單而高效。表1列出了該控制器的接口總線,通道0和通道1包括所有指令類接口和讀取類接口,通道2和通道3包括所有指令類接口和寫入類接口。
1.2 ?仲裁器設(shè)計(jì)
仲裁機(jī)制采用時(shí)間片輪轉(zhuǎn)方式,具體過程如下所述:首先,仲裁器在將輪詢計(jì)數(shù)器清零后使能通道0管理器并設(shè)置對應(yīng)多路器;然后,通道0管理器開始執(zhí)行操作,當(dāng)通道0管理器檢測到輪詢計(jì)數(shù)器計(jì)數(shù)值超出預(yù)設(shè)值,也即時(shí)間片消耗完,向仲裁器發(fā)送完成信號;最后,仲裁器收到通道0完成信號后,關(guān)閉通道0,并將輪詢計(jì)數(shù)器清零后使能下一個(gè)通道,依次循環(huán),達(dá)到各通道合理訪問外部存儲單元的目的。
仲裁器的作用是協(xié)調(diào)各個(gè)通道對外部存儲單元的訪問請求,不但控制多路器和各通道管理器,還負(fù)責(zé)控制初始化模塊和安全模塊。仲裁器狀態(tài)機(jī)如圖2所示,存儲控制器系統(tǒng)復(fù)位后,由IDLE狀態(tài)進(jìn)入S0狀態(tài),將多路器選擇為初始化模塊,隨后進(jìn)入S1狀態(tài),使能初始化模塊并獲得外部存儲芯片ID。當(dāng)初始化完成后進(jìn)入S2狀態(tài),將多路器選擇為安全模塊,隨后進(jìn)入S3狀態(tài),使能安全模塊,安全模塊根據(jù)初始化模塊獲得的ID進(jìn)行安全校驗(yàn)。安全校驗(yàn)不通過仲裁器鎖死在S3狀態(tài),否則進(jìn)入S4狀態(tài),S4狀態(tài)中將多路器選擇為讀模塊并清零輪詢計(jì)數(shù)器,隨后進(jìn)入S5狀態(tài),使能通道0管理器。當(dāng)收到通道0管理器反饋的完成信號后,進(jìn)入S6狀態(tài),關(guān)閉通道0管理器并清零輪詢計(jì)數(shù)器,隨后進(jìn)入S7狀態(tài),使能通道1管理器。如此依次執(zhí)行通道1、通道2和通道3操作,當(dāng)收到通道3管理器反饋的完成信號后,再次進(jìn)入S4狀態(tài)。
1.3 ?讀管理器和寫管理器設(shè)計(jì)
讀管理器和寫管理器除了具備指令譯碼,執(zhí)行操作和信號反饋等基本功能外,為了滿足更苛刻的輪詢時(shí)間要求和優(yōu)化執(zhí)行效率,還具備指令拆分和指令綜合功能。指令拆分功能表述如下:當(dāng)某一條指令需要讀取的數(shù)據(jù)較多,執(zhí)行時(shí)間超過一個(gè)輪詢時(shí)間片時(shí),為了不占用其他通道的輪詢時(shí)間,必須暫停該條指令,為其他通道讓出使用權(quán)。指令綜合功能表述如下:為了提高讀取數(shù)據(jù)的效率,將多條地址連續(xù)的讀指令合并成一條讀指令,而節(jié)省重復(fù)發(fā)送指令碼、訪問地址的時(shí)間。
讀管理器的狀態(tài)機(jī)如圖3所示,在S0狀態(tài)中判斷cmd_record[29:24]數(shù)據(jù)量是否為0。數(shù)據(jù)量為0表示在上一次輪詢該通道時(shí)遺留下未完成的指令,此時(shí)跳轉(zhuǎn)到S1狀態(tài);如果不為0且指令FIFO不為空,則進(jìn)入S10,如果數(shù)據(jù)量為0而指令FIFO為空則進(jìn)入OVER狀態(tài)。S10和S11是從指令FIFO中讀取新指令的過程,完成后同樣進(jìn)入S1狀態(tài)。S1狀態(tài)中首先判斷指令名是否合法,如果不合法進(jìn)入ERROR狀態(tài),合法則判斷讀FIFO是否已經(jīng)被寫滿,寫滿將rd_overflow拉高并進(jìn)入OVER狀態(tài),未寫滿進(jìn)入S2狀態(tài)。S2~S5狀態(tài)是讀取4 B數(shù)據(jù)并更新cmd_record的過程,完成S5后進(jìn)入S6狀態(tài)。在S6狀態(tài)中首先檢查輪詢計(jì)數(shù)器是否大于等于預(yù)設(shè)值或者讀FIFO是否為空,如果計(jì)數(shù)器大于預(yù)設(shè)值或者讀FIFO為空,則進(jìn)入S12狀態(tài),否則判斷cmd_record[29:24]數(shù)據(jù)量是否為0,不為0則進(jìn)入S3狀態(tài)繼續(xù)讀取數(shù)據(jù),為0檢測指令FIFO是否為空,為空同樣進(jìn)入S12狀態(tài),否則進(jìn)入S7狀態(tài)。S7,S8完成從指令FIFO中讀取新的指令操作,如果地址連續(xù)則不需要結(jié)束本次讀操作而直接從S8進(jìn)入S3狀態(tài)繼續(xù)進(jìn)行讀操作,否則進(jìn)入S9狀態(tài)結(jié)束本次讀操作并進(jìn)行新的讀操作。S12中主要完成關(guān)閉讀模塊操作,之后進(jìn)入OVER狀態(tài),OVER狀態(tài)將done拉高。寫管理器的狀態(tài)機(jī)設(shè)計(jì)與讀管理器類似,不再贅述。
2.1 ?前仿真
帶FIFO的多通道存儲控制器在Xilinx ISE 14.7環(huán)境下開發(fā)。以Micron公司提供的M25P64模型在ModelSim中進(jìn)行行為級仿真。帶FIFO的多通道存儲控制器將對外部存儲單元的操作轉(zhuǎn)化成對FIFO的操作,F(xiàn)IFO由Xilinx FIFO生成器IP核構(gòu)造。為了盡可能消除毛刺,提高系統(tǒng)穩(wěn)定性,本文設(shè)計(jì)中所有的多路器都采用時(shí)序邏輯觸發(fā)的方式[7?9]。
前仿真時(shí)序如圖4所示,p0通道和p1通道可以不沖突地輪流讀取數(shù)據(jù)。在此過程中人為設(shè)置了錯誤的指令名和FIFO過載等非正常狀態(tài),而從仿真的時(shí)序圖中也不難發(fā)現(xiàn)這些非正常狀態(tài)均能得到預(yù)期的反饋。
2.2 ?后仿真
綜合并布局布線后仿真可以全面地包含器件延時(shí)、連線延時(shí)以及時(shí)鐘毛刺等信息,不但可以全面地驗(yàn)證所設(shè)計(jì)的模塊功能是否滿足設(shè)計(jì)要求,還能保證穩(wěn)定性要求。本文設(shè)計(jì)中后仿真要解決的核心問題是窗口問題,即將時(shí)鐘信號的采樣邊沿調(diào)整到有效窗口的中心位置。
圖5是fifo_clk后仿真時(shí)序圖,系統(tǒng)時(shí)鐘設(shè)置為50 MHz。如圖5中橢圓標(biāo)示處,fifo_clk上升沿處于有效窗口中心位置,此時(shí),能保證最優(yōu)的建立時(shí)間和保持時(shí)間。flash_clk,cap_clk時(shí)鐘調(diào)節(jié)過程同fifo_clk。
經(jīng)過后仿真時(shí)鐘相位調(diào)節(jié),Micron公司提供的M25P64仿真模型和Xilinx庫均無報(bào)錯,因而滿足時(shí)序要求。
ChipScope是ISE開發(fā)環(huán)境中的一個(gè)工具,集成了關(guān)鍵邏輯分析器和其他測試和測量組件,用于測試Xilinx FPGA芯片內(nèi)部的目標(biāo)設(shè)計(jì)[10?11]。本文設(shè)計(jì)的帶FIFO的多通道存儲控制器在Xilinx公司的FPGA芯片XC6SLX45中進(jìn)行驗(yàn)證和測試。該設(shè)計(jì)主要資源使用情況如下:使用邏輯片資源657,占9%;使用1個(gè)PLL資源,占25%;使用6 KB嵌入式RAM資源,占2%。
圖6a)為ChipScope窗口。從ChipScope中觀察到本文設(shè)計(jì)的存儲控制器能從外部存儲單元中讀取數(shù)據(jù)。圖6b)為測試指令綜合功能。寫入3條地址連續(xù)的讀/寫指令,如圖6b)中p0_cmd_rd_data所示,3條指令被綜合成一條讀指令,如圖6b)中flash_addr所示。綜上所述,本文設(shè)計(jì)與實(shí)現(xiàn)的帶FIFO的多通道存儲控制器達(dá)到了預(yù)期功能,具有較強(qiáng)的實(shí)用性。
本文以實(shí)際應(yīng)用為出發(fā)點(diǎn),實(shí)現(xiàn)帶FIFO的多通道存儲控制器,使得多個(gè)外部模塊能夠高效而又無沖突訪問同一外部存取單元。本文設(shè)計(jì)不局限于SPI接口NORFLASH,其他類型存儲單元只要改變對應(yīng)接口模塊和讀/寫模塊即可,因而具有良好的可移植性和通用性。本文設(shè)計(jì)具備高度的可配置性,用戶可以根據(jù)具體應(yīng)用自由定義通道數(shù)量、各通道功能、各通道輪詢時(shí)間、FIFO深度等,以達(dá)到最高資源利用效率。
參考文獻(xiàn)
[1] LIU B L, LIU B Q, PAN L, et al. Research and design of video acquisition system based on FPGA [J]. Applied mechanics and materials, 2014, 644: 3472?3475.
[2] 李明明,王全忠,郭偉,等.一種NOR FLASH控制器驗(yàn)證平臺的研究[J].現(xiàn)代電子技術(shù),2015,38(10):162?165.
LI Mingming, WANG Quanzhong, GUO Wei, et al. Research on a verification platform for NOR FLASH controller [J]. Modern electronics technique, 2015, 38(10): 162?165.
[3] 呂波,張涌,黃侃,等.基于FPGA的四口RAM設(shè)計(jì)與實(shí)現(xiàn)[J].儀表技術(shù)與傳感器,2017(1):34?37.
L? Bo, ZHANG Yong, HUANG Kan, et al. Design and implementation of quad?port RAM based on FPGA [J]. Instrument technique and sensor, 2017(1): 34?37.
[4] 吳長瑞,徐建清,蔣景紅.基于Kintex?7 FPGA的DDR3 SDRAM接口應(yīng)用研究[J].現(xiàn)代電子技術(shù),2017,40(24):21?24.
WU Changrui, XU Jianqing, JIANG Jinghong. Application of DDR3 SDRAM interface based on Kintex?7 FPGA [J]. Modern electronics technique, 2017, 40(24): 21?24.
[5] MAHMOODI M R, SAYEDI S M. A low cost high speed FPGA?based image processing framework [J]. International journal of modern education and computer science, 2016, 8(3): 11?21.
[6] GONG Z P, CHEN T F, ZOU F, et al. Implementation of multi?channel FIFO in one blockRAM with parallel access to one port [J]. Journal of computers, 2014, 9(5): 1193?1200.
[7] 張松,李筠.FPGA的模塊化設(shè)計(jì)方法[J].電子測量與儀器學(xué)報(bào),2014,28(5):560?565.
ZHANG Song, LI Jun. Modular design of FPGA design methodology [J]. Journal of electronic measurement and instrumentation, 2014, 28(5): 560?565.
(上接第4頁)
[8] 關(guān)珊珊,周潔敏.基于Xilinx FPGA的SPI FLASH控制器設(shè)計(jì)與驗(yàn)證[J].電子器件,2012,35(2):216?220.
GUAN Shanshan, ZHOU Jiemin. Design and verification of SPI FLASH controller based on Xilinx FPGA [J]. Chinese journal of electron devices,2012,35(2):216?220.
[9] 黃宏智,周欽強(qiáng),黃飛龍.新型自動氣象站NAND FLASH存儲系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子測量技術(shù),2016,39(12):132?135.
HUANG Hongzhi, ZHOU Qinqiang, HUANG Feilong. Design and realization of the storage system for new automatic weather station based on NAND FLASH [J]. Electronic measurement technology, 2016, 39(12): 132?135.
[10] Xilinx. Product guide: LogiCORE IP FIFO generator v9.3 [EB/OL]. (2012?12?18) [2017?10?25]. https://www.xilinx.com/support/documentation/ip_documentation/fifo_generator/v9_3/pg057?fifo?generator.pdf.
[11] Xilinx. User guide: ChipScope pro software and cores [EB/OL]. (2012?10?16)[2017?10?26]. https://www.xilinx.com/support/documentation/sw_manuals/xilinx14_7/chipscope_pro_sw_cores_ug029.pdf.