静态随机存储器(SRAM):高速缓存的奥秘
目录
基本的静态存储单元阵列
基本的SRAM逻辑结构
1. 概述
2. SRAM阵列
3. 行选择器(Row Decoder)
4. 列选择器(Column Decoder)
5. 读写电路
6. 控制电路
7. 工作过程
SRAM的读/写时序
SRAM 结构概述
读操作时序
读操作概述
读操作时序步骤
读操作时序图
写操作时序
写操作概述
写操作时序步骤
写操作时序图
读/写控制信号
读/写时序总结
存储器容量的扩充
方法一:增加存储单元数量
方法二:多芯片并联扩展
示例:
方法三:多端口 SRAM
方法四:分区地址空间
示例:
示例:多芯片并联扩展存储容量
接线示例
示例代码(伪代码)
在电子工程和计算机系统设计中,高速缓存(cache)是一个至关重要的组件,它显著提升数据访问速度。而构建高速缓存核心组件时,我们将深入研究SRAM的工作原理、逻辑结构、读写时序,并为此准备扩充存储器容量,帮助了解SRAM在现代计算机系统中的可用性。
基本的静态存储单元阵列
SRAM 就像一个由许多小格子组成的网格,每个小格子就是一个静态存储单元,可以存储一个二进制位(0 或 1)。
1. 六晶体管(6T)存储单元
最常见的 SRAM 存储单元是六晶体管(6T)类型,它就像一个由六个开关组成的电路,这六个开关分别是六个晶体管(transistor)。
- 晶体管: 可以简单理解为一种电子开关,可以控制电流的通断。
- NMOS 晶体管和 PMOS 晶体管: 是两种不同类型的晶体管,它们的工作原理有所不同,但都可以用来构建逻辑电路。
2. 存储节点
在 6T 存储单元中,两个交叉耦合的 CMOS 逆变器(inverter)构成了一个存储节点,用来存储一个二进制位。
- CMOS 逆变器: 可以简单理解为一种逻辑电路,当输入为 0 时,输出为 1;当输入为 1 时,输出为 0。
- 交叉耦合: 指的是两个逆变器的输出分别连接到对方的输入,形成一个稳定的回路,可以保持存储状态。
工作原理:
- 当存储节点存储 0 时,其中一个逆变器的输出为 0,另一个逆变器的输出为 1,保持稳定状态。
- 当存储节点存储 1 时,其中一个逆变器的输出为 1,另一个逆变器的输出为 0,保持稳定状态。
3. 存储单元阵列
多个 6T 存储单元按照行和列排列,就构成了 SRAM 的存储单元阵列。每个存储单元都连接到字线和位线,用于读写数据。
- 字线: 用于选择要访问的存储单元的行。
- 位线: 用于读写选定存储单元的数据。
基本的SRAM逻辑结构
1. 概述
静态随机存取存储器(SRAM)是一种重要的半导体存储器,广泛应用于缓存和高速存储场景。SRAM的基本逻辑结构由存储单元阵列、行选择器、列选择器、读写电路和控制电路组成。
2. SRAM阵列
SRAM阵列由行(row)和列(column)组成,每个交叉点对应于一个存储单元。每个存储单元通常由六个晶体管组成,形成一个双稳态触发器,可以稳定地存储一个比特位的数据(0或1)。
- 行(Row):每行包含多个存储单元。
- 列(Column):每列对应一个数据位线,用于传输数据。
3. 行选择器(Row Decoder)
行选择器用于选择存储阵列中的特定行。行选择器是一个解码器,它根据输入的行地址信号,激活对应的行选择信号(word line)。
- 功能:将输入的行地址解码为一个唯一的行选择信号。
- 实现:利用逻辑门和解码器电路,根据输入地址激活特定的行。
4. 列选择器(Column Decoder)
列选择器用于选择存储阵列中的特定列。列选择器根据输入的列地址信号,激活对应的列选择信号(bit line)。
- 功能:将输入的列地址解码为一个唯一的列选择信号。
- 实现:利用多路复用器(MUX)和解码器电路,根据输入地址激活特定的列。
5. 读写电路
读写电路负责在读操作和写操作中,完成数据的存取和更新。
-
读操作:
- 当处理器发出读请求时,行选择器激活相应的字线,选择对应的行。
- 列选择器激活相应的位线,选择对应的列。
- 存储单元的数据通过位线传输到感应放大器(Sense Amplifier),将存储单元的微弱信号放大后输出给处理器。
-
写操作:
- 当处理器发出写请求时,行选择器激活相应的字线,选择对应的行。
- 列选择器激活相应的位线,选择对应的列。
- 将要写入的数据通过位线传输到对应的存储单元,更新存储单元的数据状态。
6. 控制电路
控制电路负责协调和控制读写操作的时序和逻辑。它接收处理器的控制信号并生成行选择信号、列选择信号以及读写使能信号。
- 读写使能信号(Read/Write Enable):用于控制读写操作的执行。
- 地址信号(Address):用于选择存储单元的行和列。
- 数据信号(Data):用于在读写操作中传输数据。
7. 工作过程
- 地址译码:处理器发出地址信号,行选择器和列选择器分别解码行地址和列地址,选择特定的存储单元。
- 读操作:
- 行选择器激活对应的行。
- 列选择器激活对应的列。
- 存储单元的数据通过位线传输到感应放大器,输出给处理器。
- 写操作:
- 行选择器激活对应的行。
- 列选择器激活对应的列。
- 写入数据通过位线传输到存储单元,更新存储单元的数据状态。
SRAM的读/写时序
静态随机存取存储器(SRAM)的读写操作依赖于精确的时序控制。SRAM在设计上实现了相对简单的访问机制,但仍需要确保正确的信号顺序和时间,以实现可靠的操作。以下是对 SRAM 读/写时序的详细介绍。
SRAM 结构概述
SRAM 由一些基本单元组成,这些单元通过行选择器(行译码器)和列选择器(列译码器)进行访问。每个基本单元通常由六个晶体管组成,能够保持其状态而无需周期性刷新。
读操作时序
读操作概述
- 地址输入:提供要读取的存储单元的地址。
- 地址稳定:地址信号需要在整个读操作期间保持稳定。
- 读使能信号:启用读操作的控制信号(通常为
OE
,输出使能)。 - 数据输出:从指定地址的存储单元读取数据,并将其输出到数据总线。
读操作时序步骤
- 地址设置:将要读取的地址输入到地址总线上。
- 地址稳定时间:等待地址信号稳定。
- 读使能信号激活:启用
OE
信号。 - 数据有效时间:等待数据从存储单元传输到数据总线。
- 数据读取:读取数据总线上的数据。
- 读使能信号失效:禁用
OE
信号,完成读操作。
读操作时序图
地址总线 : ──[ADDR]──────────────────────────────
读使能信号 : ────────────[OE]─────────────
数据总线 : ────────────────[DOUT]──────────────
写操作时序
写操作概述
- 地址输入:提供要写入的存储单元的地址。
- 地址稳定:地址信号需要在整个写操作期间保持稳定。
- 数据输入:将要写入的数据输入到数据总线。
- 写使能信号:启用写操作的控制信号(通常为
WE
,写入使能)。 - 数据存储:将数据从数据总线写入到指定地址的存储单元。
写操作时序步骤
- 地址设置:将要写入的地址输入到地址总线上。
- 地址稳定时间:等待地址信号稳定。
- 数据设置:将要写入的数据输入到数据总线上。
- 数据稳定时间:等待数据信号稳定。
- 写使能信号激活:启用
WE
信号。 - 数据写入时间:等待数据写入到存储单元。
- 写使能信号失效:禁用
WE
信号,完成写操作。
写操作时序图
地址总线 : ──[ADDR]──────────────────────────────
数据总线 : ────[DIN]──────────────────────────────
写使能信号 : ────────────[WE]─────────────
读/写控制信号
SRAM 通常具有以下控制信号:
- 地址总线(ADDR):选择要访问的存储单元地址。
- 数据总线(DATA):进行数据传输的双向总线。
- 读使能(OE, Output Enable):控制读操作的信号。
- 写使能(WE, Write Enable):控制写操作的信号。
- 芯片选择(CS, Chip Select):启用或禁用整个 SRAM 芯片。
读/写时序总结
在实际设计中,读/写操作的时序精确控制至关重要。以下是关键点总结:
- 地址稳定时间(tAS):地址信号需要在特定时间内保持稳定,确保正确访问存储单元。
- 数据稳定时间(tDS):写操作中,数据信号需要在特定时间内保持稳定,确保正确写入数据。
- 读/写使能信号宽度(tOE/tWE):读/写使能信号需要在特定宽度内保持有效,确保数据读取/写入操作完成。
- 数据有效时间(tDOUT):读操作中,数据需要在特定时间内从存储单元传输到数据总线。
存储器容量的扩充
在扩展存储器容量时,尤其是对于静态随机存取存储器(SRAM),有几种常见的方法可以实现更大的存储容量和更高的系统性能。以下是关于扩充 SRAM 容量的详细说明。
方法一:增加存储单元数量
增加单个 SRAM 芯片的容量:
- 通过设计和制造具有更多存储单元的 SRAM 芯片来直接增加容量。这种方法涉及提高芯片的密度,使得每个芯片能够存储更多的数据。这通常需要更先进的半导体工艺和制造技术。
方法二:多芯片并联扩展
使用多个 SRAM 芯片并联:
- 通过将多个 SRAM 芯片并联,可以扩展整体存储容量。每个芯片处理一部分数据,总的存储容量是单个芯片容量的总和。
示例:
假设每个 SRAM 芯片的容量为 1MB,通过并联四个这样的芯片,可以实现 4MB 的总存储容量。
方法三:多端口 SRAM
使用多端口 SRAM:
- 多端口 SRAM 提供多个独立的访问端口,允许同时进行多个读写操作。这种结构有助于提高吞吐量和并行处理能力,特别适用于需要高带宽的应用场景。
方法四:分区地址空间
使用多个地址区域:
- 通过将不同的存储区域映射到不同的地址空间,可以有效地管理和利用更大的存储容量。在这种方法中,系统地址总线的一部分用于选择特定的 SRAM 芯片或存储模块。
示例:
假设系统有两个 1MB 的 SRAM 芯片,可以将地址空间范围 0x000000-0x0FFFFF 分配给第一个芯片,范围 0x100000-0x1FFFFF 分配给第二个芯片,从而实现总共 2MB 的可用存储容量。
示例:多芯片并联扩展存储容量
假设我们有多个 1MB 的 SRAM 芯片,需要扩展到 4MB 的总存储容量。
接线示例
-
地址总线:
- 将地址总线连接到所有 SRAM 芯片。对于 1MB 的 SRAM,需要 20 位地址线(2^20 = 1MB)。
- 使用额外的地址位来选择特定的 SRAM 芯片。例如,2 位额外的地址线可以选择 4 个不同的芯片。
-
数据总线:
- 将数据总线连接到所有 SRAM 芯片。数据总线的宽度取决于每个芯片的数据宽度(如 8 位、16 位等)。
-
芯片选择(CS):
- 使用解码器电路将系统的地址线解码为各个 SRAM 芯片的芯片选择信号。
- 例如,使用 2 位地址线和 4 个芯片的解码器,当地址线为 00 时选择第一个芯片,为 01 时选择第二个芯片,以此类推。
示例代码(伪代码)
以下是一个伪代码示例,展示如何在嵌入式系统中实现多芯片并联扩展的逻辑:
#define SRAM1_BASE_ADDRESS 0x00000000
#define SRAM2_BASE_ADDRESS 0x00100000
#define SRAM3_BASE_ADDRESS 0x00200000
#define SRAM4_BASE_ADDRESS 0x00300000#define TOTAL_SIZE (4 * 1024 * 1024) // 4MBvoid write_to_sram(uint32_t address, uint8_t data) {if (address < 0x00100000) {*((volatile uint8_t *)(SRAM1_BASE_ADDRESS + address)) = data;} else if (address < 0x00200000) {*((volatile uint8_t *)(SRAM2_BASE_ADDRESS + (address - 0x00100000))) = data;} else if (address < 0x00300000) {*((volatile uint8_t *)(SRAM3_BASE_ADDRESS + (address - 0x00200000))) = data;} else if (address < 0x00400000) {*((volatile uint8_t *)(SRAM4_BASE_ADDRESS + (address - 0x00300000))) = data;}
}uint8_t read_from_sram(uint32_t address) {if (address < 0x00100000) {return *((volatile uint8_t *)(SRAM1_BASE_ADDRESS + address));} else if (address < 0x00200000) {return *((volatile uint8_t *)(SRAM2_BASE_ADDRESS + (address - 0x00100000)));} else if (address < 0x00300000) {return *((volatile uint8_t *)(SRAM3_BASE_ADDRESS + (address - 0x00200000)));} else if (address < 0x00400000) {return *((volatile uint8_t *)(SRAM4_BASE_ADDRESS + (address - 0x00300000)));}return 0; // 超出范围
}
在实际应用中,SRAM通常与动态随机存储器(DRAM)结合使用,她一种层次化存储体系结构。SRAM作为高速缓存,提供快速的数据访问,而DRAM则提供更大的存储容量。通过对数据的智能管理和缓存,可以提高系统的性能和效率。
相关文章:

静态随机存储器(SRAM):高速缓存的奥秘
目录 基本的静态存储单元阵列 基本的SRAM逻辑结构 1. 概述 2. SRAM阵列 3. 行选择器(Row Decoder) 4. 列选择器(Column Decoder) 5. 读写电路 6. 控制电路 7. 工作过程 SRAM的读/写时序 SRAM 结构概述 读操作时序 读…...

Linux CentOS 7 服务器集群硬件常用查看命令
(一)查看内核:uname -a [rootcdh1 ~]# uname -a Linux cdh1.macro.com 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux(二)查看系统:cat /etc/redhat-releas…...

《Windows API每日一练》5.4 键盘消息和字符集
本节我们将通过实例来说明不同国家的语言、字符集和字体之间的差异,以及Windows系统是如何处理的。 本节必须掌握的知识点: 第31练:显示键盘消息 非英语键盘问题 字符集和字体 第32练:显示默认字体信息 第33练:创建逻…...

【uniapp】uniapp开发微信小程序入门教程
HBuilderx中uniapp开发微信小程序入门教程 一、 环境搭建 1. HBuilderx下载安装 HBuilderx下载安装地址 2. 微信开发者工具下载安装 微信开发者工地址具下载安装 二、创建uniapp项目 选择:文件>新建>项目>uni-app 输入项目名称>选择默认模板>…...

Python爬虫项目集:豆瓣电影排行榜top250
关于整理日常练习的一些爬虫小练习,可用作学习使用。 爬取项目以学习为主,尽可能使用更多的模块进行练习,而不是最优解。 爬虫概要 示例python 库爬取模块request解析模块BeautifulSoup存储类型list(方便存入数据库)…...

34-Openwrt uhttpd与rpcd
uhttpd作为一个简单的web服务器,其代码量并不多,而且组织结构比较清楚。和其它网络服务器差不多,其main函数进行一些初始化(首先parse config-file,然后parse argv),然后进入一个循环࿰…...

uni app 树状结构数据展示
树状数据展示,可以点击item 将点击数据给父组件 ,满足自己需求。不喜勿喷,很简单可以根据自己需求改哈,不要问,点赞收藏就好。其实可以和上一篇文章uni app 自定义 带popup弹窗的input组件-CSDN博客结合使用ÿ…...

KVM在线yum源部署-centos 7
一、虚拟化简介 虚拟化就是操作系统里嵌套操作系统,一台服务器买回来,可能只是用作一个http服务,资源不能充分利用,而虚拟化的诞生有效解决了这个问题,以硬件资源上使用虚拟化,实现单硬件多系统,充分挖掘硬件性能,节能增效。同时通过多年的改进发展,虚拟化进化成云服务…...

TSF的服务发现与Consul有何区别?
TSF(腾讯服务框架)和Consul都是用于服务发现的工具,但它们在设计理念、功能特性、集成方式等方面存在一些区别。 ### 设计理念和目标 **Consul** 是一个开源的工具,用于服务发现、配置和分段。它提供了一种简单的方式来注册和发现服务,以及健康检查和键值存储功能。Consul…...

kotlin集合框架
1、集合框架的接口类型对比 2、不可变和可变List fun main() {// 不可变List - 不能删除或添加元素val intList: List<Int> listOf(1,2,3)intList.forEach{println(it) // 1 2 3}println("")// 可变List - 可以删除或添加元素val mutableList mutableListO…...

服务器(Linux系统的使用)——自学习梳理
root表示用户名 后是机器的名字 ~表示文件夹,刚上来是默认的用户目录 ls -a 可以显示出隐藏的文件 蓝色的表示文件夹 白色的是文件 ll -a 查看详细信息 total表示所占磁盘总大小 一般以KB为单位 d开头表示文件夹 -代表文件 后面得三组rwx分别对应管理员用户-组…...

竞赛选题 python+opencv+深度学习实现二维码识别
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 pythonopencv深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:3分 该项目较为新颖&…...

Java读取指定 JAR 包路径中的 git.properties 文件
Java读取指定 JAR 包路径中的 git.properties 文件 在上述代码中,首先打开 JAR 文件,获取 git.properties 文件的 JarEntry 对象,如果存在该条目,就获取其输入流进行后续的读取和处理。具体的读取和处理逻辑需要根据您的实际需求在…...

逻辑回归(Logistic Regression)及其在机器学习中的应用
🚀时空传送门 🔍逻辑回归原理📕Sigmoid函数🎈逻辑回归模型 📕损失函数与优化🎈损失函数🚀优化算法 🔍逻辑回归的应用场景🍀使用逻辑回归预测客户流失使用scikit-learn库实…...

【计算机视觉】人脸算法之图像处理基础知识【七】
直方图均衡化 直方图均衡化是一种常用的图像处理技术,用于改善图像的对比度,特别是在图像的细节被埋没在暗部或亮部区域时。通过重新分配图像的像素强度值,使得图像的整体对比度增强,从而让更多的细节变得可见。 import cv2 imp…...

家政预约小程序14权限配置
目录 1 创建用户2 创建角色3 启用登录4 实现退出总结 我们现在小程序端的功能基本开发好了,小程序开发好之后需要给运营人员提供管理后台,要分配账号、配置权限,我们本篇就介绍一下权限如何分配。 1 创建用户 在微搭中,用户分为内…...

解决 vue 项目一直出现 sockjs-node/info?t=问题
其实如果是在开发环境,应该是开发的时候网络环境变更导致,比如你切换无线网络,导致开发服务器的IP地址换了,这样开发服务器会不知道如何确定访问源。开发环境中关闭npm dev server,然后重新npm run serve重新构建服务环…...

麒麟信安系统关闭core文件操作
在使用麒麟信安系统时,如果应用程序运行过程中崩溃了,此时并不会导致内核崩溃,只会在tmp目录下产生崩溃数据,如下图 不过tmp目录下的分区容量有限,当崩溃的应用core文件过大时将会占用tmp空间,导致tmpfs分区…...

微信小程序轮播图
效果图 详情可见 微信小程序 参照:swiper | uni-app官网 代码: <!--轮播图-- > <swiper interval"2000" autoplay"true" circular"true" style"height: 300px;"><swiper-item style&qu…...

redisson WRONGPASS invalid username-password pair or user is disable
1、技术架构:若依微服务框架 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version></dependency> <dependency><…...

QT拖放事件之一:初识拖放4大事件处理函数
0、拖放 两个动作,合在一起称之为拖放事件; 拖:就是拖着走; 放:就是拖着走,然后松开鼠标了,释放了,这就是放; 注意:放:拖着的东西要放在什么地方??? 假如,我将一个记事本拖着跑,然后放到一个Widget窗口上,那么为了使得Widget能感知相应的事件(拖着进入事件…...

使用Python进行数据可视化:从基础到高级
使用Python进行数据可视化:从基础到高级 数据可视化是数据分析过程中不可或缺的一部分,通过图形化的方式展示数据,可以更直观地发现数据中的趋势和模式。Python凭借其丰富的库和强大的功能,成为数据可视化的首选编程语言。本文将介绍数据可视化的基础概念、常用的Python库…...

【十二】图解 Spring 核心数据结构:BeanDefinition
图解 Spring 核心数据结构:BeanDefinition 简介 使用spring框架的技术人员都知道spring两个大核心技术IOC和AOP,随着投入更多的时间去学习spring生态,越发觉得spring的发展不可思议,一直都是引领着Java EE的技术变革,这…...

速盾:阿里云ddos黑洞是怎么回事?
阿里云ddos黑洞是一种防御分布式拒绝服务(DDoS)攻击的安全机制。DDoS攻击是指利用大量的合法请求占用目标服务器的资源,从而使服务器无法正常响应合法用户的请求。为了应对这种攻击,阿里云引入了黑洞机制。 黑洞机制是一种主动防…...

File文件转Blob文件,临时路径浏览器可查看
fileToBlob (file) { var reader new FileReader(); reader.readAsArrayBuffer(file); reader.onload function (event) { let blob new Blob([event.target.result], { type: file.type }); //{ type: file.type } 预览blob发现乱码可能是type不对 要获取file文件的type …...

区块链行业DDOS防护痛点在哪
区块链行业DDOS防护痛点在哪?随着区块链技术的迅猛发展,其应用场景已经从最初的数字货币扩展到了金融、供应链、物联网等多个领域。然而,随着区块链行业的快速崛起,其所面临的网络安全威胁也日益严重,尤其是DDoS(分布…...

浏览器自带的IndexDB的简单使用示例--小型学生管理系统
浏览器自带的IndexDB的简单使用示例--小型学生管理系统 文章说明代码效果展示 文章说明 本文主要为了简单学习IndexDB数据库的使用,写了一个简单的增删改查功能 代码 App.vue(界面的源码) <template><div style"padding: 30px&…...

2024年计算机专业还值得选吗?
个人认为可以 一、就业前景广阔 市场需求旺盛:随着数字化和信息化的快速发展,计算机技术已经渗透到各个行业和领域。无论是传统制造业、金融、医疗,还是新兴的互联网、人工智能等领域,都离不开计算机专业人才的支持。因此&#x…...

JSON.parse(JSON.stringify())导致的响应式属性丢失
console.log("formdata赋值前", this.formdata);console.log("row",row);console.log("row序列化后", JSON.parse(JSON.stringify(row)));this.formdata JSON.parse(JSON.stringify(row)); console.log("formdata赋值后", this.formd…...

SpringBoot引入外部依赖包
将需要引入的文件放置到与src同级别的目录下 如上,在src的同级,新建了一个lib目录,将jar包放置其中 在POM文件下,加入如下配置 <dependency><groupId>com.aliyun</groupId><artifactId>com.aliyun.filed…...