ZYNQ初识7(zynq_7010)RAM_IP核

学习汇总正点原子bi站教学视频。但由于目前的学习板PL端缺乏时钟晶振,所以需要从PS端调用时钟供给PL端使用,也就造成顶层文件的设置出现一些问题,在IP核创建调用和例化过程中一些功能会受到限制,所以以下仅作汇总参考。

zynq_7000家族中的7010和7020的ram资源如上图,每一片ram随机存储器的内存为36K,上图中的Block RAM对应的资源为多片ram拼凑起来的资源总和。其中单片ram又可以做灵活分割处理。

以下是创建RAM对应的IP核的两个步骤:

上图中标注的存储器类型分别包括单端ram(同时读写)、伪双端ram(一端读,一端写(但读写固定))、真双端ram(一端读、一端写,且读写端均可以切换读和写的功能)以及rom(关闭写的一端)等等,也可以看出ram和rom的资源是共用的。

另一幅图则涉及读写端口的设定,包括读写端口的数据宽度和深度,设置读写优先级以及端口使能的功能。

另附上顶层文件以及对应RAM的IP核的.v文件的程序:

复制代码
`timescale 1ns / 1ps
// Create Date: 2024/12/31 10:31:35
// Design Name: top文件
// Module Name: test_026_ramIP
module test_026_ramIP(
  input    sys_clk,
  input    sys_rst_n

    );
    
 wire  ram_en;
 wire  rw;
 wire  [4:0]  ram_addr;
 wire  [7:0]  ram_w_data;
 wire  [7:0] douta;  //设置为线型避免输出端创建需要分配8个引脚
 
 //lihua,IP核调用,ram读写控制
 ram_IP_rw  ram_IP_rw_u(
   .sys_clk         (sys_clk),    
   .sys_rst_n       (sys_rst_n),  
                    
   .ram_en          (ram_en),     
   .rw              (rw),         
   .ram_addr        (ram_addr),   
   .ram_w_data      (ram_w_data)
 );

   //lihua,IP核调用
   ramIP_1 ramIP_1_u (
  .clka(sys_clk),    // input wire clka
  .ena(ram_en),      // input wire ena
  .wea(rw),      // input wire [0 : 0] wea
  .addra(ram_addr),  // input wire [4 : 0] addra
  .dina(ram_w_data),    // input wire [7 : 0] dina
  .douta(douta)  // output wire [7 : 0] douta
);

  
endmodule

//ram IP核读写控制
module ram_IP_rw(
  input               sys_clk,
  input               sys_rst_n,
  
  output  reg         ram_en,
  output  reg         rw,
  output  reg  [4:0]  ram_addr,
  output  reg  [7:0]  ram_w_data

    );
    
    //使能设置
  always@(posedge sys_clk or negedge sys_rst_n)
     begin
      if(!sys_rst_n)
        ram_en <= 1'b0;
      else 
        ram_en <= 1'b1;  
    end    
   
  reg  [5:0]  rw_cnt;    //读写切换计数器 
  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'd1;  
    end
  
   always@(posedge sys_clk or negedge sys_rst_n)
    begin
      if(!sys_rst_n)
        ram_w_data <= 8'b0;    
      else if((rw_cnt >= 6'd31) && ram_en)
        ram_w_data <= ram_w_data + 8'b1; 
      else
        ram_w_data <= ram_w_data;
    end 
    
    //读写切换:
 always@(posedge sys_clk or negedge sys_rst_n)
    begin
      if(!sys_rst_n)
        rw <= 1'b1;//初始默认为高,也就是写状态
      else if(rw_cnt >= 6'd31)
        rw <= 1'b1;
      else
        rw <= 1'b0;
    end
    
 always@(posedge sys_clk or negedge sys_rst_n)
    begin
      if(!sys_rst_n)   
        ram_addr <= 5'd0;
      else 
        ram_addr <= rw_cnt[4:0];  //位宽设定,前31位读写
     end 
      
endmodule

示意图如下:

相关推荐
YangYang9YangYan几秒前
大数据与会计专业学习发展指南
大数据·学习
穿过锁扣的风2 分钟前
从感知器到BP神经网络:深度学习入门核心笔记
笔记·深度学习·神经网络
zzcufo7 分钟前
多邻国第五阶阶段第39-40问题笔记
笔记
林深现海10 分钟前
【刘二大人】PyTorch深度学习实践笔记 —— 第一集:深度学习全景概述(凝练版)
pytorch·笔记·深度学习
知识分享小能手15 分钟前
SQL Server 2019入门学习教程,从入门到精通,初识 SQL Server 2019 —— 语法知识点与使用方法详解(1)
数据库·学习·sqlserver
代码游侠16 分钟前
C语言核心概念复习(三)
开发语言·数据结构·c++·笔记·学习·算法
烧烧的酒0.o18 分钟前
Java——JavaSE完整教程
java·开发语言·学习
嗯嗯**23 分钟前
Neo4j学习4:数据导入
学习·neo4j·图数据库·csv·数据导入
卡布叻_星星24 分钟前
清理缓存并重启 IDEA
笔记
代码游侠26 分钟前
学习笔记——Linux内核与嵌入式开发2
linux·运维·arm开发·嵌入式硬件·学习·架构