作者: ALINX
適用于板卡型號(hào):
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG
實(shí)驗(yàn)Vivado工程為“rom_test”
FPGA本身是SRAM架構(gòu)的,斷電之后,程序就消失,那么如何利用FPGA實(shí)現(xiàn)一個(gè)ROM呢,我們可以利用FPGA內(nèi)部的RAM資源實(shí)現(xiàn)ROM,但不是真正意義上的ROM,而是每次上電都會(huì)把初始化的值先寫入RAM。本實(shí)驗(yàn)將為大家介紹如何使用FPGA內(nèi)部的ROM以及程序?qū)υ揜OM的數(shù)據(jù)讀操作。
1.實(shí)驗(yàn)原理
Xilinx在VIVADO里為我們已經(jīng)提供了ROM的IP核, 我們只需通過IP核例化一個(gè)ROM,根據(jù)ROM的讀時(shí)序來讀取ROM中存儲(chǔ)的數(shù)據(jù)。實(shí)驗(yàn)中會(huì)通過VIVADO集成的在線邏輯分析儀ila,我們可以觀察ROM的讀時(shí)序和從ROM中讀取的數(shù)據(jù)。
2. 程序設(shè)計(jì)
2.1 創(chuàng)建ROM初始化文件
既然是ROM,那么我們就必須提前給它準(zhǔn)備好數(shù)據(jù),然后在FPGA實(shí)際運(yùn)行時(shí),我們直接讀取這些ROM中預(yù)存儲(chǔ)好的數(shù)據(jù)就行。Xilinx FPGA的片內(nèi)ROM支持初始化數(shù)據(jù)配置。如下圖所示,我們可以創(chuàng)建一個(gè)名為rom_init.coe的文件,注意后綴一定是“.coe”,前面的名稱當(dāng)然可以隨意起。

ROM初始化文件的內(nèi)容格式很簡(jiǎn)單, 如下圖所示。第一行為定義數(shù)據(jù)格式, 16代表ROM的數(shù)據(jù)格式為16進(jìn)制。從第3行開始到第34行,是這個(gè)32*8bit大小ROM的初始化數(shù)據(jù)。每行數(shù)字后面用逗號(hào),最后一行數(shù)字結(jié)束用分號(hào)。

rom_init.coe編寫完成后保存一下, 接下去我們開始設(shè)計(jì)和配置ROM IP核。
2.2 添加ROM IP核
在添加ROM IP之前先新建一個(gè)rom_test的工程, 然后在工程中添加ROM IP,方法如下:
2.2.1 點(diǎn)擊下圖中IP Catalog,在右側(cè)彈出的界面中搜索rom,找到Block Memory Generator,雙擊打開。

2.2.2 將Component Name改為rom_ip,在Basic欄目下,將Memory Type改為Single Prot ROM。

2.2.3 切換到Port A Options欄目下,將ROM位寬Port A Width改為8,將ROM深度Port A Depth改為32,使能管腳Enable Port Type改為Always,并取消Primitives Output Register

2.2.4 切換到Other Options欄目下,勾選Load Init File,點(diǎn)擊Browse,選中之前制作好的.coe文件。

2.2.5 點(diǎn)擊ok,點(diǎn)擊Generate生成ip核。

3. ROM測(cè)試程序編寫
ROM的程序設(shè)計(jì)非常簡(jiǎn)單, 在程序中我們只要每個(gè)時(shí)鐘改變ROM的地址, ROM就會(huì)輸出當(dāng)前地址的內(nèi)部存儲(chǔ)數(shù)據(jù),例化ila,用于觀察地址和數(shù)據(jù)的變化。ROM IP的實(shí)例化及程序設(shè)計(jì)如下:
`timescale1ns/1ps module rom_test( input sys_clk, //25MHz時(shí)鐘 input rst_n //復(fù)位,低電平有效 ); wire[7:0] rom_data; //ROM讀出數(shù)據(jù) reg [4:0] rom_addr;//ROM輸入地址 //產(chǎn)生ROM地址讀取數(shù)據(jù) always@(posedge sys_clk ornegedge rst_n) begin if(!rst_n) rom_addr <=10'd0; else rom_addr <= rom_addr+1'b1; end //實(shí)例化ROM rom_ip rom_ip_inst ( .clka (sys_clk ),//inoput clka .addra (rom_addr ),//input [4:0] addra .douta (rom_data )//output [7:0] douta ); //實(shí)例化邏輯分析儀 ila_0 ila_m0 ( .clk (sys_clk), .probe0 (rom_addr), .probe1 (rom_data) ); endmodule
綁定引腳
##################Compress Bitstream############################
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property PACKAGE_PIN AB11 [get_ports sys_clk]set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]create_clock -period 40.000 -name sys_clk -waveform {0.000 20.000} [get_ports sys_clk]set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]set_property PACKAGE_PIN W13 [get_ports {rst_n}]
4. 仿真
仿真結(jié)果如下,符合預(yù)期,與RAM的讀取數(shù)據(jù)一樣,數(shù)據(jù)也是滯后于地址一個(gè)周期。
5. 板上驗(yàn)證
以地址0為觸發(fā)條件,可以看到讀取的數(shù)據(jù)與仿真一致。
審核編輯:何安
-
FPGA
+關(guān)注
關(guān)注
1660文章
22408瀏覽量
636233
發(fā)布評(píng)論請(qǐng)先 登錄
詳細(xì)解釋Keil-MDK中Code、RO-data、RW-data、ZI-data的含義
單片機(jī)里的程序運(yùn)行方式
ram ip核的使用
中微愛芯2K FLASH ROM的AD型8位微控制器代理供應(yīng)
【RK3568+PG2L50H開發(fā)板實(shí)驗(yàn)例程】FPGA部分 | ROM、RAM、FIFO 的使用
Simcenter FLOEFD BCI-ROM和Package Creator模塊
LMK03318如何使用TICS將程序燒錄進(jìn)ROM?
基于FPGA搭建神經(jīng)網(wǎng)絡(luò)的步驟解析
Simcenter Flotherm BCI-ROM技術(shù):與邊界條件無關(guān)的降階模型可加速電子熱設(shè)計(jì)
飛凌嵌入式ElfBoard ELF 1板卡-uboot啟動(dòng)流程分析之boot ROM階段
求助,關(guān)于FX3 ROM引導(dǎo)加載程序系統(tǒng)重啟問題求解
7路達(dá)林頓驅(qū)動(dòng)的16KB Flash ROM的AD型MCU AiP8F3201
具有小容量ROM/低引腳數(shù)系列和內(nèi)置USB 2.0的32位微控制器RX111系列數(shù)據(jù)手冊(cè)
如何使用FPGA內(nèi)部的ROM以及程序?qū)υ揜OM的數(shù)據(jù)讀操作
評(píng)論