設(shè)計(jì)背景:
隨機(jī)存取存儲(chǔ)器(random access memory,RAM)又稱作"隨機(jī)存儲(chǔ)器",是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲(chǔ)器,也叫主存(內(nèi)存)。它可以隨時(shí)讀寫,而且速度很快,通常作為操作系統(tǒng)或其他正在運(yùn)行中的程序的臨時(shí)數(shù)據(jù)存儲(chǔ)媒介。
存儲(chǔ)單元的內(nèi)容可按需隨意取出或存入,且存取的速度與存儲(chǔ)單元的位置無關(guān)的存儲(chǔ)器。這種存儲(chǔ)器在斷電時(shí)將丟失其存儲(chǔ)內(nèi)容,故主要用于存儲(chǔ)短時(shí)間使用的程序。 按照存儲(chǔ)單元的工作原理,隨機(jī)存儲(chǔ)器又分為靜態(tài)隨機(jī)存儲(chǔ)器(英文:Static RAM,SRAM)和動(dòng)態(tài)隨機(jī)存儲(chǔ)器(英文Dynamic RAM,DRAM)。
設(shè)計(jì)原理:
本次設(shè)計(jì)我們通過調(diào)用我們的RAM的IP核來給它寫我們的控制器,來實(shí)現(xiàn)RAM的可讀可寫的特點(diǎn)。
我們?cè)O(shè)計(jì)的是RAM的深度為256,我們先寫256個(gè)數(shù),然后再讀出我們寫的256個(gè)數(shù)。值得一說的是,我們的讀寫標(biāo)志是高位為寫標(biāo)志,低位為讀標(biāo)志。
設(shè)計(jì)步驟,打開我么的調(diào)用IP核的界面,然后下一步:
在下面的選項(xiàng)中選出我們RAM,如圖所示,然后起一個(gè)我們的輸出名,然后下一步:
在下面的頁面中我們?cè)O(shè)置我們的位寬和深度,然后設(shè)置如下,下一步:
下面的頁面中,問我們?cè)O(shè)置不設(shè)置我們的輸出寄存器,我們不要設(shè)置,如下,然后下一步:
然后下一步,下一步,直接到下面的界面,選擇生成.inst文件,然后完成。
設(shè)計(jì)架構(gòu)圖:
設(shè)計(jì)代碼:
頂層模塊
0moduleram(clk ,rst_n ,q); //輸入輸出端口設(shè)置
1 inputclk;
2 inputrst_n;
3
4 output[7:0]q;
5
6 wire[7:0]data;
7 wirewren;
8 wire[7:0]address;
9
10 ram_contl ram_contl( //例化我們的RAM控制器
11 .clk(clk),
12 .rst_n(rst_n),
13 .data(data),
14 .wren(wren),
15 .address(address)
16 );
17 my_ram my_ram_inst ( //例化ip核
18 .address (address),
19 .clock (clk),
20 .data (data),
21 .wren (wren ),
22 .q (q)
23 );
24endmodule
設(shè)計(jì)模塊
0moduleram_contl(clk,rst_n,data,wren,address);
1 inputclk;
2 inputrst_n;
3
4 outputreg[7:0]data; //輸出
5 outputregwren; //讀寫位
6 outputreg[7:0]address; //地址位
7
8 regstate;
9 always@(posedgeclk ornegedgerst_n)
10 if(!rst_n)
11 begin
12 data <=8'b0;
13 wren <=1'b0;
14 address <=8'b0;
15 state <=1'b0;
16 end
17 else
18 begin
19 case(state)
20 0:begin
21 wren <=1'b1; //打開寫使能,寫我們的數(shù)據(jù)
22 if(address <255)
23 begin
24 address <=address +1'b1;//地址加一,
25 data <=data +1'b1;//數(shù)據(jù)加一
26 end
27 else
28 begin
29 address <=1'b0; //寫完后打開讀
30 data <=1'b0;
31 state <=1;
32 wren <=1'b0;
33 end
34 end
35 1:begin
36 if(address <255) //讀出我們的數(shù)據(jù)
37 begin
38 address <=address +1'b1;
39 end
40 else
41 begin
42 address <=1'b0;
43 state <=0;
44 end
45 end
46 default:state <=0;
47 endcase
48 end
49endmodule
測試模塊
0`timescale1ns/1ps
1
2moduleram_tb();
3 regclk;
4 regrst_n;
5
6 wire[7:0]q;
7
8 initialbegin
9 clk =1'b1;
10 rst_n =1'b0;
11
12 #100.1rst_n =1'b1;
13
14 #200000.1$stop;
15
16 end
17
18 always#10clk =~clk;
19
20ramram_dut (
21 .clk(clk),
22 .rst_n(rst_n),
23 .q(q)
24 );
25
26endmodule
仿真圖:
在圖中我們可以看到,我們寫入的數(shù)據(jù),和我們讀出的數(shù)據(jù)是相同的。
-
FPGA
+關(guān)注
關(guān)注
1629文章
21748瀏覽量
603835
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論