本次設計的工具和源碼在:http://download.csdn.net/detail/noticeable/9914766
課程目的:調用quartus II提供的rom(read only memory)進行系統項目設計
實驗現象:將一組固定的波形數據以MIF的格式存儲於fpga中使用IP核構建的片上ROM中,開發板上電后,系統從ROM 中讀取數據,並將數據通過I/O口輸出,使用signal TAP II取I/O口輸出的數據,即可得到三角波形;並通過quartus II提供的in system memory content editor 工具在線更改ROM 中的數據,然后再次通過signal TAP II將更改后的波形讀取出來。
知識點:1、mif文件的生成方法2、ROM IP核的使用。3、In-system memory content editor 內存查看工具的使用。4、signalTap II 調試工具的簡單使用
開發流程:
首先,自己創建對應波形的mif文件,以便后面調用rom IP核的時候使用

可以自己創建一個文本,然后在文件中輸入自己想自己想要顯示的波形的數據再保存,但是這樣設計使得設計過於繁瑣,這里推薦使用軟件mif_maker2010直接生成.mif文件(軟件在源碼壓縮包中)
打開軟件

設置全局參數

本次設計為256個數據長度8位位寬

選擇期望生成的波形,保存即可得到相應波形對應參數的mif文件。

新建工程,調用rom ip核



之后直接next到finish即完成生成rom文件了。
將IP核設置為頂層文件
然后編寫IP核的testbench文件
`timescale 1ns/1ns `define clock_period 20 module rom_tb; reg [7:0]addr; reg clk; wire [7:0]q; rom rom ( .address(addr), .clock(clk), .q(q)); initial clk=1; always#(`clock_period/2) clk=~clk; integer i; initial begin addr=0; for(i=0;i<=2550;i=i+1)begin #`clock_period; addr=addr+1; end #(`clock_period*50); $stop; end endmodule
設定仿真路徑進行仿真,可以看到q成功的將mif文件提取出來了,並通過仿真加強對romIP核的理解

選中q,右鍵修改顯示格式,即可看到仿真出來的模擬的鋸齒波形。


將mif未見改為正弦波的mif文件觀察
此時發現波形有斷層

這是因為選擇的顯示格式為無符號的,將格式改為有符號的即可


在這里,波形發生器的仿真設計已經完成了(對於控制頻率,其實就是一個控制地址變化的方式)。
新建一個rom_top文件,將其設置為頂層文件,其目的是設計地址發生模塊:
module rom_top(clk, rst_n, q ); input clk; input rst_n; output [7:0]q; reg [7:0]addr; rom rom_1 ( .address(addr), .clock(clk), .q(q)); always@(posedge clk or negedge rst_n) if(!rst_n) addr<=0; else addr<=addr+1; endmodule
下面為了使in system memory content editor 工具在線修改ROM中的數據,需要對IP核進行設置

對引腳進行分配,其中q[0]~q[7]對應開發板上GOIP09~GPIO2

全編譯后,通過FPGA內部搭建一個片上的邏輯分析儀,抓取rom里的文件:
新建一個signal tap II logic analyzer file文件






保存在工程目錄下

將邏輯分析儀工具添加到工程文件夾中,對工程進行全編譯

將工程生成的.sof文件下載到FPGA開發板中,進行板級驗證,燒寫完成后打開logic.stp文件



即可看到成功顯示的正弦波波形了

下面通過in system memory content editor 工具對rom 內容進行更改





可以看到signalTap II logic analyzer中顯示的波形變為了鋸齒波了。

至此,整個設計就完成了
