設計背景:
ROM是只讀存儲器(Read-Only Memory)的簡稱,是一種只能讀出事先所存數據的固態半導體存儲器。其特性是一旦儲存資料就無法再將之改變或刪除。通常用在不需經常變更資料的電子或電腦系統中,并且資料不會因為電源關閉而消失。
ROM是由英文Read only Memory的首字母構成的,意為只讀存儲器。顧名思義,就是這樣的存儲器只能讀,不能像RAM一樣可以隨時讀和寫。它只允許在生產出來之后有一次寫的機會,數據一旦寫入則不可更改。它另外一個特點是存儲器掉電后里面的數據不丟失,可以存放成百上千年。此類存儲器多用來存放固件,比如計算機啟動的引導程序,手機、MP3、MP4、數碼相機等一些電子產品的相應的程序代碼。
設計原理:
我們的設計是讀ROM的數據,然后讀到最后一個數據的時候,然后又從最后的地址往回讀數據,來實現循環讀數。
首先我們先創建一個.mif文件,然后給對應的地址中寫如數據,然后設計一個IP核,之后通過讀ROM的地址,來讀出ROM中存在的數據,具體的操作如下面的操作。
下一步,建立一個深度256,位寬為8的 .mif。
然后在第一個地址右鍵。
填寫開始地址以及結束地址,我們給每一位的地址位寫上和地址一樣的數據,那么就是數據從0開始,步進為1,如下,然后然后完成,保存。
這樣我們寫好我們.mif文件,然后進行下面的步驟。
選擇我們所選的硬件描述語言,我們都是verilog HDL,然后選擇我們文件生成的路徑,下一步。
設置我們的輸出的位寬,和深度,我們的深度256,位寬8,下一步。
去掉輸出是否有寄存器的對勾,如果選了輸出會晚一拍,因為加了一個輸出寄存器。
然后出現下面的界面,點擊,選擇我們生成的.mif文件,添加進來,然后下一步,下一步完成。
設計架構圖:
設計代碼:
頂層模塊
0modulerom(clk,rst_n,data);
1 inputclk;
2 inputrst_n;
3
4 output[7:0]data;
5
6 wire[7:0]address;
7
8 rom_r rom_r ( //例化ROM控制器模塊
9 .clk(clk),
10 .rst_n(rst_n),
11 .address(address)
12 );
13
14 my_rom my_rom_inst (//例化IP核模塊
15 .address (address ),
16 .clock (clk ),
17 .q (data )
18 );
19
20endmodule
設計模塊
0modulerom_r(clk,rst_n,address);
1
2 inputclk;
3 inputrst_n;
4
5 outputreg[7:0]address;
6
7 reg[1:0]state;
8 always@(posedgeclk ornegedgerst_n)
9 if(!rst_n)
10 begin
11 address <=?1'b0;
12 state <=?1'b0;
13 end
14 else
15 begin
16 case(state)
17 0:begin
18 if(address 255)????//判斷地址
19 begin
20 address <=?address +?1'b1;?//地址激增
21 end
22 else
23 begin
24 if(address ==255)//判斷是否讀完
25 begin
26 address <=?address -?1'b1;?
27 state <=?1;
28 end
29
30 end
31 end
32 1:begin
33 if(address >0)//讀完就跳轉一狀態后讓地址減1
34 begin
35 address <=?address -?1'b1;
36 end
37 else
38 begin
39 address <=?address +?1'b1;
40 state <=?0;
41 end
42 end
43 default:state <=?0;
44 endcase
45 end
46endmodule
測試模塊
0`timescale1ns/1ps
1
2modulerom_tb();
3
4 regclk;
5 regrst_n;
6
7 wire[7:0]data;
8
9 initialbegin
10 clk =1'b1;
11 rst_n =1'b0;
12
13 #100.1rst_n =1'b1;
14
15 #20000$stop;//20000NS后停止仿真
16
17 end
18
19 always#10clk =~clk;//產生50M時鐘
20
21 rom rom_dut ( //例化頂層模塊
22 .clk(clk),
23 .rst_n(rst_n),
24 .data(data)
25 );
26endmodule
仿真圖:
仿真中我們可以看到和我們的設計一樣,我們先從0地址讀數據,當讀到最后一個數后,然后返回來從最后一個地址開始讀數。
-
FPGA
+關注
關注
1630文章
21781瀏覽量
604936
發布評論請先 登錄
相關推薦
評論