【mackler玩数电】4KB的ram


作品镇楼。
总的容量为4KB,16位为一个单元,共2048个单元,11位地址。
第一次尝试数电,大触勿喷。


由于我是布线渣,同时玩弄16根线实在hold不住,因此该RAM其实是16个1位RAM组合起来的,如图,可以看到明显的16层,每层是一个2048个单元的1位RAM,这类似于现实中的RAID0的方式,当然现实中RAID0可以提高硬盘访问速度,MC里面不会,但是可以减少布线的压力,毕竟在每一层,只需要玩弄1位的数据线。相比16bit一个单元直接在物理上放在一起,是有不少优势的。


RAM单元进行了三维的堆叠,高度方向堆叠了16次,每个单元水平占地2x5,密集堆叠。其中包括了数据、信号等线路(确保可以三维的堆叠)
=========================================================================
接口:包括11位地址线,16位输入数据线(用于写操作),16位输出数据线(用于读操作),以及一根删除线(用于清空地址所指单元的数据,用作写使能)。地址线为橙色,输入数据线为绿色,输出数据线为红色,写使能为蓝色线。
由于我是布线渣,只把地址线整理了一下,其余接口都没有整理,全部集中在地址线旁边的竖棱上。
=========================================================================
存档:http://pan.baidu.com/s/1bnfJhvx

楼主 maple_in_thu  发布于 2015-03-22 01:08:00 +0800 CST  
简单的介绍一下整个RAM吧,存储核心是这样一个RS锁存器,


(注:左侧粘土块的右边插着一个红石火把)
锁存器有两个状态,即右侧两个粘土上的红石线是亮还是灭,这就是整个RAM存储数据的方式。


RS锁存器有两级,分别是半砖上的红石线和粘土上的红石线,两个状态保持相反,随便对其中一级输入亮信号,输入撤走之后会保持这个状态。

楼主 maple_in_thu  发布于 2015-03-22 15:31:00 +0800 CST  
我们存储的数据是放在RS锁存器的粘土上红石线那一级,将这一级两端接上半砖半导体,分别作为输入和输出

半砖半导体的好处一方面避免了串信号,另一方面由于有了高低,可以用活塞控制截断。


如图,只要拉杆所在的红石接受到信号,输入和输出都会被屏蔽,以此,我们可以在2048个这样的单元中选择我们想要的单元进行读写操作。
除此之外,如果我们要写入的时候,首先得将粘土这一级变成灭状态,然后如果输入信号是亮,则会重新点亮,输入信号是灭,则粘土级保持灭。
做法是在半砖这一级输入亮信号。同样为了控制,我们做成半砖半导体

同样也加上活塞来控制


楼主 maple_in_thu  发布于 2015-03-22 15:41:00 +0800 CST  
我们简单标记一下,方便大家了解这个单元怎么使用


如图,每个单元有3个输入信号和1个输出信号:
分别是图中拉杆(亮:屏蔽此单元,灭:使用此单元),绿色粘土(写入的数据),红色粘土(读取出的数据),蓝色粘土(单元清零)
==========================================
这里先说明一下现实中的存储设备接口一般是怎样的,一般有3个接口:数据线、地址线、写使能。
数据线既负责读取又负责写入。
读取:写使能保持高电位时,为读取模式。写使能是高电位的时候,地址线是多少,数据线就是对应地址的数据,地址线改变之后,数据线经过一定延迟出现改动后地址的数据。
写入:写使能保持高电位,先在数据线和地址线上准备好数据和地址,然后拉低写使能,在拉低的信号的瞬间,数据被写入地址。
===========================================
咋一看,似乎和我这里不太一样,这里我做了2个调整,一个是将读取数据线和写入数据线分开,个人感觉这个在cpu的设计中也有好处,方便解决流水线中的结构冲突,现实中这么做应该是为了减少引脚数量。
另外,我们的蓝色粘土一定程度上可以看作写使能信号,稍微有所区别的是,我们如果写入的是1,是在修改写入数据的瞬间就完成了,而写入0,则等蓝色粘土信号过来才置为0。
===========================================
所以,当我们要操作这个单元的时候,先松开拉杆(相当于设置了地址),此时输出数据线(红色线)上即出现了这个单元读出的数据,如果要写入数据,在输入数据线(绿色线)上设置好0或者1,接着在蓝色线上输入一个脉冲即可写入。

楼主 maple_in_thu  发布于 2015-03-22 15:58:00 +0800 CST  
当然,如果堆叠起来,我们肯定是用红石信号来替代拉杆,并且要保证这样一个结构相互堆叠的时候不串线,于是有了如下风骚的走线

顶端这根红石线就决定了这个单元有没有被屏蔽。
我们最终要完成的RAM,就是用这个红石线(片选信号),根据地址,选中整个ram中的一个(只有选中的单元,片选信号为0,其余都为1),接着将输入信号和输出信号连到这里。


因为这样的红石单元经常是平面堆叠的,有行列两个纬度,一种做法是分别输入行和列,在每个交点用一个与门来选择,只有行和列同时选中的单元不被屏蔽。


不过我的这个RAM不是这么做的,在我的RAM中,用行地址,选中一整行的单元。

如图,将刚刚的结构水平两个方向上堆叠了2048个单元。单元的水平大小是2x5,其中2的方向堆叠了64行,5的方向堆叠了32列。上面的片选信号连接起来变成一行。


列的选择是控制了信号的输入输出。
当选中了行之后,我只将输入信号输入到特定列中,只将特定列的输出信号接入到最后输出的地方。这样就能确保只操作了1个单元。同时避免了二维的选择(布线略蛋疼)
每一列的输入输出都连接到一起
这图中一列的输入数据线。

楼主 maple_in_thu  发布于 2015-03-22 16:11:00 +0800 CST  

在每一列的2个输入信号和1个输出信号的出入口,用一个半导体+活塞设置一个开关,就可以控制是否输入/输出这一列了。然后将不同列的输入输出信号连起来,接到最终的输入输出处。


现在输入信号的连接问题都解决了,操作之前,我们要决定一下,选哪一行、哪一列。


上面2个图分别是行的片选信号和列的片选信号,间隔分别为1和4。其中一个是64根信号线,另一个是32根信号线,使用的时候每次只有一个信号线是灭状态。


于是要解决的问题就是如何将地址转换正这样的片选信号
用的就是译码器。

楼主 maple_in_thu  发布于 2015-03-22 16:18:00 +0800 CST  
译码器设计的是一个较为通用的译码器,以列的选择为例,输入5根信号,从00000~11111,总共32个数字,输出为32个片选信号,用下图的方式交叉起来。

每个交叉点选择取不取非,接上红石线或者红石火把。



这样可以做任意的解码要求。
基本流程是 真值表->未化简的逻辑表达式->各个节点要不要非门。
当然我们这种规律性特别强,最低位1位交错非门,之后2位交错、4位交错、8位交错……

楼主 maple_in_thu  发布于 2015-03-22 16:24:00 +0800 CST  
啊对了,刚刚说了那么久,只是一层的结构,每个单元也只是1位,要做成16位的,那就把单元复制上去,信号传递上去就行啦,要传递的其实只有片选信号和蓝色线(使能信号),至于数据线,那是每层相互独立的

可以看到左边一片白色的半砖上传着红石信号,右边只有一排,上传的是蓝线信号。而片选信号则是在右边的彩色粘土中盘旋着爬上去了。
============================================================
整个结构体积利用率还算比较高,充分利用了3个纬度,也使用了一中比较新型的布局方式(数据的不同位存放在不同层)
最后申精@天空之城TCD

楼主 maple_in_thu  发布于 2015-03-22 21:37:00 +0800 CST  

楼主:maple_in_thu

字数:2925

发表时间:2015-03-22 09:08:00 +0800 CST

更新时间:2016-03-15 11:39:16 +0800 CST

评论数:155条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看