FPGA知识基础之RAM--基于IP核的单端口RAM设计

news2025/1/10 3:14:45

目录

  • 一、RAM简介
    • 1.1 基本特性
    • 1.2 RAM对电脑性能的影响
    • 1.3 RAM的应用场景
  • 二、存储器的分类
    • 1.存储器分类
    • 2.RAM分类
  • 三、实验任务
  • 四、程序设计
    • 1.系统模块
    • 2.波形绘制
    • 3.IP核设置
    • 4.代码编写
      • RTL代码
      • Testbench代码
  • 五、仿真



提示:以下是本篇文章正文内容,下面案例可供参考

一、RAM简介

RAM,全称为Random Access Memory,即随机存取存储器,是计算机内部数据存储的核心组件,对电脑的流畅运行至关重要。

1.1 基本特性

  • 随机存取:RAM允许数据在任何位置被直接读取或写入,无需按照特定顺序,这一特性使其成为处理数据的高速缓存区,能迅速响应CPU的指令。
  • 易失性存储:RAM是一种易失性存储器,意味着当电脑关闭或断电时,RAM中的数据会立即消失,无法保留。这是因为RAM依赖电流来维持数据的存储状态。

1.2 RAM对电脑性能的影响

  • 容量:RAM的容量越大,电脑能够同时处理的数据量就越多,从而提高了多任务处理的效率。
  • 速度:RAM的速度越快,数据在RAM和CPU之间的传输就越迅速,使得电脑在处理复杂任务时更加流畅。

1.3 RAM的应用场景

  • 数据存储与缓存:RAM可用于存储配置数据、参数、算法数据和图像数据等,实现快速读写操作,提高系统性能。同时,它也可用于临时存储频繁访问的数据,以提高系统响应速度。
  • 图像处理:在图像处理领域,RAM可用于图像帧缓存和存储图像滤波系数等。
  • 数据交换与共享:RAM可作为不同模块之间的数据交换区域,实现数据的共享和交互。

二、存储器的分类

1.存储器分类

在这里插入图片描述

2.RAM分类

单端口RAM,简单(伪)双端口RAM,双端口RAM

在这里插入图片描述

在这里插入图片描述

三、实验任务

使用vivado软件生成一个单端口的RAM并对其进行读写操作,然后通过仿真观察波形是否正确,最后用在线调试工具对实验结果进行验证。如:将RAM设置的深度和宽度分别为32和8进行读写测试

四、程序设计

1.系统模块

在这里插入图片描述

在这里插入图片描述

2.波形绘制

在这里插入图片描述

3.IP核设置

由于实验任务要求深度为32,宽度为8,因此需要对IP核进行简单的设置
在这里插入图片描述

4.代码编写

RTL代码

ram_rw模块

module ram_rw (
input                   clk,
input                   rst_n,
input        [7:0]      ram_rd_data,//RAM读出的数据

output       reg        ram_en,//使能信号
output                  ram_we,//读写信号
output   reg  [4:0]     ram_addr, //地址
output   reg  [7:0]     ram_wr_data //ram写入的数据
);

reg        [5:0]    rw_cnt;

assign ram_we = (rw_cnt <= 6'd31 && ram_en == 1'b1)? 1'b1 : 1'b0;
    
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
    ram_en <= 1'b0;
    else
    ram_en <= 1'b1;   
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
    rw_cnt <= 6'b0;
    else if(ram_en)
    rw_cnt <= rw_cnt + 6'b1;
    else if(ram_en && rw_cnt == 6'd63)
    rw_cnt <= 6'b0;
    else
    rw_cnt <= 6'b0;
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
    ram_addr <= 5'b0;
    else if(ram_en && ram_addr == 5'd31)
    ram_addr <= 5'b0;
    else if(ram_en)
    ram_addr <= ram_addr + 5'b1;
    else
    ram_addr <= 5'b0;
end


always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
    ram_wr_data <= 8'b0;
    else if(ram_we && ram_wr_data < 8'd31)
    ram_wr_data <= ram_wr_data + 8'b1;
    else
    ram_wr_data <= 8'b0; 
end


endmodule

TOP模块

module ip_1port_ram(
input           sys_clk,
input           sys_rst_n
);

wire       [7:0]            ram_rd_data;
wire                        ram_en;     
wire                        ram_we;     
wire        [4:0]           ram_addr;  
wire        [7:0]           ram_wr_data;

ram_rw  u_ram_rw(

        .clk                 (sys_clk),
        .rst_n               (sys_rst_n) ,
        .ram_rd_data         (ram_rd_data), 
        .ram_en              (ram_en),
        .ram_we              (ram_we),
        .ram_addr            (ram_addr),
        .ram_wr_data         (ram_wr_data) 

);


blk_mem_gen_0 u_blk_mem_gen_0(
  .clka                 (sys_clk),   
  .ena                   (ram_en),     
  .wea                   (ram_we),     
  .addra                 (ram_addr), 
  .dina                 (ram_wr_data),   
  .douta                (ram_rd_data)  
);

endmodule

Testbench代码

`timescale	1ns/1ns //仿真的单位/仿真的精度s
module tb_ip_1port_ram();

parameter CLK_PERIOD = 20;

reg 		sys_clk;  //周期20ns
reg 		sys_rst_n; //并非所有的输入都是reg,根据代码编写情况


initial begin
	sys_clk <= 1'b0;
	sys_rst_n <=1'b0;
	#200 
	sys_rst_n <= 1'b1;
end

always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
	


 
ip_1port_ram   u_ip_1port_ram (
    .sys_clk     (sys_clk),
	.sys_rst_n   (sys_rst_n)

 );
 
 
 
 endmodule
 
 

五、仿真

vivado和modelsim联合仿真

在这里插入图片描述

在这里插入图片描述

仿真结果验证成功!

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

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

相关文章

WebRTC 初探

前言 项目中有局域网投屏与文件传输的需求&#xff0c;所以研究了一下 webRTC&#xff0c;这里记录一下学习过程。 WebRTC 基本流程以及概念 下面以 1 对 1 音视频实时通话案例介绍 WebRTC 的基本流程以及概念 WebRTC 中的角色 WebRTC 终端,负责音视频采集、编解码、NAT 穿…

【书生大模型实战营第三期】基础岛 第2关 8G 显存玩转书生大模型 Demo

欢迎大家参与第三期书生大模型实战营&#xff01;&#xff01;&#xff01; 1. 基础任务 任务描述&#xff1a;使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署&#xff0c;并生成 300 字小故事&#xff0c;记录复现过程并截图。 1. 首先创建开发机&#xff0c;并建立远程链…

操作系统03:调度算法和文件系统

文章目录 调度算法进程调度算法先来先服务调度算法最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法最高优先级调度算法 内存页面置换算法最佳页面置换算法&#xff08;OPT&#xff09;先进先出置换算法&#xff08;FIFO&#xff09;最近最久未使用的置换算法&…

电赛必备-TI开发板MSPM0G3507开发应用教程-环境配置

这篇文章将手把手详细介绍如何安装及环境配置对MSPM0G3507进行开发 这个网址是TI德州仪器的官网&#xff1a; 模拟 | 嵌入式处理 | 半导体公司 | 德州仪器 TI.com.cn 这个网址直接复制&#xff0c;进入即可跳转我们需要的内容页面https://www.ti.com.cn/tool/cn/LP-MSPM0G350…

LLaMA- Adapter V2: Parameter-Efficient Visual Instruction Model

发表时间&#xff1a;28 Apr 2023 论文链接&#xff1a;https://arxiv.org/pdf/2304.15010 作者单位&#xff1a; Shanghai Artificial Intelligence Laboratory Motivation&#xff1a;如何有效地将大型语言模型 (LLM) 转换为指令追随者最近是一个流行的研究方向&#xff0…

MyBatisPlus简介及入门案例

MyBatisPlus简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&…

【知识跨境电商API接口丨python数分实战】国际电商平台用户成交转化分析

今天这篇文章将给大家介绍国际电商平台用户成交转化分析案例。 01 初步思路 问题已经明确 GMV的下降&#xff0c;可能出在用户下单成交环节。 这里需要明确GMV下降是今年与去年相比吗&#xff1f;明确GMV下降到底如何判断出来的&#xff1f;对比的对象是什么&#xff1f;如…

2024免费文案生成器,一键生成原创文案

在自媒体时代的今天&#xff0c;文案创作需求日益增长&#xff0c;无论是营销推广、社交媒体运营&#xff0c;还是品牌宣传、内容创作&#xff0c;优质的文案都起着至关重要的作用。对于文案创作者来说&#xff0c;如何在有限的时间内创作出吸引人、有价值且独特的文案&#xf…

【Linux】成功解决“appropriate BINARY mode and that you have compiled UnZip properly”

【Linux】成功解决“appropriate BINARY mode and that you have compiled UnZip properly” 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393;…

xss漏洞(五,xss-labs靶场搭建及简单讲解)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文基于github上的xss-labs靶场以及PHP study进行操作。 一&#xff0c;靶场环境搭建。 1, 下载并解压到phpstudy的www目录下。 同前文一致&#xff0c;将文件…

分数化小数(Fractions As Decimals)

题目描述 给定一个以十进制表示的分数 a/b,保证 a<b,请将它化成一个二进制的小数。 若存在循环节,用圆括号表示循环节。例如: ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ …

【Qt】状态栏

目录 一.状态栏 1.简述状态栏 二.QStatusBar 1.概念 2.QStatusBar的属性 3.QStatusBar常用成员函数 三.代码创建状态栏 1.创建状态栏 2.在状态栏上显示实时信息 3.在状态栏上显示永久信息&#xff08;通过label&#xff09; 4.在状态栏中创建进度条 一.状态栏 1.简…

用OpenCV与MFC写一个简单易用的图像处理程序

工厂里做SOP及测试报告以及员工资格鉴定等常需用到简单的图像处理&#xff0c;PS等软件正版费用不菲&#xff0c;学习起来成本也高。Windows自带的图像处理软件&#xff0c;用起来也不是那么得心应手。因此我用OpenCV与MFC写了一个简单易用的图像处理程序。 程序界面 基于简单…

书生大模型学习笔记1 - 连接云端开发机

申请InternStudio开发机&#xff1a; 这里进去报名参加实战营即可获取 书生大模型实战营 InternStudio平台 创建开发机 SSH连接开发机&#xff1a; SSH免密码登录 本地创建SSH密钥 ssh-keygen -t rsa打开以下文件获取公钥 ~/.ssh/id_rsa.pub去InternStudio添加公钥 …

【iOS】—— autoreleasePool以及总结

autoreleasePool以及总结 1. 什么是autoreleasePool2. autoreleasePoolPageobjc_autoreleasePoolPush方法&#xff1a;objc_autoreleasePoolPop方法&#xff1a;tokenkill()方法 3. 总结3.1 autoreleasePool的原理3.2 autoreleasePool的问题3.2.1 autoreleasepool的嵌套操作3.2…

进程学习

今天开始了进程的学习&#xff0c;主要讲了进程的一些命令以及进程的创建、进程的调度、进程相关的函数接口和进程消亡。在函数接口中要注意子进程和父进程的关系以及回收顺序&#xff0c;避免出现僵尸进程。

C基础练习(学生管理系统)

1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提示“成绩表为空&#xff01;请先使用命令 T 录入学生成绩。” 同理&#xff0c;当…

【为什么不要买运营商的机顶盒?解锁智能电视新体验,从一台刷机机顶盒开始】

【置顶:机顶盒刷机步骤请跳转此链接】 在这个数字化飞速发展的时代&#xff0c;电视早已不再是单一的播放工具&#xff0c;它正逐步演变成为家庭娱乐与信息获取的综合中心。然而&#xff0c;许多家庭在选择机顶盒时&#xff0c;往往会因为惯性或便利而直接选择运营商提供的机顶…

基于Tasking编译器AURIX TC3xxDemo工程创建

1、示例代码获取 1.1 英飞凌AURIX系列示例代码路径 Infineon/AURIX_code_examples: This repository contains code example projects for the AURIX™ Development Studio. (github.com) 1.2 代码获取 源代码获取有两种方式&#xff0c;一种通过git拉到本地仓库&#xff0…

修改微信(3.9.10.19版本)系统托盘图标(傻瓜教程)

微信版本&#xff1a; 进行以下操作先退出微信 1.iconfont Logo下载一个图标png&#xff0c;大小为256像素&#xff0c;前面颜色自己看着弄 2.png转ico,转化链接&#xff08;转化的网站很多不一定非要是这个&#xff09; 3.下载后续所需程序&#xff08;ResHacker和IconWo…