RAM IP Core

news2024/12/23 13:15:05

官方文档:ZYNQ 存储资源指导手册 (DS109)

RAM 全称 Random Access Memory,随机存取存储器。

随时将数据写入任意指定地址的存储单元,或从任意地址读出数据。读写的速度是由时钟频率决定的。

RAM主要用于存放程序运行的中间数据、运算结果等

资源简介

img

  • Zynq-7000系列都有很多独立的双端口RAM,每一片RAM有36kb

img

  • 数据位宽的配置(32K1, 16K2,…);每个RAM可以被分为两个独立的18Kb的RAMs;两个临近的RAM也可以合并成一个64K的RAM

端口配置

  • 单端口:只有一个端口,读写数据不同时进行,共用一个数据通道
  • 伪双端口:拥有两个数据通道,一个写一个读
  • 真双端口:拥有两个数据通道,每个通道既可以写也可以读

创建顶层模块 ip_ram

前0-31写,后32-63读

创建一个设计源文件:

img

选择RAM IP Core

img

双击设置

img

img

设置读写位宽和深度

img

img

veo文件是例化模板

img

读写模块 ram_rw

我们需要一个读写控制模块去驱动RAM IP Core

新建一个设计文件ram_rw

img

module ram_rw(
    input   clk,
    input   rst_n,
    
    output  reg ram_en,      // 写使能
    output  reg rw,          // 写还是读
    output  reg[4:0] ram_addr,// 写还是读的地址
    output  reg[7:0] ram_wr_data // 写或读的数据
    );
endmodule

设置端口控制逻辑:

    // 使能端口
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            ram_en <= 1'b0;
        else
            ram_en <= 1'b1;
    end
    
    // 计数器64, 前32写后32读
    reg[0:5] rw_cnt;
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            rw_cnt<=6'd0;
        else
            if(rw_cnt == 6'd63)
                rw_cnt <= 6'd0;
            else
                rw_cnt <= rw_cnt + 6'd1;
    end
    
    // 设置写的数据
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            ram_rw_data <= 8'd0;
        else
            if(ram_en && (rw_cnt <= 6'd31)) // 写使能打开 且 计数器在写范围内
                ram_rw_data <= ram_rw_data + 8'd1;
            else
                ram_rw_data <= ram_rw_data;
    end
    
    // 设置读写状态
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            rw <= 1'b1; // 默认为写状态
        else
            if(ram_en && (rw_cnt <= 6'd31)) // 写使能打开 且 计数器在写范围内
                rw <= 1'b1;
            else
                rw <= 1'b0;
    end
    
    // 设置写地址
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            ram_addr <= 5'd0;
        else
            // 把计数器当作地址, 只取前31
            ram_addr <= rw_cnt[4:0];
    end

例化ram ip和读写模块ram_rw

module ip_ram(
    input sys_clk,
    input sys_rst_n
    );
    
    wire ram_en;
    wire rw;
    wire[4:0] ram_addr;
    wire[7:0] ram_rw_data;
    
    wire[7:0] douta;
    // 例化读写模块
    ram_rw ram_rw_u(
        .clk        (sys_clk),       
        .rst_n      (sys_rst_n),           
        .ram_en     (ram_en),    
        .rw         (rw),        
        .ram_addr   (ram_addr),  
        .ram_rw_data(ram_rw_data)
    );
    
    blk_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_rw_data),    // input wire [7 : 0] dina
        .douta  (douta)  // output wire [7 : 0] douta
    );
endmodule

Run Synthesis后打开Schematic原理图

img

约束

set_property -dict { PACKAGE_PIN L16   IOSTANDARD LVCMOS33 } [get_ports { sys_clk }]; #IO_L11P_T1_SRCC_35 Sch=sysclk

set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { sys_rst_n }];

ILA

img

设置探针数和深度

img

设置探针位宽

img

copy例化的模板到顶层模块ip_ram:

img

接入需要探测的信号:

img

ip_ram.v:

module ip_ram(
    input sys_clk,
    input sys_rst_n
    );
    
    wire ram_en;
    wire rw;
    wire[4:0] ram_addr;
    wire[7:0] ram_rw_data;
    
    wire[7:0] douta;
    // 例化读写模块
    ram_rw ram_rw_u(
        .clk        (sys_clk),       
        .rst_n      (!sys_rst_n),           
        .ram_en     (ram_en),    
        .rw         (rw),        
        .ram_addr   (ram_addr),  
        .ram_rw_data(ram_rw_data)
    );
    
    blk_mem_gen_0 blk_mem_gen_0_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_rw_data),    // input wire [7 : 0] dina
        .douta  (douta)  // output wire [7 : 0] douta
    );
    
    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_rw_data), // input wire [7:0]  probe3 
        .probe4(douta) // input wire [7:0]  probe4
    );

endmodule

下载验证

生成bitstream,连接开发板,点击Program Device

点击运行:

img

写的数据设置:

img

0-31,写数据从0增加到31

32-63,读数据,数据不增加保持在31,douta依次将0-31读出来

64-95,写数据,数据从31增加到63,douta保持31不变

img

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL实战45讲深入浅出索引下

select * from T where k between 3 and 5这个语句的执行流程是&#xff1a; 在 k 索引树上找到 k3 的记录&#xff0c;取得 ID 300&#xff1b;再到 ID 索引树查到 ID300 对应的 R3&#xff1b;在 k 索引树取下一个值 k5&#xff0c;取得 ID500.再回到 ID 索引树查到 ID500 …

深度学习-第T1周——实现mnist手写数字识别

深度学习-第T1周——实现mnist手写数字识别深度学习-第P1周——实现mnist手写数字识别一、前言二、我的环境三、前期工作1、导入依赖项并设置GPU2、导入数据集3、归一化4、可视化图片5、调整图片格式四、构建简单的CNN网络五、编译并训练模型1、设置超参数2、编写训练函数六、预…

【Python】Jupyter .ipynb

Jupyter启动Hello JupyterMarkdown纵然 Anaconda Pycharm 非常好用&#xff0c;但是既然学到 Jupyter&#xff0c;那就多掌握一份技能&#xff0c;毕竟 Jupyter 的确有他的优势在。 我认为 Jupyter 对于 Python 初学者来说&#xff0c;非常友善&#xff0c;他将一整个代码划分…

c#学习笔记

目录1.语句块2.Write和WriteLine的区别&#xff1a;3.params4.托管代码和非托管代码5.DllImport的使用&#xff1a;6.WriteLine、ReadLine和ReadKey&#xff1a;7.C#中访问修饰符8.类型的实例化9.成员可以分为两种&#xff1a;数据成员和函数成员10.枚举enum和结构struct的区别…

使用Debussy加载设计项目

Debussy是NOVAS Software, Inc(思源科技)用来进行HDL Debug & Analysis的工具&#xff0c;这套软体主要不是用来跑模拟或看波形&#xff0c;它最强大的功能是&#xff1a;能够在HDL source code、schematic diagram、waveform、state bubble diagram之间&#xff0c;即时做…

蓝桥杯-考勤刷卡

蓝桥杯-考勤刷卡1、问题描述2、解题思路3、代码实现1、问题描述 小蓝负责一个公司的考勤系统, 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗。 当员工刷卡时, 会在后台留下一条记录, 包括刷卡的时间和员工编号, 只 要在一天中员工刷过一次卡, 就认为他到岗了。 现在…

电子技术——数字逻辑反相器

电子技术——数字逻辑反相器 在学习完如何通过CMOS数字电路实现组合逻辑&#xff0c;接下来我们评估这种数字CMOS电路的性能。首先&#xff0c;我们考虑最基本的部件——反相器。 电压传导特性 下图是一个反相器的原理图&#xff1a; 在之前&#xff0c;我们已经介绍了MOSFE…

ATTCK v12版本战术介绍持久化(三)

一、引言在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行战术、持久化战术&#xff08;一&#xff09;及&#xff08;二&#xff09;知识&#xff0c;本期我们为大家介绍ATT&CK 14项战术中持久化战术&#xff08;三&#xff09;涉及的剩余子技术&…

汇编语言程序设计(一)

前言 在学习汇编语言之前&#xff0c;我们应该要知道汇编语言他是一门怎么样的语言。汇编语言是直接工作在硬件上的一门编程语言&#xff0c;学习汇编语言之前最好先了解一下计算机硬件系统的结构和工作原理。学习汇编语言的重点是学习如何利用硬件系统的编程结构和指令集进而…

高通平台开发系列讲解(显示篇)Gralloc模块

文章目录 一、什么是Gralloc模块二、Gralloc加载流程三、Gralloc模块的加载四、Gralloc设备的加载五、 fb设备的加载沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍显示过程中Gralloc模块。 一、什么是Gralloc模块 通过加载Gralloc抽象层,可以打开fb设备和…

【游戏逆向】寻路函数隐藏检测点分析

案例&#xff1a; 某游戏出现调用寻路函数失败异常崩溃。 基本情况分析&#xff1a; 在刚登陆游戏的时候直接调用寻路函数崩溃。 手动寻路以后再调用寻路不崩溃。(排除了函数编写错误的可能) 猜测可能检测方法&#xff1a; 有某一个标志位(全局类型)在游戏刚登陆的时候没…

【VS】【Qt】vs+ qt .natvis 失效问题

【VS】【Qt】vs qt .natvis 失效问题 .natvis文件用于调试时候自定义显示自定义类型的可视化提示。 一般这类文件存在 C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\Packages\Debugger\Visualizers路径下。 .natvis文件的规则在此不介绍&#xf…

剑指 Offer 23 链表中环的入口结点

摘要 链表中环的入口结点_牛客题霸_牛客网 剑指 Offer II 022. 链表中环的入口节点 141. 环形链表 142. 环形链表 II 一、是否有环&#xff08;快慢指针&#xff09; 我们可以根据上述思路来解决本题。具体地&#xff0c;我们定义两个指针&#xff0c;一快一慢。慢指针每次…

了解Cesium的笛卡尔类型和位置变量的单位

var position Cesium.Cartesian3.fromDegrees(100, 100, 2); 前文输出了position变量&#xff0c;是一个六位数&#xff0c;还带有多位小数&#xff1b;下面来看一下相关类的定义和position的单位&#xff1b;单位如果不对的话放置的模型可能到屏幕外面&#xff1b; 看一下相…

太赫兹频段耦合器设计相关经验总结

1拿到耦合器的频段后&#xff0c;确定中心频率和波导的宽度和高度 此处贴一张不同频段对应的波导尺寸图 需要注意的是1英寸 2.54厘米&#xff0c;需注意换算 具体网址&#xff1a;矩形波导尺寸 | 扩维 (qualwave.com) 仅列举我比较常用的太赫兹频段部分 2.以220~320GHz频段&a…

《后疫情时代大众行为及情感变化研究报告》|人们的饮食、工作、运动、社交、娱乐、学习、购物有哪些改变?

疫情三年&#xff0c;改变了很多人的生命轨迹。有人长期居家&#xff0c;宅出了一身的厨艺&#xff1b;有人启动线上模式&#xff0c;习惯了居家办公&#xff1b;有人失去了工作&#xff0c;生活一度陷入困境&#xff1b;有人痛定思痛&#xff0c;准备换个城市换个活法。 个体…

项目管理工具dhtmlxGantt甘特图入门教程(十六):数据序列转化为XML和JSON

这篇文章给大家讲解dhtmlxGantt将数据转化为XML何JSON格式。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun&#xff1a;764148812&#…

提取DWI数据的FA和MD

DWI简介 扩散加权磁共振成像&#xff08;DWI &#xff09;是使用特定的 MRI 序列以所获得的脑成像数据&#xff0c;该成像手段依靠水分子的扩散在 MR 图像中产生对比度。优于组织中的分子扩散不是自由的&#xff0c;而是反映了与许多障碍物&#xff08;例如大分子&#xff0c;纤…

福特FORD EDI流程指南

在此前的文章&#xff1a;福特FORD EDI需求分析中&#xff0c;我们为大家介绍了福特FORD的EDI平台——GEC Hub。与福特FORD建立EDI连接需要基于这个平台来进行。 供应商通过GEC Hub与福特建立EDI连接&#xff0c;需要做如下准备&#xff1a; 1.获得GSDB代码以及供应商代码 2.在…

是不是只能学IT互联网技术才有发展前途?

当然不是&#xff0c;三百六十行&#xff0c;行行出状元。 但我们需要认清一个现实是&#xff0c;我们正处于一个信息爆炸的时代&#xff0c;掌握紧跟潮流的技术&#xff0c;才可以让我们更自信地面对每天的生活&#xff0c;才有多余的精力、财力来享受生活。“人生在世&#…