当要建立一个相对复杂的数字电路时, 一个方便高效的内存组件是必要的, 能极大简化电路的复杂度, 并减少电路模拟中的各种卡顿.
circuitjs 中集成了这样一个内存模块, 下面简述其常规使用方法.
引入
可以通过点击菜单-绘制-数字芯片-添加静态随机存储器
来进入添加内存模块状态, 之后按住鼠标左键拖动即可添加一个内存模块, 默认形状如下图:
标签引脚
可以分成三类: 使能引脚, 地址引脚和数据引脚.
使能引脚
使能引脚包括 WE 和 OE:
- WE: Write Enable, 表示写入模式
- OE: Output Enable, 表示输出(读取)模式
注: 引脚标记字母的上划线表示 低电平有效, 因此缺省情况下, 两者均有效.
如果置入高电平, 则表示禁止相应功能
地址引脚
A0~A3 为地址引脚, 默认 4 位, 可以寻址 2^4=16 个不同地址.
注: A 为 Address, 即地址
通过在这些引脚上置入不同的高低电平, 可以读取或写入不同地址上的存储的数据
数据引脚
D0~D3 为地址引脚, 默认 4 位, 可以存储一个四位数据, 共 2^4=16 个不同的值.
注: D 为 Data, 即数据
在输出(读取)模式下, 可以从这些引脚读到相应地址下的数据.
在写入模式下, 通过在这些引脚上置入不同的高低电平, 可以在地址线指定的地址中写入相应数据.
位数调整
默认情况地址和数据都是 4 位, 可以通过双击组件进行编辑, 然后调整位数:
# of Address Bits
表示地址位数, 决定能寻址的最大数量.# of Data Bits
表示数据位数(比特数), 即单位地址上的数据容量, 限制了能表示数的最大范围. 如果想一次存取一字节(byte), 可以将其设置为 8 位.
如下图所示, 设置为 5 位地址, 8 位数据, 并把显示的方向(Flip X/Y)改为横向:
基础使用方式
如下电路为一个基础的使用模式.
- 左上角的控制信号控制是写入还是读取模式. 非门控制同时只会处于一种模式下.
图中为读取模式, 信号改为高电平则处于写入模式.
- 左下地址部分 A3~A0 指定要操作数据的地址.
图中地址为 1000, 即地址 8.
- 右边数据端用于对外输出或接受输入.
图中为输出模式, 值显示在右上角, 为 1010, 即 10 进制的数字 10.
注: 为隔离输入输出, 使用了一些二极管进行单向流动限制, 并加入与门与控制信号一起控制是否要进行写入.
点击下述链接打开此示例电路:
Tag::静态 RAM 内存组件可互动操作示例
https://cc.xiaogd.net/?startCircuitLink=book/spcp/assets/circuit/circuitjs/circuit-static-ram-sample.txt
数据初始化
在上述模型中, 尽管通过操作数字开关, 也可以给内存的不同地址存入不同的数据. 但当数据量特别多时, 操作还是挺麻烦.
为此, 组件提供了另外一种便捷的批量数据初始化方式.
双击组件(或 右键–编辑)可打开编辑组件窗口, 在下方的 Contents 一栏中, 可以一次性录入批量数据.
注: 通过
Load Contents From File
按钮还可以通过文件方式载入数据
数据录入格式如下:
- 每行开头最前面的数据为起始地址
- 地址之后接一个冒号, 再之后接多个以空格隔开的数据, 地址编号也相应增加
在上述示例中:
- 第一行地址 0~7 这 8 个地址分别存储了数据 15 1 2 3 7 6 5 4 这 8 个数据.
- 第二行地址 8~15 这 8 个地址分别存储了数据 10 9 8 7 7 6 1 1 这 8 个数据.
注: 地址及数据的值不应超过相应地址和数据位数(bits)所能表示的范围.
关于内存模块的使用就介绍到这里.