首頁 / 電子技術在哪些領域方麵用 / fpga中ram單元如何調用(ram fpga)

        fpga中ram單元如何調用(ram fpga)

        Time:2024-01-17 08:34:54 Read:587 作者:CEO

        設計中存儲資源的使用

        不同的用戶可能需要不同數量的RAM 來構建其特定的應用程序。因此,FGPA 底層的RAM 塊大小是一個有趣的話題。如果太大,則不夠靈活,無法滿足小容量的應用。當然,可以直接使用大容量的RAM來實現小容量的應用,但這必然會造成大量的資源浪費;如果基塊太小,中型或大型RAM應用將需要大量的小型RAM來組成。為了通用性,小型RAM也會配備相同的信號輸入接口。這會極大消耗FPGA內部的布線資源,甚至造成布線擁塞和時序問題。

        fpga中ram單元如何調用(ram fpga)

        幾乎所有內置FPGA 的設計都需要一定量的內部存儲器資源來存儲係數、緩衝數據和各種其他用途。典型的係統需要結合小型、中型和大型存儲器陣列來滿足其所有要求,這使得存儲器的整體功耗成為主要的設計考慮因素。

        設計FPGA 時,創建滿足大多數客戶需求的器件非常重要。如果FPGA 采用適合某個應用的小型、中型和大型存儲器資源構建,那麼該解決方案對於某些客戶來說將是最佳的,而其他想要使用相同部件的客戶可能需要做出相當大的改變。權衡。

        試圖從FPGA 中獲得最大價值的用戶可能會擔心大量RAM 中的資源被浪費。但構建更精細、更小的RAM 塊需要額外的布線,這是有代價的。本文解釋了其中的權衡:為什麼更精細的RAM 基本塊通常成本更高。

        圖1 顯示了FPGA 中小型、中型和大型存儲器塊的理論分布(未按任何特定比例繪製)。

        恰好需要這種塊組合的設計可以完美地利用可用資源(見圖2)。

        然而,想象一個場景,用戶隻需要四個以上的中等大小的資源。

        一種方法是使用大量小型組件構建中型存儲器陣列,這會消耗大量資源並導致將它們連接在一起的複雜性。另一種選擇是使用大塊作為中間塊,使大塊中的所有剩餘資源不可用,同時保持它們通電並因此消耗電力(參見圖3)。

        FPGA 製造商麵臨的挑戰是構建具有最靈活的存儲器資源組合的設備,使所有用戶能夠將其所需的存儲器陣列大小安裝到設備中,同時實現所需的性能,而不會浪費大量資源和功耗。消耗。

        FPGA中的存儲資源

        本章介紹BRAM 資源。更詳細的可以看這裏:從底層結構學習FPGA----Block RAM(BRAM,塊RAM)

        Xilinx FPGA 使用各種存儲器資源來提供靈活性和低成本的最佳組合。所有7 係列FPGA(包括ArTIx-7、Kintex-7 和Virtex-7 係列)都使用相同的內存塊,允許從一個7 係列FPGA 係列無縫遷移到另一個係列。

        顯然,構建存儲資源來滿足每個用戶的需求是一項艱巨的挑戰。 Xilinx 7 係列FPGA 中實現的解決方案是創建稱為塊RAM 的構建塊(參見圖4),這些構建塊可以組合在一起形成更大的陣列,也可以分割形成更小的陣列。將Block RAM 與FPGA 邏輯中的6 輸入查找表(LUT) 組合成小型存儲器陣列的能力為用戶提供了最靈活的資源來創建各種大小的存儲器陣列。

        塊RAM

        每個7 係列FPGA 都有135 至1880 個雙端口Block RAM。每個塊RAM 能夠存儲36Kb 數據,其中32Kb 分配用於數據存儲,在某些內存配置中,另外4Kb 分配用於奇偶校驗位。每個Block RAM 都有兩個完全獨立的端口,僅共享存儲的數據。

        每個端口可以配置為:

        32K x 1 16K x 2 8K x 4 4K x 9(或8) 2K x 18(或16) 1K x 36(或32) 512 x 72(或64)

        每個Block RAM可分為兩個完全獨立的18 Kb Block RAM,每個RAM可配置從16K x 1到512 x 36的比例。當36K Block RAM 被分割為兩個獨立的Block RAM 時,這兩個獨立的Block RAM 中的每一個的行為都與36Kb Block RAM 完全相同,隻是大小隻有36Kb Block RAM 的一半。

        相反,如果用戶需要更大的內存陣列,則可以將兩個相鄰的36 Kb Block RAM 配置為級聯的64K x 1 雙端口RAM,而無需任何額外的邏輯和資源。 Xilinx 7 係列FPGA 中的Block RAM 組件可以配置為單端口、簡單雙端口或真正的雙端口模式。此外,可以通過以下三種方式之一從Block RAM 讀取數據:READ_FIRST、WRITE_FIRST 或NO_CHANGE 模式。

        分割塊RAM

        如果用戶隻需要單端口存儲器,而不是實現完整的真正的雙端口功能,則可以將塊RAM 劃分為更小的存儲器陣列。當Block RAM處於真正的雙端口模式(默認模式)時,Port A和Port B可以通過將ADDRA地址總線的最高有效位連接到VCC(高)來實現單獨的、獨立的延遲線存儲器,單端口。存儲器或ROM 和ADDRB 地址總線的最高有效位接地,從而創建兩個單端口塊RAM。

        例如,RAMB36E1,36K塊RAM原語,可以分為兩個18K單端口存儲器,RAMB18E1可以分為兩個9K單端口存儲器。使用這種方法,可以為7 係列FPGA 中的每個塊RAM 陣列創建四個延遲線存儲器。要以這種方式在Block RAM 中實現延遲線,必須使用READ_FIRST 或先讀後寫模式。

        如果實現單端口存儲器,則對允許的模式沒有這樣的限製;可以使用任何支持的模式(READ_FIRST、WRITE_FIRST 或NO_CHANGE),並且Block RAM 中的不同存儲器可以具有不同的端口寬度。由此產生的存儲器方案每個時鍾周期每個端口執行一次操作,因此每個時鍾周期每個塊RAM 執行四次操作。

        同步運行

        對內存的每次訪問,無論是讀還是寫,都由時鍾控製。所有輸入、數據、地址、時鍾使能和寫使能均已注冊。沒有時鍾什麼都不會發生。輸入地址始終被計時,保留數據直到下一次操作。可選的輸出數據流水線寄存器允許更高的時鍾速率,但代價是額外的延遲周期。在寫操作期間,數據輸出可以反映先前存儲的數據、新寫入的數據或保持不變。

        字節寬寫使能

        Block RAM 的字節寫入使能功能提供一次寫入八位(一個字節)輸入數據的能力。真正的雙端口RAM 具有多達四個獨立的字節寬寫入使能輸入。每個字節範圍寫入使能與一個字節的輸入數據和一個奇偶校驗位相關聯。當使用Block RAM 與微處理器連接時,此功能非常有用。

        錯誤檢測和糾正

        Xilinx 7 係列FPGA 中的每個64 位寬Block RAM 可以生成、存儲和利用8 個額外的漢明碼位,並在讀取過程中執行單位錯誤糾正和雙位錯誤檢測(ECC)。在寫入或讀取外部64/72 位寬存儲器時也可以使用ECC 邏輯。這適用於簡單雙端口模式,不支持read-during-write。

        先進先出控製器

        Xilinx 7 係列FPGA 中的內置FIFO 控製器用於單時鍾(同步)或雙時鍾(異步或多速率)操作,遞增內部地址並提供四個握手標誌:滿、空、幾乎滿和幾乎空。幾乎滿和幾乎空標誌可以自由編程。與Block RAM 類似,FIFO 寬度和深度是可編程的,但寫入和讀取端口的寬度始終相同。第一個字直通模式甚至在第一次讀取操作之前就渲染在數據輸出上寫入的第一個字。讀完第一個字後,這個模式和標準模式沒有什麼區別。

        分布式內存(DRAM)

        Xilinx 7 係列FPGA 的邏輯由6 輸入LUT 等元素組成。 LUT 以四個為一組排列並組合成一個Slice。 7係列FPGA中有兩種類型的Slice——SLICEM和SLICEL。 SLICEM 中的LUT 占7 係列FPGA 切片總數的25-50%,可以實現為稱為分布式RAM 元素的同步RAM 資源。每個6 輸入LUT 可配置為一個64 x 1 位RAM 或兩個32 x 1 位RAM。 SLICEM 中的6 輸入LUT 可以級聯以形成更大的元件,在簡單的雙端口配置中高達64 x 3 位,在單端口配置中高達256 x 1 位。參見圖5。

        分布式RAM 模塊是同步(寫入)資源。可以使用同一片中的存儲元件或觸發器來實現同步讀取。通過放置該觸發器,可以通過減少觸發器時鍾輸出值的延遲來提高分布式RAM 性能。然而,增加了額外的時鍾延遲。分布式元件共享相同的時鍾輸入。對於寫操作,由SLICEM 的CE 或WE 引腳驅動的寫使能(WE) 輸入必須設置為高電平。

        典型的用戶設計利用率

        表1 顯示了Kintex-7 XC7K410T FPGA 的典型存儲器高利用率設計中的資源映射。該數據基於擔心比特浪費的用戶的真實示例。

        多種不同的資源利用了配置不同大小的Block RAM 資源的能力。

        無窮小的構建塊的成本

        確定Xilinx FPGA 架構提供了多種不同的存儲器深度/寬度粒度後,了解向架構添加更精細的構建模塊所涉及的權衡非常重要。例如,如果7係列FPGA中的一個36K RAM塊不僅被分割成兩個18K塊,它還可以進一步被分割成四個9K真正的雙端口塊,但這需要付出一定的代價。將單個Block RAM 中的唯一內存量加倍意味著進出每個Block RAM 的最大信號數量也需要加倍,這反過來又需要將互連資源(或塊)的數量加倍以適應路由~400 信號接線。

        例如,8K Block RAM 可配置為16 位寬和512 位深,總共需要25 個輸入信號——16 條數據線和9 條地址線。然後將8K Block RAM 分為兩個4K Block RAM。每個Block RAM 均可配置為16 位寬和256 位深。此配置每個塊需要16 條數據線和8 條地址線,每個4K Block RAM 總共有24 個輸入信號或總共48 個信號。 48 個信號大約是8K Block RAM 所需的25 個輸入信號的兩倍。將與每個塊RAM 相關的互連塊數量加倍的效果是矽麵積增加25%,這對所有塊來說都是一種損失,無論使用何種配置。因此,將每個Block RAM配置為四個9K塊的能力意味著每個塊從四個區域單元增加到五個區域單元。從積極的一麵來看,它允許較小的存儲器利用較小的塊大小(參見表2)。

        參考相同的設計示例,如果可以將較小的512 x 18 內存有效地打包到相鄰的9K 塊中,其影響相當於消耗更少的資源。然而,較大的塊都大了25%,從而顯著增加了麵積損失。因此,如果Kintex-7 FPGA中的Block RAM可以分為四個獨立的存儲器,並且用戶設計可以充分利用這些更小的粒度塊,那麼這種典型設計仍然會比當前的36K/18K配置占用更大的存儲器。區域。然而,由於嚐試將如此多的信號連接到一條總線上會造成布線擁塞,該設計不可能通過將四個獨立的9K 真正雙端口存儲器打包到同一個36K Block RAM 中來充分利用它們。因此,表2中的麵積乘法是最好的情況;實際上,並非所有36K Block RAM 都會被四個9K 存儲器填滿。

        對設備資源的影響

        Block RAM 資源大小的增加可能會對整體設備資源產生以下三種影響之一:

        保持器件大小相同並丟失Block RAM 位保持Block RAM 位數量相同並減少其他資源(即CLB)的數量保持所有資源不變

        這些使設備變得更大的選項中的每一個都會帶來嚴重的後果:

        丟失Block RAM 位並不理想,因為大多數用戶正在使用大部分可用內存。如果Block RAM全麵增加25%,Kintex-7 XC7K410T FPGA中的塊數將從795個減少到636個,相當於從28,620 Kb減少到22,896 Kb。 Block RAM 大小增加25% 意味著每個RAM 列CLB 丟失一列。 Kintex-7 XC7K410T FPGA 有12 個Block RAM 列,因此在這種情況下,它會從器件中丟失12 列CLB,相當於丟失4,200 個CLB,相當於大約54,000 個邏輯單元。這會將Kintex-7 XC7K410T FPGA 從406,720 個邏輯單元減少到352,720 個邏輯單元,從而以相同的成本生產出功能較弱的器件。保持所有資源相同並允許增加矽麵積有幾個缺點。顯而易見的第一個問題是,更大的設備意味著更昂貴的設備,但物理上更大的矽也會對功耗產生重大影響。 Block RAM 陣列的功耗優化功耗的重要性

        功耗在大多數現代應用中至關重要,降低係統內的功耗對每個設計人員來說都是一個挑戰。降低功耗的方法有很多,但許多方法都伴隨著顯著的性能損失。借助7 係列FPGA,Xilinx 采用創新方法來降低與Block RAM 存儲器陣列相關的功耗。降低功耗的兩種主要方法是:

        識別不必要的功耗區域並采取行動能夠在降低功耗的同時稍微降低最大性能未使用的Block RAM

        所有Block RAM 組件在加電時都會消耗功率,無論它們是否在設計中使用。 Xilinx 7 係列FPGA 的獨特功能使軟件能夠自動識別未使用的Block RAM。識別出未使用的Block RAM 後,它們會自動禁用並進入零功耗狀態,從而顯著降低FPGA 的整體功耗。

        使用XST(xilinx綜合工具)推斷RAM

        如果讀取地址存儲在存儲器中,則模塊XST 推斷塊RAM。相反,如果RAM 網絡使用異步讀取操作,則推斷為分布式RAM。 ram_style 屬性可用於指定是使用塊RAM 還是分布式RAM。當RAM 網絡大於基本塊的大小時,可以使用多個塊RAM。默認策略是優化性能。在該策略中,小RAM是使用分布式RAM來實現的。 RAM 網絡還可以針對功耗和麵積進行優化;本文的使用CORE Generator 軟件構建RAM 部分對此進行了描述。任何小於128 位深或512 位深x 寬度的內容都在分布式RAM 中實現,除非用戶使用ram_style 屬性另行指定。為了確保最有效地利用Block RAM 和分布式RAM 資源,XST 首先在Block RAM 中實現最大的RAM,如果Block RAM 資源仍然可用,則將較小的RAM 放置在Block RAM 中。 XST 還可以將小型單端口RAM 封裝成單個塊RAM。

        XST 中可以啟用降低Block RAM 功耗的技術。它們是由功耗降低(POWER) 綜合選項控製的更大優化集的一部分,並且可以通過RAM 樣式(RAM_STYLE) 約束專門啟用。 XST 中的RAM 功耗優化技術主要旨在減少設備上同時活動的塊RAM 的數量。它們僅適用於需要分解多個Block RAM 原語並利用Block RAM 資源的啟用功能的推斷內存。創建額外的啟用邏輯,以確保一次僅啟用一個實現推斷內存的Block RAM 原語。激活適合單塊RAM 原語的推斷內存的功耗降低技術沒有任何效果。啟用後,可結合麵積和速度優化目標尋求降低功耗。通過RAM 樣式(RAM_STYLE) 約束可以實現兩種優化權衡:

        模式block_power1實現了一定程度的功耗降低,同時對電路性能的影響最小。在此模式下,保留默認的、麵向性能的Block RAM 分解算法。 XST 隻是添加了Block RAM 啟用邏輯。根據存儲器特性,功率隻會受到有限的影響。

        block_power2模式可以更顯著地降低功耗,但可能會對性能產生輕微影響。還可以引入額外的切片邏輯。此模式使用不同的Block RAM 分解方法。該方法首先旨在減少實現推斷內存所需的Block RAM 原語數量。然後通過插入塊RAM 啟用邏輯來最小化活動塊RAM 的數量。還創建了多路複用邏輯來從活動塊RAM 讀取數據。如果設計的主要重點是降低功耗,速度和麵積優化是次要的,那麼Xilinx 建議使用block_power2 模式。

        ROM 可以通過使用大的case 語句來推斷。 XST 還可以在Block RAM 中實現有限狀態機(FSM) 和邏輯,以最大限度地利用可用邏輯資源。

        使用CORE Generator 構建RAM

        CORE Generator 工具具有三種可用於優化Block RAM 網絡的算法。最小麵積方案使用盡可能少的資源(塊RAM),但也最大限度地減少輸出複用,以在最小麵積上保持最大性能(見圖6)。低功耗方案可以使用更多的資源,但可以確保在每次讀寫操作期間啟用最少數量的塊。這可能會導致使能信號上產生少量額外的解碼邏輯,但與節省的功率相比,這隻是一個很小的麵積損失。在此模式下運行時,CORE Generator 工具執行與RAM_STYLE=block_power2 模式下的XST 相同的功能。請注意,如果Block RAM 網絡非常大,則使用低功耗方案對其進行分割可能會導致需要路由許多額外的信號,這可能會耗盡設計其他部分的路由資源。

        第三個優化選項是固定PrimiTIve,用戶可以選擇特定的基元(例如4K x 4)來構建RAM網絡。由用戶決定哪種原語最適合他們的應用程序。 CORE Generator 工具還提供了一個選項來注冊RAM 網絡的輸出以提高性能。如果網絡中使用多個Block RAM,用戶可以選擇是在每個Block RAM 原語的輸出上注冊,還是在內核的輸出上注冊。

        綜上所述

        組合塊RAM可以配置為各種數據寬度/深度與分布式RAM的組合,以支持更小的存儲器陣列,提供了以最低成本構建不同大小的存儲存儲器的最靈活的方式。如果確切的功能正確的話,向組件添加額外的功能(例如阻止RAM)最初可能是最佳解決方案。然而,該組件及其組件對於用於添加新功能的相應互連具有區域懲罰。這些區域處罰之一對設備資源的影響更大。

        更多信息可以在這裏獲取==電子技術應用-AET

        Copyright © 2002-2024 應用電子技術網 版權所有 
        備案號:

        免責聲明: 1、本站部分內容係互聯網收集或編輯轉載,並不代表本網讚同其觀點和對其真實性負責。 2、本頁麵內容裏麵包含的圖片、視頻、音頻等文件均為外部引用,本站一律不提供存儲。 3、如涉及作品內容、版權和其它問題,請在30日內與本網聯係,我們將在第一時間刪除或斷開鏈接! 4、本站如遇以版權惡意詐騙,我們必奉陪到底,抵製惡意行為。 ※ 有關作品版權事宜請聯係客服郵箱:478923*qq.com(*換成@)