日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【正点原子FPGA连载】第十四章 IP核之RAM实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

發(fā)布時間:2023/12/20 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【正点原子FPGA连载】第十四章 IP核之RAM实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1)實(shí)驗(yàn)平臺:正點(diǎn)原子領(lǐng)航者ZYNQ開發(fā)板
2)平臺購買地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套實(shí)驗(yàn)源碼+手冊+視頻下載地址:http://www.openedv.com/thread-301505-1-1.html
4)對正點(diǎn)原子FPGA感興趣的同學(xué)可以加群討論:994244016
5)關(guān)注正點(diǎn)原子公眾號,獲取最新資料更新

第十四章 IP核之RAM實(shí)驗(yàn)

RAM的英文全稱是Random Access Memory,即隨機(jī)存取存儲器,它可以隨時把數(shù)據(jù)寫入任一指定地址的存儲單元,也可以隨時從任一指定地址中讀出數(shù)據(jù),其讀寫速度是由時鐘頻率決定的。RAM主要用來存放程序及程序執(zhí)行過程中產(chǎn)生的中間數(shù)據(jù)、運(yùn)算結(jié)果等。本章我們將對Vivado軟件生成的RAM IP核進(jìn)行讀寫測試,并向大家介紹Xilinx RAM IP核的使用方法。
本章包括以下幾個部分:
1.1 RAM IP核簡介
1.2 實(shí)驗(yàn)任務(wù)
1.3 硬件設(shè)計
1.4 程序設(shè)計
1.5 下載驗(yàn)證

1.1 RAM IP核簡介

Xilinx 7系列器件具有嵌入式存儲器結(jié)構(gòu),滿足了設(shè)計對片上存儲器的需求。嵌入式存儲器結(jié)構(gòu)由一列列BRAM(塊RAM)存儲器模塊組成,通過對這些BRAM存儲器模塊進(jìn)行配置,可以實(shí)現(xiàn)各種存儲器的功能,例如:RAM、移位寄存器、ROM以及FIFO緩沖器。
Vivado軟件自帶了BMG IP核(Block Memory Generator,塊RAM生成器),可以配置成RAM或者ROM。這兩者的區(qū)別是RAM是一種隨機(jī)存取存儲器,不僅僅可以存儲數(shù)據(jù),同時支持對存儲的數(shù)據(jù)進(jìn)行修改;而ROM是一種只讀存儲器,也就是說,在正常工作時只能讀出數(shù)據(jù),而不能寫入數(shù)據(jù)。需要注意的是,配置成RAM或者ROM使用的資源都是FPGA內(nèi)部的BRAM,只不過配置成ROM時只用到了嵌入式BRAM的讀數(shù)據(jù)端口。本章我們主要介紹通過BRAM IP核配置成RAM的使用方法。
Xilinx 7系列器件內(nèi)部的BRAM全部是真雙端口RAM(True Dual-Port ram,TDP),這兩個端口都可以獨(dú)立地對BRAM進(jìn)行讀/寫。但也可以被配置成偽雙端口RAM(Simple Dual-Port ram,SDP)(有兩個端口,但是其中一個只能讀,另一個只能寫)或單端口RAM(只有一個端口,讀/寫只能通過這一個端口來進(jìn)行)。單端口RAM只有一組數(shù)據(jù)總線、地址總線、時鐘信號以及其他控制信號,而雙端口RAM具有兩組數(shù)據(jù)總線、地址總線、時鐘信號以及其他控制信號。有關(guān)BRAM的更詳細(xì)的介紹,請讀者參閱Xilinx官方的手冊文檔“UG473,7 Series FPGAs Memory Resources User Guide”。
單端口RAM類型和雙端口RAM類型在操作上都是一樣的,我們只要學(xué)會了單端口RAM的使用,那么學(xué)習(xí)雙端口RAM的讀寫操作也是非常容易的。本章我們以配置成單端口RAM為例進(jìn)行講解。
BMG IP核配置成單端口RAM的框圖如下圖所示。

圖 7.5.13.1 單端口RAM框圖
各個端口的功能描述如下:
DINA:RAM端口A寫數(shù)據(jù)信號。
ADDRA:RAM端口A讀寫地址信號,對于單端口RAM來說,讀地址和寫地址共用同該地址線。
WEA:RAM端口A寫使能信號,高電平表示向RAM中寫入數(shù)據(jù),低電平表示從RAM中讀出數(shù)據(jù)。
ENA:端口A的使能信號,高電平表示使能端口A,低電平表示端口A被禁止,禁止后端口A上的讀寫操作都會變成無效。另外ENA信號是可選的,當(dāng)取消該使能信號后,RAM會一直處于有效狀態(tài)。
RSTA:RAM端口A復(fù)位信號,可配置成高電平或者低電平復(fù)位,該復(fù)位信號是一個可選信號。
REGCEA:RAM端口A輸出寄存器使能信號,當(dāng)REGCEA為高電平時,DOUTA保持最后一次輸出的數(shù)據(jù),REGCEA同樣是一個可選信號。
CLKA:RAM端口A的時鐘信號。
DOUTA:RAM端口A讀出的數(shù)據(jù)。
1.2 實(shí)驗(yàn)任務(wù)
本節(jié)實(shí)驗(yàn)任務(wù)是使用Xilinx BMG IP核,配置成一個單端口的RAM,然后對RAM進(jìn)行讀寫操作,通過在Vivado自帶的仿真器中觀察波形是否正確,最后將設(shè)計下載到領(lǐng)航者Zynq開發(fā)板中,并使用ILA對其進(jìn)行在線調(diào)試觀察。
1.3 硬件設(shè)計
本章實(shí)驗(yàn)只用到了輸入的時鐘信號和按鍵復(fù)位信號,沒有用到其它硬件外設(shè),各端口信號的管腳分配如下表所示:
表 14.3.1 IP核之RAM實(shí)驗(yàn)管腳分配
信號名 方向 管腳 端口說明 電平標(biāo)準(zhǔn)
sys_clk input U18 系統(tǒng)時鐘,50Mhz LVCMOS33
sys_rst_n input N16 系統(tǒng)復(fù)位,低電平有效,位于底板上 LVCMOS33
對應(yīng)的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]

1.4 程序設(shè)計
首先在Vivado軟件中創(chuàng)建一個名為ip_ram的工程,工程創(chuàng)建完成后,在Vivado軟件的左側(cè)“Flow Navigator”欄中單擊“IP Catalog”,如下圖所示。

圖 7.5.13.1 點(diǎn)擊“IP Catalog”
在“IP Catalog”窗口的搜索框中輸入“Block Memory”,出現(xiàn)唯一匹配的“Block Memory Generator”,如下圖所示(圖中出現(xiàn)的兩個IP核為同一個BMG IP核)。

圖 7.5.13.2 搜索框中輸入“Block Memory”
雙擊“Block Memory Generator”后彈出IP核的配置界面,接下來對BMG IP核進(jìn)行配置,“Basic”選項頁配置界面如下圖所示。

圖 7.5.13.3 “Basic”選項頁配置
Component Name:設(shè)置該IP核的名稱,這里保持默認(rèn)即可。
Interface Type:RAM接口總線。這里保持默認(rèn),選擇Native接口類型(標(biāo)準(zhǔn)RAM接口總線);
Memory Type:存儲器類型??膳渲贸蒘ingle 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:字節(jié)寫使能選項,勾中后可以單獨(dú)將數(shù)據(jù)的某個字節(jié)寫入RAM中,這里不使能。
Algorithm Options:算法選項??蛇x擇Minimum Area(最小面積)、Low Power(低功耗)和Fixed Primitives(固定的原語),這里選擇默認(rèn)的Minimum Area。
接下來切換至“Port A”選項頁,設(shè)置端口A的參數(shù),該頁面配置如下:

圖 7.5.13.4 “Port A Options”選項頁配置
Write Width:端口A寫數(shù)據(jù)位寬,單位Bit,這里設(shè)置成8。
Read Width:端口A讀數(shù)據(jù)位寬,一般和寫數(shù)據(jù)位寬保持一致,設(shè)置成8。
Write Depth:寫深度,這里設(shè)置成32,即RAM所能訪問的地址范圍為0-31。
Read Depth:讀深度,默認(rèn)和寫深度保持一致。
Operating Mode:RAM讀寫操作模式。共分為三種模式,分別是Write First(寫優(yōu)先模式)、Read First(讀優(yōu)先模式)和No Change(不變模式)。寫優(yōu)先模式指數(shù)據(jù)先寫入RAM中,然后在下一個時鐘輸出該數(shù)據(jù);讀優(yōu)先模式指數(shù)據(jù)先寫入RAM中,同時輸出RAM中同地址的上一次數(shù)據(jù);不變模式指讀寫分開操作,不能同時進(jìn)行讀寫,這里選擇No Change模式。
Enable Port Type:使能端口類型。Use ENA pin(添加使能端口A信號);Always Enabled(取消使能信號,端口A一直處于使能狀態(tài)),這里選擇默認(rèn)的Use ENA pin。
Port A Optional Output Register:端口A輸出寄存器選項。其中“Primitives Output Register”默認(rèn)是選中狀態(tài),作用是打開BRAM內(nèi)部位于輸出數(shù)據(jù)總線之后的輸出流水線寄存器,雖然在一般設(shè)計中為了改善時序性能會保持此選項的默認(rèn)勾選狀態(tài),但是這會使得BRAM輸出的數(shù)據(jù)延遲一拍,這不利于我們在Vivado的ILA調(diào)試窗口中直觀清晰地觀察信號;而且在本實(shí)驗(yàn)中我們僅僅是把BRAM的數(shù)據(jù)輸出總線連接到了ILA的探針端口上來進(jìn)行觀察,除此之外數(shù)據(jù)輸出總線沒有別的負(fù)載,不會帶來難以滿足的時序路徑,因此這里取消勾選。
Port A Output Reset Options:RAM復(fù)位信號選項,這里不添加復(fù)位信號,保持默認(rèn)即可。
另外,需要注意的是,下面的“Primitives Output Register”默認(rèn)是選中狀態(tài)的,此選項的作用是打開塊RAM內(nèi)部的位于輸出數(shù)據(jù)總線之后的輸出流水線寄存器,雖然在一般設(shè)計中為了改善時序性能會保持此選項的默認(rèn)勾選狀態(tài),但是這會使得塊RAM輸出的數(shù)據(jù)延遲一拍,這不利于我們在Vivado的ILA調(diào)試窗口中直觀清晰地觀察信號;而且在本實(shí)驗(yàn)中我們僅僅是把塊RAM的數(shù)據(jù)輸出總線連接到了ILA的探針端口上來進(jìn)行觀察,除此之外數(shù)據(jù)輸出總線沒有別的負(fù)載,不會帶來難以滿足的時序路徑。
接下來的“Other Options”選項頁用于設(shè)置RAM的初始值等,本次實(shí)驗(yàn)不需要設(shè)置,直接保持默認(rèn)即可。
最后一個是“Summary”選項頁,該頁面顯示了存儲器的類型,消耗的BRAM資源等,我們直接點(diǎn)擊“OK”按鈕完成BMG IP核的配置,如下圖所示:

圖 7.5.13.5 “Summary”選項頁
接下來會彈出詢問是否在工程目錄下創(chuàng)建存放IP核的文件,我們點(diǎn)擊“OK”按鈕即可。
緊接著會彈出“Genarate Output Products”窗口,我們直接點(diǎn)擊“Generate”,如下圖所示。

圖 7.5.13.6 “Genarate Output Products”窗口
之后我們就可以在“Design Run”窗口的“Out-of-Context Module Runs”一欄中出現(xiàn)了該IP核對應(yīng)的run“blk_mem_gen_0_synth_1”,其綜合過程獨(dú)立于頂層設(shè)計的綜合,所以在我們可以看到其正在綜合,如下圖所示。

圖 7.5.13.7 “blk_mem_gen_0_synth_1”run
在其Out-of-Context綜合的過程中,我們就可以進(jìn)行RTL編碼了。首先打開IP核的例化模板,在“Source”窗口中的“IP Sources”選項卡中,依次用鼠標(biāo)單擊展開“IP”-“blk_mem_gen_0”-“Instantitation Template”,我們可以看到“blk_mem_gen_0.veo”文件,它是由IP核自動生成的只讀的verilog例化模板文件,雙擊就可以打開它,如下圖所示。

圖 7.5.13.8 “blk_mem_gen_0.veo”文件
接下來我們創(chuàng)建一個新的設(shè)計文件,命名為ram_rw.v,代碼如下:

1 module ram_rw( 2 input clk , //時鐘信號 3 input rst_n , //復(fù)位信號,低電平有效 4 5 output ram_en , //ram使能信號 6 output ram_wea , //ram讀寫選擇 7 output reg [4:0] ram_addr , //ram讀寫地址 8 output reg [7:0] ram_wr_data, //ram寫數(shù)據(jù) 9 input [7:0] ram_rd_data //ram讀數(shù)據(jù) 10 ); 11 12 //reg define 13 reg [5:0] rw_cnt ; //讀寫控制計數(shù)器 14 15 //***************************************************** 16 //** main code 17 //***************************************************** 18 19 //控制RAM使能信號 20 assign ram_en = rst_n; 21 //rw_cnt計數(shù)范圍在0~31,寫入數(shù)據(jù);32~63時,讀出數(shù)據(jù) 22 assign ram_wea = (rw_cnt <= 6'd31 && ram_en == 1'b1) ? 1'b1 : 1'b0; 23 24 //讀寫控制計數(shù)器,計數(shù)器范圍0~63 25 always @(posedge clk or negedge rst_n) begin 26 if(rst_n == 1'b0) 27 rw_cnt <= 1'b0; 28 else if(rw_cnt == 6'd63) 29 rw_cnt <= 1'b0; 30 else 31 rw_cnt <= rw_cnt + 1'b1; 32 end 33 34 //產(chǎn)生RAM寫數(shù)據(jù) 35 always @(posedge clk or negedge rst_n) begin 36 if(rst_n == 1'b0) 37 ram_wr_data <= 1'b0; 38 else if(rw_cnt <= 6'd31) //在計數(shù)器的0-31范圍內(nèi),RAM寫地址累加 39 ram_wr_data <= ram_wr_data + 1'b1; 40 else 41 ram_wr_data <= 1'b0 ; 42 end 43 44 //讀寫地址信號 范圍:0~31 45 always @(posedge clk or negedge rst_n) begin 46 if(rst_n == 1'b0) 47 ram_addr <= 1'b0; 48 else if(ram_addr == 5'd31) 49 ram_addr <= 1'b0; 50 else 51 ram_addr <= ram_addr + 1'b1; 52 end 53 63 endmodule

模塊中定義了一個讀寫控制計數(shù)器(rw_cnt),當(dāng)計數(shù)范圍在031之間時,向ram中寫入數(shù)據(jù);當(dāng)計數(shù)范圍在3263之間時,從ram中讀出數(shù)據(jù)。
接下來我們設(shè)計一個verilog文件來實(shí)例化創(chuàng)建的RAM IP核以及ram_rw模塊,文件名為ip_ram.v, 編寫的verilog代碼如下。

1 module ip_ram( 2 input sys_clk , //系統(tǒng)時鐘 3 input sys_rst_n //系統(tǒng)復(fù)位,低電平有效 4 ); 5 6 //wire define 7 wire ram_en ; //RAM使能 8 wire ram_wea ; //ram讀寫使能信號,高電平寫入,低電平讀出 9 wire [4:0] ram_addr ; //ram讀寫地址 10 wire [7:0] ram_wr_data ; //ram寫數(shù)據(jù) 11 wire [7:0] ram_rd_data ; //ram讀數(shù)據(jù) 12 13 //***************************************************** 14 //** main code 15 //***************************************************** 16 17 //ram讀寫模塊 18 ram_rw u_ram_rw( 19 .clk (sys_clk ), 20 .rst_n (sys_rst_n ), 21 //RAM 22 .ram_en (ram_en ), 23 .ram_wea (ram_wea ), 24 .ram_addr (ram_addr ), 25 .ram_wr_data (ram_wr_data ), 26 .ram_rd_data (ram_rd_data ) 27 ); 28 29 //ram ip核 30 blk_mem_gen_0 blk_mem_gen_0 ( 31 .clka (sys_clk ), // input wire clka 32 .ena (ram_en ), // input wire ena 33 .wea (ram_wea ), // input wire [0 : 0] wea 34 .addra (ram_addr ), // input wire [4 : 0] addra 35 .dina (ram_wr_data ), // input wire [7 : 0] dina 36 .douta (ram_rd_data ) // output wire [7 : 0] douta 37 ); 38 39 endmodule

程序中例化了ram_rw模塊和ram IP核blk_mem_gen_0,其中ram_rw模塊負(fù)責(zé)產(chǎn)生對ram IP核讀/寫所需的所有數(shù)據(jù)、地址以和讀寫使能信號,同時從ram IP讀出的數(shù)據(jù)也連接至ram_rw模塊。
接下來對RAM IP核進(jìn)行仿真,來驗(yàn)證對RAM的讀寫操作是否正確。tb_ip_ram仿真文件源代碼如下:

1 `timescale 1ns / 1ps 2 3 module tb_ip_ram(); 4 5 reg sys_clk; 6 reg sys_rst_n; 7 8 always #10 sys_clk = ~sys_clk; 9 10 initial begin 11 sys_clk = 1'b0; 12 sys_rst_n = 1'b0; 13 #200 14 sys_rst_n = 1'b1; 15 end 16 17 ip_ram u_ip_ram( 18 .sys_clk (sys_clk ), 19 .sys_rst_n (sys_rst_n ) 20 ); 21 22 endmodule

接下來就可以開始仿真了,仿真過程這里不再贅述,仿真波形圖如下圖所示。

圖 7.5.13.9 RAM寫操作波形圖
圖 7.5.13.9為RAM的寫操作仿真波形圖,由上圖可知,ram_wea信號拉高,說明此時是對ram進(jìn)行寫操作。ram_wea信號拉高之后,地址和數(shù)據(jù)都是從0開始累加,也就說當(dāng)ram地址為0時,寫入的數(shù)據(jù)也是0;當(dāng)ram地址為1時,寫入的數(shù)據(jù)也是1,我們總共向ram中寫入32個數(shù)據(jù)。
RAM讀操作仿真波形圖如下圖所示:

圖 7.5.13.10 RAM讀操作波形圖
由上圖可知,ram_wea信號拉低,說明此時是對ram進(jìn)行讀操作。ram_wea信號拉低之后,ram_addr從0開始增加,也就是說從ram的地址0開始讀數(shù)據(jù);ram中讀出的數(shù)據(jù)ram_rd_data在延時一個時鐘周期之后,開始輸出數(shù)據(jù),輸出的數(shù)據(jù)為0,1,2……,和我們寫入的值是相等的, 也就是說,我們創(chuàng)建的RAM IP核從仿真結(jié)果上來看是正確的。
接下來添加ILA IP核,將ram_en、ram_wea、ram_addr、ram_wr_data和ram_rd_data信號添加至觀察列表中,添加ILA IP核的方法這里不再贅述。
最后為工程添加IO管腳約束,對應(yīng)的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]

1.5 下載驗(yàn)證
編譯工程并生成比特流.bit文件。將下載器一端連接電腦,另一端與開發(fā)板上的JTAG下載口連接,連接電源線,并打開開發(fā)板的電源開關(guān)。
點(diǎn)擊Vivado左側(cè)“Flow Navigator”窗口最下面的“Open Hardware Manager”,此時Vivado軟件識別到下載器,點(diǎn)擊“Hardware”窗口中“Progam Device”下載程序,在彈出的界面中選擇“Program”下載程序。
RAM寫操作在ILA中觀察的波形如下圖所示:

圖 7.5.13.1 RAM寫操作ILA波形圖
ram_wea信號拉高之后,地址和數(shù)據(jù)都是從0開始累加,也就說當(dāng)ram地址為0時,寫入的數(shù)據(jù)也是0;當(dāng)ram地址為1時,寫入的數(shù)據(jù)也是1。我們可以發(fā)現(xiàn),上圖中的數(shù)據(jù)變化和在Vivado仿真的波形是一致的。
RAM讀操作在ILA中觀察的波形如下圖所示:

圖 7.5.13.2 RAM讀操作ILA波形圖
ram_wea(讀使能)信號拉低之后,ram_addr從0開始增加,也就是說從ram的地址0開始讀數(shù)據(jù);ram中讀出的數(shù)據(jù)ram_rd_data在延時一個時鐘周期之后,開始輸出數(shù)據(jù),輸出的數(shù)據(jù)為0,1,2……,和我們寫入的值是相等的。我們可以發(fā)現(xiàn),上圖中的數(shù)據(jù)變化同樣和Vivado仿真的波形是一致的。本次實(shí)驗(yàn)的IP核之RAM讀寫實(shí)驗(yàn)驗(yàn)證成功。

總結(jié)

以上是生活随笔為你收集整理的【正点原子FPGA连载】第十四章 IP核之RAM实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。