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

示意图如下:

相关推荐
Hhy_1107几秒前
《C++深度解构04》类和对象(下)——类型转换、static、友元与编译器优化
c语言·c++·学习·类和对象·visual studio
传奇开心果编程5 分钟前
【Flutter入门练中学】第1课:从零开始
学习·flutter·ui
智者知已应修善业10 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
小弥儿11 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
知识分享小能手13 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
m4Rk_13 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github
小李不想当小白13 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
2601_9499506315 小时前
练题簿在线练题全流程:从资料导入到模拟考试与错题复盘
学习·考研·小程序·刷题·小程序推荐
2601_9653842615 小时前
口腔黏膜清洁的工程化路径:从表面形貌表征到清洁策略匹配
经验分享·笔记
泡泡鱼(敲代码中)15 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm