前言
FPGA本身是SRAM架構(gòu)的,斷電之后程序就會消失,那么如何利用FPGA實現(xiàn)一個ROM呢,我們可以利用FPGA內(nèi)部的RAM資源實現(xiàn)ROM,但這不是真正意義上的ROM,而是每次上電都會把初始化的值先寫入RAM。Vivado軟件中提供了ROM的IP核 , 我們只需通過IP核例化一個ROM,根據(jù)ROM的讀時序來讀取ROM中存儲的數(shù)據(jù)。本實驗將介紹如何使用FPGA內(nèi)部的ROM以及程序?qū)υ揜OM的數(shù)據(jù)讀操作。該實驗與ZYNQ之FPGA 片內(nèi)RAM讀寫測試實驗操作類似,可以參考。
一、創(chuàng)建ROM初始化文件
對于ROM,我們需要提前準(zhǔn)備好數(shù)據(jù),這樣在FPGA 實際運(yùn)行時,就可以直接讀取這些ROM中預(yù)存好的數(shù)據(jù)了。Xilinx FPGA 的片內(nèi)ROM支持初始化數(shù)據(jù)配置,我們可以創(chuàng)建一個后綴名為“.coe”的ROM初始化文件。
首先創(chuàng)建一個名為rom_test的文件夾。
然后在該文件夾下新建一個文本文檔,將其后綴名改為“.coe”,我這里給文件命名為rom_init.coe。rom_init.coe文件中的內(nèi)容如下。
//該代碼來自正點原子
MEMORY_INITIALIZATION_RADIX=16; //表示ROM內(nèi)容的數(shù)據(jù)格式是16進(jìn)制
MEMORY_INITIALIZATION_VECTOR=
11,
22,
33,
44,
55,
66,
77,
88,
99,
aa,
bb,
cc,
dd,
ee,
ff,
00,
a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
b1,
b2,
b3,
b4,
b5,
b6,
b7,
b8; //每個數(shù)據(jù)后面用逗號或者空格或者換行符隔開,最后一個數(shù)據(jù)后面加分號
ROM初始化文件的內(nèi)容格式比較簡單,其中,第1行為定義的數(shù)據(jù)格式,第3行到第34行是這個 32*8bit 大小ROM的初始化數(shù)據(jù),每行數(shù)字后面用逗號,最后一行數(shù)字結(jié)束時用分號。
二、添加ROM IP核
先新建一個名為rom_test的Vivado工程,具體的步驟可以參見:Vivado軟件的使用——以led的交替閃爍為例。
新工程到下圖所示的界面后點擊Finish即可完成工程的創(chuàng)建。
接著在工程中添加ROM IP,步驟為依次按照下圖中的序號找到Block Memory Generator雙擊打開。
在彈出的對話框中的Basic下修改Component Name為rom_ip,修改Memory Type為Single Port ROM。
在Port A Options下按照下圖中的序號依次修改。
把Primitives Output Register取消勾選,其功能是在輸出數(shù)據(jù)上加寄存器,這可以有效改善時序 ,但讀出的數(shù)據(jù)會落后地址兩個周期,因此在很多情況下,不用這項功能,保持讀出的數(shù)據(jù)落后地址一個周期即可。
在Other Options下勾選Load Init File,然后點擊Browse查找第一步中創(chuàng)建好的文件rom_init.coe。
按照下圖中序號依次選擇到ROM的初始化文件。
可以看到該文件已經(jīng)添加成功了,點擊OK即可。
在彈出的對話框中點擊Generate就可以生成ROM IP。
三、編寫測試程序
ROM的程序設(shè)計非常簡單,在程序中我們只要每個時鐘改變ROM的地址,ROM就會輸出當(dāng)前地址的內(nèi)部存儲數(shù)據(jù) ,例化ILA,用于觀察地址和數(shù)據(jù)的變化。
新建名為rom_test的Verilog文件,依次按照下圖中標(biāo)注的序號進(jìn)行即可。
在新建好的rom_test.v中寫入如下代碼。
//該代碼來自正點原子
`timescale 1ns / 1ps
module rom_test(
input sys_clk, //50MHz時鐘
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 or negedge rst_n)
begin
if(!rst_n)
rom_addr <= 10'd0;
else
rom_addr <= rom_addr+1'b1;
end
//實例化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
);
//實例化邏輯分析儀
ila_0 ila_m0
(
.clk (sys_clk),
.probe0 (rom_addr),
.probe1 (rom_data)
);
endmodule
其中實例化ROM部分的代碼來自rom_ip中的rom_ip.veo文件,不過需要將括號內(nèi)的參數(shù)做一修改。
四、添加ILA
我們還需要添加ILA,其添加過程可參見:使用Vivado軟件進(jìn)行硬件調(diào)試。
探針的數(shù)量這里設(shè)置為2,即rom_addr和rom_data兩個探針。
這里每個探針的位數(shù)按照代碼中的分配,rom_addr是5位,rom_data是8位。
對應(yīng)的代碼如下。
wire [7:0] rom_data; //ROM讀出數(shù)據(jù)
reg [4:0] rom_addr; //ROM輸入地址
在彈出的對話框中點擊Generate即可。
實例化ILA邏輯分析儀部分的代碼來自ila_0中的ila_0.veo文件,不過需要將括號內(nèi)的參數(shù)做一修改。
五、分配管腳
本實驗中需要分配管腳的只有時鐘信號clk(管腳為U18)和復(fù)位信號rst_n(管腳為N15),按照下圖中的數(shù)字順序即可完成管腳的分配。
管腳分配完成后Ctrl+S保存,名稱與工程名保持一致。
管腳分配的信息在rom_test.xdc文件中。
六、Simulator仿真
Simulator仿真創(chuàng)建文件的過程可參見:Vivado中Simulator仿真軟件的使用。
右擊Simulation Sources選擇Add Source按照下圖中序號依次新建TB文件。
在tb_rom_test.v文件中寫入如下代碼。
//該代碼來自正點原子
`timescale 1ns / 1ps
module vtf_rom_tb;
// Inputs
reg sys_clk;
reg rst_n;
// Instantiate the Unit Under Test (UUT)
rom_test uut (
.sys_clk (sys_clk),
.rst_n (rst_n)
);
initial
begin
// Initialize Inputs
sys_clk = 0;
rst_n = 0;
// Wait 100 ns for global reset to finish
#100;
rst_n = 1;
end
always #10 sys_clk = ~ sys_clk; //20ns一個周期,產(chǎn)生50MHz時鐘源
endmodule
保存代碼后選擇SIMULATION下的Run Simulation,選擇第一個行為仿真。
將所有代碼中定義的信號拖入到波形仿真窗口,設(shè)置仿真時間為1000ns,運(yùn)行后結(jié)果如下圖所示。
由上圖可知,該仿真結(jié)果與RAM讀取數(shù)據(jù)一樣,數(shù)據(jù)滯后于地址一個周期。
七、硬件調(diào)試
連接開發(fā)板,點擊Generate Bitstream生成比特流文件,并將其下載到開發(fā)板上。
下載后彈出如下窗口,設(shè)置rom_addr的初始數(shù)值為00,然后點擊運(yùn)行按鈕,得到如下波形,將游標(biāo)移動到紅線所在位置并放大得到下圖。
由上圖可以知道,硬件調(diào)試的結(jié)果與仿真的結(jié)果一致。文章來源:http://www.zghlxwxcb.cn/news/detail-466954.html
總結(jié)
以上就是ZYNQ之FPGA 片內(nèi)ROM讀寫測試實驗的所有內(nèi)容了,該實驗過程與ZYNQ之FPGA 片內(nèi)RAM讀寫測試實驗非常相似,大的不同就是該實驗需要創(chuàng)建ROM初始化文件,然后在添加ROM IP核時選上該文件。
本文參考資料:正點原子–course_s1_ZYNQ那些事兒-FPGA實驗篇V1.06.pdf文章來源地址http://www.zghlxwxcb.cn/news/detail-466954.html
到了這里,關(guān)于ZYNQ之FPGA 片內(nèi)ROM讀寫測試實驗的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!