1. 程式人生 > >xilinx fpga中塊ram的使用——簡單雙端口ram的使用

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

int col date rom sed del integer mode reg

在簡單雙端口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的仿真結果為:

技術分享圖片

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