xilinx fpga中塊ram的使用——簡單雙端口ram的使用


在簡單雙端口ram中最簡單有9個端口:分別是

clka  為輸入端口的時鍾
wea  讀寫控制端,高為寫,低為讀
addra 寫地址
dina  待寫入的數據
clkb 為輸出端口的時鍾的
addrb 讀地址
doutb 讀出的數據

在ip核中還可以加入ena/enb端口,這兩個端口的作用是控制相應寫入和讀出端口的數據,為高是正常寫入或讀出,為低時寫入為0,讀出為0。

也可以加入復位端口rst,不過復位有兩種優先級CE和SR,選擇CE時,rst的優先級低於ENA的優先級;選擇SR時,rst的優先級高於ENA的優先級。

還可以選擇復位的方式,同步還是異步,一般選擇同步。

端口介紹完后,就開始使用雙端口ram,工作方式是:可以寫入也可以預先用coe文件存入數據,寫入數據后就可以讀取數據了 ,這里的讀取數據和rom的相同,寫入地址是多少,就去讀取相應地址的數據。

雙端口ram和單端口的ram不同,單端口的ram讀取數據方式是,寫入數據的下一個時鍾自動輸出數據,僅可用於流水線式數據處理。

這里寫了一個簡單雙端口的ram測試代碼

 1 `timescale 1ns / 1ps
 2 `define clk_period 20
 3 ////////////////////////////////////////////////////////////////////////////////
 4 // Company: 
 5 // Engineer:
 6 //
 7 // Create Date:   11:39:21 06/04/2018
 8 // Design Name:   ram
 9 // Module Name:   E:/digital image processing/finial_code/ram_test/testbench/ram_tb.v
10 // Project Name:  ram_test
11 // Target Device:  
12 // Tool versions:  
13 // Description: 
14 //
15 // Verilog Test Fixture created by ISE for module: ram
16 //
17 // Dependencies:
18 // 
19 // Revision:
20 // Revision 0.01 - File Created
21 // Additional Comments:
22 // 
23 ////////////////////////////////////////////////////////////////////////////////
24 
25 module ram_tb;
26 
27     // Inputs
28     reg clka;
29     reg ena;
30     reg [0:0] wea;
31     reg [3:0] addra;
32     reg [7:0] dina;
33     reg clkb;
34     reg enb;
35     reg [3:0] addrb;
36   reg clk;
37 
38     // Outputs
39     wire [7:0] doutb;
40 
41     // Instantiate the Unit Under Test (UUT)
42     ram uut (
43         .clka(clk), 
44         .ena(ena),
45         .wea(wea), 
46         .addra(addra), 
47         .dina(dina), 
48         .clkb(clk), 
49     .enb(enb),
50         .addrb(addrb), 
51         .doutb(doutb)
52     );
53     integer i;
54   initial clk = 1;
55   always #(`clk_period/2)clk = ~clk;
56     initial begin
57         // Initialize Inputs
58   ena = 1;
59   enb = 1;
60     wea = 0;
61     dina = 0;
62     addra = 0;
63     addrb = 0;
64     #(`clk_period*20 +1 );
65     for (i=0;i<=15;i=i+1)begin
66             wea = 1;   
67             dina = 255 - i;
68             addra = i;
69             #`clk_period;
70         end
71     wea = 0;
72     #(`clk_period*20);
73     /*for (i=0;i<=15;i=i+1)begin     
74             addrb = i;
75             #`clk_period;
76         end    */
77         addrb = 4;
78       #`clk_period;
79       addrb = 2;
80       #`clk_period;
81       addrb = 10;
82       #`clk_period;
83     
84         // Wait 100 ns for global reset to finish
85         #100;
86         
87         // Add stimulus here
88 
89     end
90       
91 endmodule
testbench

modelsim的仿真結果為:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM