(7)ram ip使用

数字ic新人發表於2024-05-09

一、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

相關文章