Verilog——IP核RAM实验

实验内容:测试IP核的RAM

软件版本:vivado 2019.2

顶层模块实例化RAM,通过ram_rdata输出读出来的数据,ram_en(RAM使能,高电平有效)、ram_we(RAM读写片选)、ram_addr(RAM地址)、ram_wdata(要写入的数据)由RAM的写模块提供

`timescale 1ns / 1ps
//
// 
// Engineer: mankaichuang
// Create Date: 2020/11/30 11:34:31
// Module Name: ip_ram
// Description: IP核的RAM读写实验
//
//


module ip_ram(
    input           sys_clk,
    input           sys_rst_n    
);

wire            ram_en;         //使能
wire            ram_we;         //读写片选
wire [4:0]      ram_addr;       //地址
wire [7:0]      ram_wdata;      //写数据
wire [7:0]      ram_rdata;      //读数据


ram_rw u_ram_rw(
    .sys_clk            (sys_clk),
    .sys_rst_n          (sys_rst_n),

    .ram_en             (ram_en),         
    .ram_we             (ram_we),             
    .ram_addr           (ram_addr),           
    .ram_wdata          (ram_wdata)           
);


blk_mem_gen_0 ip_ram_instance(
  .clka(sys_clk),    // input wire clka
  .ena(ram_en),      // input wire ena
  .wea(ram_we),      // input wire [0 : 0] wea
  .addra(ram_addr),  // input wire [4 : 0] addra
  .dina(ram_wdata),    // input wire [7 : 0] dina
  .douta(ram_rdata)  // output wire [7 : 0] douta
);
endmodule

RAM的写模块:

`timescale 1ns / 1ps
//
// 
// Engineer: mankaichuang
// Create Date: 2020/11/30 11:35:21
// Module Name: ram_rw
// Description: ram数据读写操作
// 
//


module ram_rw(
    input           sys_clk,
    input           sys_rst_n,

    output          ram_en,             //使能
    output          ram_we,             //读写片选
    output reg[4:0] ram_addr,           //地址
    output reg[7:0] ram_wdata           //要写入的数据
);

reg[5:0]    rw_cnt;

assign ram_en = sys_rst_n;
assign ram_we = (rw_cnt <= 6'd31) ? 1'b1 : 1'b0;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        rw_cnt <= 6'b0;
    else if(rw_cnt == 6'd63)
        rw_cnt <= 6'b0;
    else
        rw_cnt <= rw_cnt + 6'b1;
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        ram_addr <= 5'b0;
    else if(ram_addr == 5'd31)
        ram_addr <= 5'b0;
    else
        ram_addr <= ram_addr + 5'b1;
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        ram_wdata <= 8'b0;
    else if(rw_cnt < 5'd31)
        ram_wdata <= ram_wdata + 8'b1;
    else
        ram_wdata <= 8'b0;
        
end

endmodule

仿真代码:

`timescale 1ns / 1ps
//
//
// Engineer: mankaichuang
// Create Date: 2020/11/30 15:58:39 
// Module Name: tb_ip_ram
// Description:
// 
//


module tb_ip_ram();

reg sys_clk;
reg sys_rst_n;

always #10 sys_clk = ~sys_clk;

initial begin
        sys_clk         = 1'b0;
        sys_rst_n       = 1'b0;
    #20 sys_rst_n       = 1'b1;
end


ip_ram tb_ip_ram(
    .sys_clk            (sys_clk),
    .sys_rst_n          (sys_rst_n)    
);

endmodule

仿真结果:

Verilog——IP核RAM实验

 

上一篇:verilog之时序逻辑电路(附代码)


下一篇:同步复位与异步复位