首页 > 其他分享 >vivado RAM IP核的使用

vivado RAM IP核的使用

时间:2024-11-05 23:18:24浏览次数:7  
标签:clk IP RAM vivado wr rst data

目录

RAM(Random Access Memory )简介 

配置RAM

单口RAM

程序设计 

testbench

 仿真结果


RAM(Random Access Memory )简介 

        当我们做相关项目时,经常会遇到存储数据的问题,数据量过大时,我们可以将其存储在 FPGA 芯片的外设存储器上,比如sdram、 ddr sdram 等,然而访问这些外设存储器相对比较麻烦,因此当数据量较小时,我们可以直接使用 FPGA 芯片内部自带的 IP 生成的 RAM。 RAM (random access memory)是随机存储器的意思, ram 可以按照所需进行随机读/写,掉电后数据丢失。

配置RAM

打开IP Catalog,配置ROM用的也是这个IP核

 配置IP核,有多种模式可选择:单口RAM,简单双口RAM,真双口RAM,单口ROM,双口ROM

单口RAM

“WRITE_FIRST” 模式,写操作时,输出端口会将当前写的数据输出。(ASIC中又称“write through”,或AWT,Async)
“READ_FIRST” 模式,写操作时,输出端口会将当前写地址的原数据输出。
“NO_CHANGE”模式,写操作时,输出端口会保持原值不变。只有在读操作的过程中输出端口才会变化

 

summary中检查无误点击OK生成IP核

程序设计 

深度为16384,位宽为16bit的RAM,写数据为wr_addr,写完就读,读完就写,并使用testbench进行仿真

`timescale 1ns / 1ps

// 单口RAM
module ram_ctrl(
    input clk,
    input rst_n,

    //input [15:0] wr_data,  // 写入数据
    output [15:0] rd_data // 读出数据

);



parameter Depth = 16384;


reg wr_en; //高电平时向RAM中写入数据,低电平时从RAM中读出数据
reg [13:0] wr_addr; // 写地址  ---深度为16384
reg [13:0] rd_addr; // 读地址
wire [13:0] addr; // 地址

wire [15:0] wr_data;
assign wr_data = wr_addr ;  //写入数据

//----------------- wr_en
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        wr_en <= 1'b1;
    else if(rd_addr == Depth - 1)     // 读完了
        wr_en <= 1'b1;
    else if(wr_addr == Depth - 1)     // 写完了
        wr_en <= 1'b0;
    else
        wr_en <= wr_en;
end

//----------------- wr_addr
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        wr_addr <= 'b0;
    else if(wr_en) begin
        if(wr_addr == Depth - 1)
            wr_addr <= 'b0;
        else 
            wr_addr <= wr_addr + 1'b1;
    end
    else
        wr_addr <= 'b0;
end




//----------------- rd_addr
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        rd_addr <= 'b0;
    else if(!wr_en) begin
        if(rd_addr == Depth - 1)
            rd_addr <= 'b0;
        else 
            rd_addr <= rd_addr + 1'b1;
    end
    else
        rd_addr <= 'b0;
end

// ------------------ addr
assign addr = wr_en?wr_addr:rd_addr;


adc_data_ram adc_data_ram_inst(
    .clka(clk),   // 50Mhz
    .ena(1'b1),
    .wea(wr_en), // 写使能
    .addra(addr), // 地址 -------读/写
    .dina(wr_data), // 写数据
    .douta(rd_data) // 读数据
);

endmodule

testbench

`timescale 1ns / 1ps

module tb_ram_ctrl();

reg clk;
reg rst_n;
wire [15:0] rd_data;



initial begin
    clk = 1;
    rst_n = 0;
    #3000;
    rst_n = 1;

end

always#10 clk = ~clk;




ram_ctrl ram_ctrl_inst(
    .clk(clk),
    .rst_n(rst_n),
    .rd_data(rd_data)
);

endmodule
 仿真结果

 把显示格式改成analog,可以直观地看看

标签:clk,IP,RAM,vivado,wr,rst,data
From: https://blog.csdn.net/2301_79235594/article/details/143486390

相关文章

  • 在 Windows 11 中,如果在 WSL2 中使用了 mirrored 或 virtioproxy 模式,而子系统的 IP
    在Windows11中,如果在WSL2中使用了mirrored或virtioproxy模式,而子系统的IP地址与主机地址相同,通常这与WSL2的网络配置和虚拟化模式相关。1. 理解 mirrored 和 virtioproxy 模式mirrored模式:通常在虚拟化环境中,mirrored网络模式意味着虚拟机(或者在此情况下......
  • CSP2024 前集训:NOIP2024加赛 1
    前言赛时本来rk3,赛后自己加hack卡自己于是成rk4了。因为这场是假做法大战,T1假贪心有\(92pts\);T2\(O(n^2m)\)能过(是因为数据里\(m\le10\));T3相当抽象,赛时我打的爆搜只加了一个剪枝能得\(70pts\),赛后发现无解的时候会跑满,于是提前判掉无解就过了甚至最优解\(30ms\)......
  • 什么是pipeline?
    一、概念    pipeline,中文名称又称为管线、传输途径,直译起来有点蹩脚,我们可以理解成它就是一个把各个工具串起来的一个流水线。这里,我们常见的主要有两类pipeline,一类是sklearn中的pipeline,一类是Transformers库中的pipeline。二、sklearn中的pipeline      ......
  • 多校A层冲刺NOIP2024模拟赛18
    多校A层冲刺NOIP2024模拟赛18\(T1\)A.选彩笔(rgb)\(100pts/100pts\)观察到\(0\ler,g,b\le255\)且答案具有单调性,故考虑二分答案。将\(r,g,b\)分别抽象成三维坐标下的\(x,y,z\)。设当前二分出的答案为\(mid\),由调整法分析可知若存在一个边长为\(mid\)的......
  • NOIP模拟(flandre、meirin、sakuya、scarlet) - 模拟赛总结
    flandre做得挺久的,大约做了\(\rm1h+\)。首先,选出来的序列一定是升序的,因为交换升序序列中的任意两个都不可能让「感觉效果」更高。然后来看选那些数组成这个序列。接下来是我赛时的想法:如果全为正数,那么自然正数全部都得选。需要考虑的是负数的情况。首先,选择一个负数不仅......
  • \\:ip 访问网络上的SMB共享目录、IP接口传输数据、ftp://ip ftp传输
    一、访问网络上的SMB共享目录1.导入JAR包 <!--访问网络上的SMB共享目录--> <dependency> <groupId>com.hierynomus</groupId> <artifactId>smbj</artifactId> <version>0.13.0</version> </dependency>2.使用//定义......
  • javascript跨域问题排查
    什么是跨域问题跨域是指浏览器从一个域名的网页去请求另一个域名下的资源。出于安全考虑,浏览器会限制这种跨域请求。例如,网页http://example1.com中的JavaScript代码尝试去获取http://example2.com的数据,这就会触发跨域问题。同源策略规定,只有当协议(如http、https)、域名(如ex......
  • Javascript 代码规范
    JavaScript代码规范是编程时遵循的一套规则和最佳实践,以确保代码的可读性、可维护性和一致性。以下是一些关键的JavaScript常见代码规范:1.使用严格模式在所有脚本文件或函数开头添加‘usestrict’;声明,以启用严格模式(strictmode),这有助于捕获潜在的错误并避免不明......
  • 静态库、动态库、framework、xcframework、use_frameworks!的作用、关联核心SDK工程和
    1.1库的概念库:程序代码的集合,编译好的二进制文件加上头文件供使用,共享程序代码的一种方式。1.2库的分类根据开源情况分为:开源库(能看到具体实现)、闭源库(只公开调用的的接口,是编译后的二进制文件,看不到具体实现,使用时链接即可。)闭源库分为:动态库.td(之前叫.dylib)或.framework......
  • [61] (多校联训) A层冲刺NOIP2024模拟赛18
    无论从什么意义上都能称得上挂75分的一场A.选彩笔好题答案显然可以二分突然发现我好像专长二分答案钦定最大差值\(dx\),将所有物品以\((r,g,b)\)看成三维空间坐标内的点,原问题可以转化成问空间里一个边长为\(dx\)的立方体内是否有至少\(k\)个点考虑到值域不大,可......