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

示意图如下:

相关推荐
油炸自行车20 小时前
Unity URDF 导入后运行报错问题笔记
笔记·unity·游戏引擎·数字孪生·urdf·工业仿真·虚拟与现实
南無忘码至尊20 小时前
Unity学习90天 - 第 5 天 - 阶段小项目
学习·unity·c#·游戏引擎
韩楚风20 小时前
PostgreSQL入门与进阶学习,体系化的SQL知识,完成终极目标高可用与容灾,性能优化与架构设计,以及安全策略
sql·学习·postgresql
亚空间仓鼠20 小时前
Python学习日志(四):实例
开发语言·python·学习
sealaugh3220 小时前
react native(学习笔记第二课) 英语打卡微应用(1)-开始构建
笔记·学习·react native
夜瞬20 小时前
NLP学习笔记03:文本分类——从 TF-IDF 到 BERT
笔记·学习·自然语言处理
Fanfanaas20 小时前
Linux 系统编程 进程篇 (二)
linux·运维·服务器·c语言·开发语言·学习
克里斯蒂亚诺·罗纳尔达20 小时前
智能体学习22——智能体间通信(A2A)
人工智能·学习·ai
码匠许师傅20 小时前
【STM32开发笔记】基于STM32CubeMX2 和STM32CubeIDE for VSCode的全新STM32C5开发体验
笔记·vscode·stm32
Hammer_Hans20 小时前
DFT笔记41
笔记