• 新建一个工程
  • 打开IP Catalog,搜索ram,找到Block Memory Generator
  • 选择配置类型为单端口
  • 修改写数据位宽为32
  • 接着点击OK生成即可
  • 打开veo模板文件,红色代表IP核还在生成中
  • 可以把对应代码拷贝进顶层ip_ram.v文件就可以驱动ip核了
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
blk_mem_gen_0 your_instance_name (.clka(clka),    // input wire clka.ena(ena),      // input wire ena.wea(wea),      // input wire [0 : 0] wea.addra(addra),  // input wire [4 : 0] addra.dina(dina),    // input wire [15 : 0] dina.douta(douta)  // output wire [15 : 0] douta
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
  • 创建读写模块ram_rw.v
module ram_rw(input clk,input rst, // 高电平有效output reg ram_en, // 使能启动output reg rw, // 读写切换output reg [4:0] ram_addr, // 地址2^5=32位output reg [7:0] ram_wr_data);reg [5:0] rw_cnt;always @(posedge clk or posedge rst) beginif(rst == 1'b1)ram_en <= 1'b0;elseram_en <= 1'b1;endalways @(posedge clk or posedge rst) beginif(rst == 1'b1)rw_cnt <= 6'd0;else if(rw_cnt == 6'd63)rw_cnt <= 6'd0;elserw_cnt <= rw_cnt + 6'd1;endalways @(posedge clk or posedge rst) beginif(rst == 1'b1)ram_wr_data <= 8'd0;else if((rw_cnt <= 6'd31) && ram_en) // 用来写数据,此时使能要打开ram_wr_data <= ram_wr_data + 8'd1;elseram_wr_data <= ram_wr_data; // 保持不变end// 读写,默认处于写状态always @(posedge clk or posedge rst) beginif(rst == 1'b1)rw <= 1'b1;else if(rw_cnt <= 6'd31) rw <= 1'b1;elserw <= 1'b0;end// 地址always @(posedge clk or posedge rst) beginif(rst == 1'b1)ram_addr <= 5'd0;elseram_addr <= rw_cnt[4:0];end
endmodule
  • 将这个模块例化进顶层ip_ram.v
module ip_ram(input sys_clk,input sys_rst);wire ram_en;wire rw;wire [4:0] ram_addr;wire [7:0] ram_wr_data;wire [7:0] douta;ram_rwraw_rw_u(.clk(sys_clk),.rst(sys_rst), // 高电平有效.ram_en(ram_en), // 使能启动.rw(rw), // 读写切换.ram_addr(ram_addr), // 地址2^5=32位.ram_wr_data(ram_wr_data));//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAGblk_mem_gen_0 your_instance_name (.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_wr_data),    // input wire [15 : 0] dina.douta(douta)  // output wire [15 : 0] douta);// INST_TAG_END ------ End INSTANTIATION Template ---------
endmodule
  • 编写管脚约束文件

  • 打开ANALYSIS下的Schematic可以看见原理图

  • 添加ILA在线调试模块,在IP Catalog输入ILA

  • 选好探针数为5,位宽为2048

  • 设置位宽后点击OK

  • 点击ila的veo,拷贝进

    -将探针连接信号

   ila_0 ila_0_u (
.clk(sys_clk), // input wire clk.probe0(ram_en), // input wire [0:0]  probe0
.probe1(rw), // input wire [0:0]  probe1
.probe2(ram_addr), // input wire [4:0]  probe2
.probe3(ram_wr_data), // input wire [7:0]  probe3
.probe4(douta) // input wire [7:0]  probe4);
  • 完整顶层模块如下
module ip_ram(input sys_clk,input sys_rst);wire ram_en;wire rw;wire [4:0] ram_addr;wire [7:0] ram_wr_data;wire [7:0] douta;ram_rwraw_rw_u(.clk(sys_clk),.rst(sys_rst), // 高电平有效.ram_en(ram_en), // 使能启动.rw(rw), // 读写切换.ram_addr(ram_addr), // 地址2^5=32位.ram_wr_data(ram_wr_data));//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAGblk_mem_gen_0 blk_mem_gen_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_wr_data),    // input wire [15 : 0] dina.douta(douta)  // output wire [15 : 0] douta);// INST_TAG_END ------ End INSTANTIATION Template ---------ila_0 ila_0_u (.clk(sys_clk), // input wire clk.probe0(ram_en), // input wire [0:0]  probe0  .probe1(rw), // input wire [0:0]  probe1 .probe2(ram_addr), // input wire [4:0]  probe2 .probe3(ram_wr_data), // input wire [7:0]  probe3 .probe4(douta) // input wire [7:0]  probe4);
endmodule
  • 生成比特流文件并自动跳转进调试界面

  • 点击运行可以看到结果

  • 把进制设置为十进制

  • 查看两个时刻,读有效和写有效

  • rw=1时往里写入数据,从100开始递增,写数据时读数据里面得数值是无效的

  • rw=0时读数据,从写得100开始读

  • 发现两个问题,递增到37而不是31结束 ,打扰了radix应该设置为unsigned decimal。还有77结束应该是78开始而不是100 ,修改完进制后这个问题也解决了

  • 解决写有效时读数据还有值的问题,把 write first修改为no change并重新生成IP并进行编译,或者直接打开modelsim进行仿真(编译IP核实在太慢了

module testbench();reg sys_clk;reg sys_rst;always #10 sys_clk = ~ sys_clk; initial beginsys_clk = 1'b0; sys_rst = 1'b1;#20sys_rst = 1'b0;endip_ram u_ip_ram(.sys_clk (sys_clk),.sys_rst (sys_rst));
endmodule
  • 并对代码进行了小修改,把数据清零了
 always @(posedge clk or posedge rst) beginif(rst == 1'b1)ram_wr_data <= 8'd0;else if((rw_cnt <= 6'd31) && ram_en) // 用来写数据,此时使能要打开ram_wr_data <= ram_wr_data + 8'd1;elseram_wr_data <= 8'd0; // 保持不变 修改为 清零end

  • 可以看到第一行rw为低时在读数据,第二行计数到31时停止

zynq创建ramip核相关推荐

  1. 【ZYNQ】IP核_关于视频IP核的详细介绍

    [ZYNQ]IP核_关于视频IP核的详细介绍 接口信号的含义 数据格式及编码 视频时序 视频时序的进一步说明 自动延迟匹配 视频子系统软件指南 接口信号的含义 在ZYNQ的设计中一般视频数据的传输遵循 ...

  2. ZYNQ axi_uartlitle IP核扩展232或者422

    我的另外一篇博客:ZYNQ axi uart16550 IP核扩展485接口使用 ZYNQ axi uart16550 IP核扩展485接口使用_wangjie36的博客-CSDN博客_uart165 ...

  3. Xilinx VIVADO 中 DDR3(AXI4)的使用(1)创建 IP 核

    1.前言 DDR3 SDRAM 简称 DDR3,是当今较为常见的一种储存器,在计算机及嵌入式产品中得到广泛应用, 特别是应用在涉及到大量数据交互的场合,比如电脑的内存条.DDR3的时序相当复杂,对DD ...

  4. 使用ISE创建IP核(以加法器的IP核建立为例)

    IP核介绍: IP(知识产权)核将一些在数字电路中常用但比较复杂的功能块,如FIR滤波器,SDRAM控制器,PCI接口等做成一个"黑盒"或者可修改参数的模块,供设计者使用.IP核包 ...

  5. ZYNQ RapidIO IP核协议与使用

    一,RapidIO各个子核和接口的基本功能视图 RapidIO主要应用于嵌入式系统内部互连,支持芯片到芯片.板到板间的通讯,可作为嵌入式设备的背板(Backplane)连接.RapidIO核把三个子核 ...

  6. ZYNQ Linux+裸核

    目录 一.工程目标 二.Linux系统设置 三.SDK设置 1.CPU1设置 2.FSBL设置 3.生成BOOT.BIN 四.运行测试 1.Linux系统测试 2.裸核测试 一.工程目标 CPU0运行 ...

  7. 【ZYNQ】IP核_VDMA的详细介绍

    VDMA的特点总结: 1.AXI VDMA核心支持为32位地址空间寻址最多32个帧缓冲区,为32位以上地址空间寻址多达8个帧缓冲: 2.AXI VDMA核心支持可选的数据重新调整引擎(DRE).DRE ...

  8. 【ZYNQ】自定义IP核的封装

    自定义IP核的封装介绍 IP核打包器的配置 IP核打包的基础知识 IP核顶层接口的命名规范 Reset接口 Clock接口 差分Clock接口 AXI接口 升级自定义IP 创建和打包IP向导 自定义I ...

  9. vivado创建自定义IP核

    环境:vivado 18.2 一 创建IP核 1.在tool–>Create and Package New IP 选择保存路径 定义IP核信息,可以添加一些备注信息 封装IP (IP创建完成后 ...

最新文章

  1. kdj指标主要看哪个值_什么是KDJ?KDJ指标如何使用
  2. python递归报错 RuntimeError: maximum recursion depth exceeded
  3. linux不重启换root密码是什么原因,在Linux下修改和重置root密码的方法(超简单)
  4. ADO.NET的几大对象详解
  5. Java Lambda 表达式快速学习
  6. [转载] 抽象类中不能有static,final,private修饰的方法--姥姥家的程序员
  7. swift - 添加定时器
  8. 编程基本功:找到问题的合理解释,才算解决问题
  9. 俄数学天才破解庞加莱猜想拒领百万奖金(图)
  10. 性能优化,进无止境---CPU篇
  11. ES DSL搜索 - prefix、fuzzy和wildcard
  12. 安装目录里无法找到计算机,安装软件弹出系统找不到指定的路径提示解决方法...
  13. Sparse R-CNN: End-to-End Object Detection with Learnable Proposals
  14. Linux4种常用软件安装方法(源代码,二进制,rpm,yum)
  15. 微信小程序--域名配置
  16. 给课题组师弟师妹们的开荒手册
  17. NDK No implementation found for void com.*
  18. 全球与中国市场植物(HPMC)胶囊前景展望与十四五趋势预测报告2022年版
  19. 还不知道怎么制作用户体验地图?这份超全攻略送给你
  20. javaScript学习笔记:用城市代码查询城市天气

热门文章

  1. hdfs 数据迁移_对象存储BOS发布全新工具,加速自建HDFS到云端的访问速度
  2. 策略模式和工厂模式的区别_设计模式系列 — 策略模式
  3. linux 看日期,Linux查看日期和时间
  4. redis 能不能监听特定的key失效_Spring boot实现监听Redis key失效事件实现和其它方式...
  5. JavaScript面向对象 - 严格模式
  6. VUE图片裁剪功能vue-img-cutter
  7. 虚拟linux无线网卡驱动安装失败,救命1 :Atheros AR5212无线网卡驱动安装失败!!...
  8. geoda空间自相关分析_【方法笔记4】Geoda空间计量1 空间自相关
  9. idea 报 Cannot access alimaven
  10. Anaconda和conda——关于python的数据科学开发环境,数据科学必备的十大Python库