【正点原子MP157连载】 第十四章 IP核之RAM实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)實驗平臺:正點原子STM32MP157開發板
2)購買鏈接:https://item.taobao.com/item.htm?&id=629270721801
3)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/thread-318813-1-1.html
4)正點原子官方B站:https://space.bilibili.com/394620890
5)正點原子STM32MP157技術交流群:691905614
第十四章 IP核之RAM實驗
RAM的英文全稱是Random Access Memory,即隨機存取存儲器,它可以隨時把數據寫入任一指定地址的存儲單元,也可以隨時從任一指定地址中讀出數據,其讀寫速度是由時鐘頻率決定的。RAM主要用來存放程序及程序執行過程中產生的中間數據、運算結果等。本章我們將對Vivado軟件生成的RAM IP核進行讀寫測試,并向大家介紹Xilinx RAM IP核的使用方法。
本章包括以下幾個部分:
14.1 RAM IP核簡介
14.2 實驗任務
14.3 硬件設計
14.4 程序設計
14.5 下載驗證
?
14.1 RAM IP核簡介
Xilinx 7系列器件具有嵌入式存儲器結構,滿足了設計對片上存儲器的需求。嵌入式存儲器結構由一列列BRAM(塊RAM)存儲器模塊組成,通過對這些BRAM存儲器模塊進行配置,可以實現各種存儲器的功能,例如:RAM、移位寄存器、ROM以及FIFO緩沖器。
Vivado軟件自帶了BMG IP核(Block Memory Generator,塊RAM生成器),可以配置成RAM或者ROM。這兩者的區別是RAM是一種隨機存取存儲器,不僅僅可以存儲數據,同時支持對存儲的數據進行修改;而ROM是一種只讀存儲器,也就是說,在正常工作時只能讀出數據,而不能寫入數據。需要注意的是,配置成RAM或者ROM使用的資源都是FPGA內部的BRAM,只不過配置成ROM時只用到了嵌入式BRAM的讀數據端口。本章我們主要介紹通過BRAM IP核配置成RAM的使用方法。
Xilinx 7系列器件內部的BRAM全部是真雙端口RAM(True Dual-Port ram,TDP),這兩個端口都可以獨立地對BRAM進行讀/寫。但也可以被配置成偽雙端口RAM(Simple Dual-Port ram,SDP)(有兩個端口,但是其中一個只能讀,另一個只能寫)或單端口RAM(只有一個端口,讀/寫只能通過這一個端口來進行)。單端口RAM只有一組數據總線、地址總線、時鐘信號以及其他控制信號,而雙端口RAM具有兩組數據總線、地址總線、時鐘信號以及其他控制信號。有關BRAM的更詳細的介紹,請讀者參閱Xilinx官方的手冊文檔“UG473,7 Series FPGAs Memory Resources User Guide”。
單端口RAM類型和雙端口RAM類型在操作上都是一樣的,我們只要學會了單端口RAM的使用,那么學習雙端口RAM的讀寫操作也是非常容易的。本章我們以配置成單端口RAM為例進行講解。
BMG IP核配置成單端口RAM的框圖如下圖所示。
圖 7.5.13.1 單端口RAM框圖
各個端口的功能描述如下:
DINA:RAM端口A寫數據信號。
ADDRA:RAM端口A讀寫地址信號,對于單端口RAM來說,讀地址和寫地址共用同該地址線。
WEA:RAM端口A寫使能信號,高電平表示向RAM中寫入數據,低電平表示從RAM中讀出數據。
ENA:端口A的使能信號,高電平表示使能端口A,低電平表示端口A被禁止,禁止后端口A上的讀寫操作都會變成無效。另外ENA信號是可選的,當取消該使能信號后,RAM會一直處于有效狀態。
RSTA:RAM端口A復位信號,可配置成高電平或者低電平復位,該復位信號是一個可選信號。
REGCEA:RAM端口A輸出寄存器使能信號,當REGCEA為高電平時,DOUTA保持最后一次輸出的數據,REGCEA同樣是一個可選信號。
CLKA:RAM端口A的時鐘信號。
DOUTA:RAM端口A讀出的數據。
14.2 實驗任務
本節實驗任務是使用Xilinx BMG IP核,配置成一個單端口的RAM,然后對RAM進行讀寫操作,通過在Vivado自帶的仿真器中觀察波形是否正確,最后將設計下載到領航者Zynq開發板中,并使用ILA對其進行在線調試觀察。
14.3 硬件設計
本章實驗只用到了輸入的時鐘信號和按鍵復位信號,沒有用到其它硬件外設,各端口信號的管腳分配如下表所示:
表 14.3.1 IP核之RAM實驗管腳分配
信號名 方向 管腳 端口說明 電平標準
sys_clk input U18 系統時鐘,50Mhz LVCMOS33
sys_rst_n input N16 系統復位,低電平有效,位于底板上 LVCMOS33
對應的XDC約束語句如下所示:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
14.4 程序設計
首先在Vivado軟件中創建一個名為ip_ram的工程,工程創建完成后,在Vivado軟件的左側“Flow Navigator”欄中單擊“IP Catalog”,如下圖所示。
圖 7.5.13.1 點擊“IP Catalog”
在“IP Catalog”窗口的搜索框中輸入“Block Memory”,出現唯一匹配的“Block Memory Generator”,如下圖所示(圖中出現的兩個IP核為同一個BMG IP核)。
圖 7.5.13.2 搜索框中輸入“Block Memory”
雙擊“Block Memory Generator”后彈出IP核的配置界面,接下來對BMG IP核進行配置,“Basic”選項頁配置界面如下圖所示。
圖 7.5.13.3 “Basic”選項頁配置
Component Name:設置該IP核的名稱,這里保持默認即可。
Interface Type:RAM接口總線。這里保持默認,選擇Native接口類型(標準RAM接口總線);
Memory Type:存儲器類型。可配置成Single Port RAM(單端口RAM)、Simple Dual Port RAM(偽雙端口RAM)、True Dual Port RAM(真雙端口RAM)、Single Port ROM(單端口ROM)和Dual Port ROM(雙端口ROM),這里選擇Single Port RAM,即配置成單端口RAM。
ECC Options:Error Correction Capability,糾錯能力選項,單端口RAM不支持ECC。
Write Enable:字節寫使能選項,勾中后可以單獨將數據的某個字節寫入RAM中,這里不使能。
Algorithm Options:算法選項。可選擇Minimum Area(最小面積)、Low Power(低功耗)和Fixed Primitives(固定的原語),這里選擇默認的Minimum Area。
接下來切換至“Port A”選項頁,設置端口A的參數,該頁面配置如下:
圖 7.5.13.4 “Port A Options”選項頁配置
Write Width:端口A寫數據位寬,單位Bit,這里設置成8。
Read Width:端口A讀數據位寬,一般和寫數據位寬保持一致,設置成8。
Write Depth:寫深度,這里設置成32,即RAM所能訪問的地址范圍為0-31。
Read Depth:讀深度,默認和寫深度保持一致。
Operating Mode:RAM讀寫操作模式。共分為三種模式,分別是Write First(寫優先模式)、Read First(讀優先模式)和No Change(不變模式)。寫優先模式指數據先寫入RAM中,然后在下一個時鐘輸出該數據;讀優先模式指數據先寫入RAM中,同時輸出RAM中同地址的上一次數據;不變模式指讀寫分開操作,不能同時進行讀寫,這里選擇No Change模式。
Enable Port Type:使能端口類型。Use ENA pin(添加使能端口A信號);Always Enabled(取消使能信號,端口A一直處于使能狀態),這里選擇默認的Use ENA pin。
Port A Optional Output Register:端口A輸出寄存器選項。其中“Primitives Output Register”默認是選中狀態,作用是打開BRAM內部位于輸出數據總線之后的輸出流水線寄存器,雖然在一般設計中為了改善時序性能會保持此選項的默認勾選狀態,但是這會使得BRAM輸出的數據延遲一拍,這不利于我們在Vivado的ILA調試窗口中直觀清晰地觀察信號;而且在本實驗中我們僅僅是把BRAM的數據輸出總線連接到了ILA的探針端口上來進行觀察,除此之外數據輸出總線沒有別的負載,不會帶來難以滿足的時序路徑,因此這里取消勾選。
Port A Output Reset Options:RAM復位信號選項,這里不添加復位信號,保持默認即可。
另外,需要注意的是,下面的“Primitives Output Register”默認是選中狀態的,此選項的作用是打開塊RAM內部的位于輸出數據總線之后的輸出流水線寄存器,雖然在一般設計中為了改善時序性能會保持此選項的默認勾選狀態,但是這會使得塊RAM輸出的數據延遲一拍,這不利于我們在Vivado的ILA調試窗口中直觀清晰地觀察信號;而且在本實驗中我們僅僅是把塊RAM的數據輸出總線連接到了ILA的探針端口上來進行觀察,除此之外數據輸出總線沒有別的負載,不會帶來難以滿足的時序路徑。
接下來的“Other Options”選項頁用于設置RAM的初始值等,本次實驗不需要設置,直接保持默認即可。
最后一個是“Summary”選項頁,該頁面顯示了存儲器的類型,消耗的BRAM資源等,我們直接點擊“OK”按鈕完成BMG IP核的配置,如下圖所示:
圖 7.5.13.5 “Summary”選項頁
接下來會彈出詢問是否在工程目錄下創建存放IP核的文件,我們點擊“OK”按鈕即可。
緊接著會彈出“Genarate Output Products”窗口,我們直接點擊“Generate”,如下圖所示。
圖 7.5.13.6 “Genarate Output Products”窗口
之后我們就可以在“Design Run”窗口的“Out-of-Context Module Runs”一欄中出現了該IP核對應的run“blk_mem_gen_0_synth_1”,其綜合過程獨立于頂層設計的綜合,所以在我們可以看到其正在綜合,如下圖所示。
圖 7.5.13.7 “blk_mem_gen_0_synth_1”run
在其Out-of-Context綜合的過程中,我們就可以進行RTL編碼了。首先打開IP核的例化模板,在“Source”窗口中的“IP Sources”選項卡中,依次用鼠標單擊展開“IP”-“blk_mem_gen_0”-“Instantitation Template”,我們可以看到“blk_mem_gen_0.veo”文件,它是由IP核自動生成的只讀的verilog例化模板文件,雙擊就可以打開它,如下圖所示。
圖 7.5.13.8 “blk_mem_gen_0.veo”文件
接下來我們創建一個新的設計文件,命名為ram_rw.v,代碼如下:
模塊中定義了一個讀寫控制計數器(rw_cnt),當計數范圍在031之間時,向ram中寫入數據;當計數范圍在3263之間時,從ram中讀出數據。
接下來我們設計一個verilog文件來實例化創建的RAM IP核以及ram_rw模塊,文件名為ip_ram.v, 編寫的verilog代碼如下。
程序中例化了ram_rw模塊和ram IP核blk_mem_gen_0,其中ram_rw模塊負責產生對ram IP核讀/寫所需的所有數據、地址以和讀寫使能信號,同時從ram IP讀出的數據也連接至ram_rw模塊。
接下來對RAM IP核進行仿真,來驗證對RAM的讀寫操作是否正確。tb_ip_ram仿真文件源代碼如下:
接下來就可以開始仿真了,仿真過程這里不再贅述,仿真波形圖如下圖所示。
圖 7.5.13.9 RAM寫操作波形圖
圖 7.5.13.9為RAM的寫操作仿真波形圖,由上圖可知,ram_wea信號拉高,說明此時是對ram進行寫操作。ram_wea信號拉高之后,地址和數據都是從0開始累加,也就說當ram地址為0時,寫入的數據也是0;當ram地址為1時,寫入的數據也是1,我們總共向ram中寫入32個數據。
RAM讀操作仿真波形圖如下圖所示:
圖 7.5.13.10 RAM讀操作波形圖
由上圖可知,ram_wea信號拉低,說明此時是對ram進行讀操作。ram_wea信號拉低之后,ram_addr從0開始增加,也就是說從ram的地址0開始讀數據;ram中讀出的數據ram_rd_data在延時一個時鐘周期之后,開始輸出數據,輸出的數據為0,1,2……,和我們寫入的值是相等的, 也就是說,我們創建的RAM IP核從仿真結果上來看是正確的。
接下來添加ILA IP核,將ram_en、ram_wea、ram_addr、ram_wr_data和ram_rd_data信號添加至觀察列表中,添加ILA IP核的方法這里不再贅述。
最后為工程添加IO管腳約束,對應的XDC約束語句如下所示:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
14.5 下載驗證
編譯工程并生成比特流.bit文件。將下載器一端連接電腦,另一端與開發板上的JTAG下載口連接,連接電源線,并打開開發板的電源開關。
點擊Vivado左側“Flow Navigator”窗口最下面的“Open Hardware Manager”,此時Vivado軟件識別到下載器,點擊“Hardware”窗口中“Progam Device”下載程序,在彈出的界面中選擇“Program”下載程序。
RAM寫操作在ILA中觀察的波形如下圖所示:
圖 7.5.13.1 RAM寫操作ILA波形圖
ram_wea信號拉高之后,地址和數據都是從0開始累加,也就說當ram地址為0時,寫入的數據也是0;當ram地址為1時,寫入的數據也是1。我們可以發現,上圖中的數據變化和在Vivado仿真的波形是一致的。
RAM讀操作在ILA中觀察的波形如下圖所示:
圖 7.5.13.2 RAM讀操作ILA波形圖
ram_wea(讀使能)信號拉低之后,ram_addr從0開始增加,也就是說從ram的地址0開始讀數據;ram中讀出的數據ram_rd_data在延時一個時鐘周期之后,開始輸出數據,輸出的數據為0,1,2……,和我們寫入的值是相等的。我們可以發現,上圖中的數據變化同樣和Vivado仿真的波形是一致的。本次實驗的IP核之RAM讀寫實驗驗證成功。
總結
以上是生活随笔為你收集整理的【正点原子MP157连载】 第十四章 IP核之RAM实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php快速计算子网掩码的前缀长度
- 下一篇: 【腾讯敏捷转型No.7】QQ邮箱如何通过