一、ram相關介紹
本實驗使用一個控制模組對ram ip進行控制(本質上是三個計數器)
二、ip使用
在介面中選擇IP catalog,搜尋block,選擇底下這個,雙擊即可生成ram的ip
下面進行一些ram資源的配置
配置好後點選ok,生成ip,可以在這裡看到已經生成好了:
這裡點開這個.veo檔案,裡面的東西可以當做模版使用
在實驗中,我們也使用了ila的ip,就相當於探針一樣觀察訊號的變化,本實驗使用的如下(在IP catalog中搜尋ila)
在控制模組(即ram_rw中例化ila即可)
模擬部分:
為時鐘和復位(Y18和F15)配置引腳後,生成位元流下載到板子上,ila會自動跳出來,觀察到ram讀寫資料正確(wea高為寫,低為讀)
注意:
由於所使用的板子的復位訊號常高,因此這裡需要取反
附:工程
ip_ram.v
`timescale 1ns / 1ps module ip_ram( input sys_clk, input sys_rst_n ); wire ram_en ; wire ram_wea ; wire [4 : 0]ram_addr ; wire [7 : 0]ram_wr_data ; wire [7 : 0]ram_rd_data ; ram_rw ram_rw( .clk (sys_clk), .rst (sys_rst_n), .ram_en (ram_en), .ram_wea (ram_wea), .ram_addr (ram_addr), .ram_wr_data (ram_wr_data), .ram_rd_data (ram_rd_data) ); blk_mem_gen_0 u_blk_mem_gen_0 ( .clka(sys_clk), // input wire clka .rsta(!sys_rst_n), // input wire rsta .ena(ram_en), // input wire ena .wea(ram_wea), // input wire [0 : 0] wea .addra(ram_addr), // input wire [4 : 0] addra .dina(ram_wr_data), // input wire [7 : 0] dina .douta(ram_rd_data), // output wire [7 : 0] douta .rsta_busy() // output wire rsta_busy ); endmodule
ram_rw.v
`timescale 1ns / 1ps module ram_rw( input clk, input rst, output ram_en, output ram_wea, output reg [4 : 0] ram_addr, output reg [7 : 0] ram_wr_data, input [7 : 0] ram_rd_data //從ram讀取出來的資料 ); reg [5:0] cnt1; //讀寫轉換 assign ram_wea = (cnt1 <= 31)?1:0; assign ram_en = rst; //讀寫轉換計數 always @(posedge clk or negedge rst) begin if(!rst) cnt1 <= 0; else begin if(cnt1 == 6'd63) cnt1 <= 0; else cnt1 <= cnt1 + 1; end end //生成資料 always @(posedge clk or negedge rst) begin if(!rst) ram_addr<= 0; else if (ram_addr <= 6'd31) ram_addr <= ram_addr + 1; else ram_addr <= 0; end //生成地址 always @(posedge clk or negedge rst) begin if(!rst) ram_wr_data <= 0; else if (ram_wr_data <= 6'd31) ram_wr_data <= ram_wr_data + 1; else ram_wr_data <= 0; end ila_0 your_instance_name ( .clk(clk), // input wire clk .probe0(ram_en), // input wire [0:0] probe0 .probe1(ram_wea), // input wire [0:0] probe1 .probe2(ram_addr), // input wire [4:0] probe2 .probe3(ram_wr_data), // input wire [7:0] probe3 .probe4(ram_rd_data) // input wire [7:0] probe4 ); endmodule
在這份工程最底下就是例化的ila
影片來源:
28_實戰篇:RAM IP核(第二講:程式設計)_嗶哩嗶哩_bilibili