HDL下理解RAM8¶
本文是在HDL下理解RAM的组成原理!!
已经拥有的门基础¶
在过去已经使用了NAND、Or、And、not搭建了很多逻辑门了。包括数据选择器和数据分配器(Mux8Way16、DMux8Way)
以及,一个内置的DFF触发器:一个基本的存储器,存储单比特的存储器。
我们使用了DFF,给他加入了保持和置数的功能,把它扩展成了寄存器:一位寄存器Bit、16位寄存器Register
什么是RAM8¶
Random Access Memory8
一个8个存储单元的RAM芯片,每个单元可以放一个16位数据
-
Function功能
- 输出指定address中存储的数据
- 输入数据存入到指定的address中
-
输入口
- in[16]
- load
- address[3]
- 输出口
- out[16]
对输入的解读:当我们输入十进制数的时候,会自动转成二进制,二进制才是机器看的懂的语言。比如:5->101
被忽略的时钟信号:当时钟信号变化一次(tick tock),才能执行一次操作。否则就一直输出out的是上一次的数据。
实现一个RAM8¶
通过8个寄存器,结合数据选择器和分配器,搭建具有取值和读写功能的存储器。
思路: 1. 写:因为已经有了一个可以存储16位数据的寄存器Register,如果我们用8个寄存器,就可以实现存8个16位数据了 2. 取值:要根据地址选择输出。用数据选择器Mux8Way16,在8个输入信号中选择一个进行输出。选择的根据是address[3]。比如address=101,则选择第5个信号f,进行输出。 3. 读:数据分配器DMux8Way,找到地址。
CHIP RAM8 {
IN in[16], load, address[3];
OUT out[16];
PARTS:
// Put your code here:
// 完成数据的输出
Mux8Way16(a=oa,b=ob,c=oc,d=od,e=oe,f=of,g=og,h=oh,sel=address,out=out);
// 完成数据的写入
DMux8Way(in=load,sel=address,a=la,b=lb,c=lc,d=ld,e=le,f=lf,g=lg,h=lh);
Register(in=in,load=la,out=oa);
Register(in=in,load=lb,out=ob);
Register(in=in,load=lc,out=oc);
Register(in=in,load=ld,out=od);
Register(in=in,load=le,out=oe);
Register(in=in,load=lf,out=of);
Register(in=in,load=lg,out=og);
Register(in=in,load=lh,out=oh);
}
总结¶
把已经搭建好的元件抽象出来,只需要知道它的功能,不再需要知道它们的底层是如何实现的。
再用这层抽象,去搭建更复杂、功能更完善的元件。比如RAM64 512