《计算机系统要素实验》Pro3: RAM是怎么组成的?

pro3:时序逻辑

文章目录

  • pro3:时序逻辑
          • 1比特位寄存器 Bit
          • Register(16位寄存器)
        • N RAM
          • 8RAM
          • 16kARM

1比特位寄存器 Bit
/** 
* 1-bit register: 
* If load[t] == 1 then out[t+1] = in[t] 
* else out does not change (out[t+1] = out[t]) 
*/

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第1张图片

如果load 选择为1,输出为上一个时间单位的输入

这个是不是和选择器一个画风?

选择器为1,记录后一个值,b = in,sel =load 但是a是什么?输出是什么?

a必然为另一种情况,out(t) = out(t-1) 但是这种关联时间的之前基础门没有呀!

哎,不是刚学了和Nand一样底层的DFF吗?查看功能

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第2张图片

a 就等于 DFF的输出,但是DFF的输入是什么呢?

这里的输入实际上不再是以往的某个变量,而是很有时间循环特色的Bit的输出

构成时间的闭环,才能不断执行

但我没想明白的是DFF居然有两个输出!

    Mux(a = preOut,b=in,sel = load,out=dffIn);
    DFF(in=dffIn,out = preOut,out=out);     
Register(16位寄存器)

相比于1位寄存器Bit,Register只是复制粘贴

Bit(in=in[0],load=load,out=out[0]);
Bit(in=in[1],load=load,out=out[1]);
Bit(in=in[2],load=load,out=out[2]);
Bit(in=in[3],load=load,out=out[3]);
Bit(in=in[4],load=load,out=out[4]);
Bit(in=in[5],load=load,out=out[5]);
Bit(in=in[6],load=load,out=out[6]);
Bit(in=in[7],load=load,out=out[7]);
Bit(in=in[8],load=load,out=out[8]);
Bit(in=in[9],load=load,out=out[9]);
Bit(in=in[10],load=load,out=out[10]);
Bit(in=in[11],load=load,out=out[11]);
Bit(in=in[12],load=load,out=out[12]);
Bit(in=in[13],load=load,out=out[13]);
Bit(in=in[14],load=load,out=out[14]);
Bit(in=in[15],load=load,out=out[15]);

在这里插入图片描述

从第七步到第八步明显能看出寄存器的延时性,在load为1 的时候才可以读写进去,为0 不影响变化

N RAM

8RAM

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第3张图片

这个内存单元不会像之间和与或非那样产生加减乘除的效果

而是用于往特定地址写入或者读取内容

以写为例:

  • in是要写入的内容
  • address是写入的地址
  • load是控制读还是写,load= 1是是写入

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第4张图片

写是选择往哪个里面输出,可以使用DMux选择输出管道

类比四通道输入,我们要造八通道输出,

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第5张图片
两位的话 根据 sel位 为0 输出a ;为1输出b

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第6张图片

sel3 sel2 sel1 输出
0 0 0 a
0 0 1 b
1 1 1 h

sel位根据地址而来,不管有多少数据,地址都会一一对应

DMux8Way(in=load,sel=address,a=a1,b=b1,c=c1,d=d1,e=e1,f=f1,g=g1,h=h1);

sel为地址为1的话,输出b =in ,也就是后面这些字母a,b,c,d…会有等于in =1的

从什么地方来解决了

现在解决路途中该怎么传输

最后解决数据去哪

在中途传输使用寄存器存起来,然后转移过去再打开,释放数据

Register(in=in,load=a1,out=out1);
Register(in=in,load=b1,out=out2);
Register(in=in,load=c1,out=out3);
Register(in=in,load=d1,out=out4);
Register(in=in,load=e1,out=out5);
Register(in=in,load=f1,out=out6);
Register(in=in,load=g1,out=out7);
Register(in=in,load=h1,out=out8); 

最后数据传到目的地,为每一位数据赋值,,选择地址,释放用到数据选择器Mux

Mux8Way16(a=out1,b=out2,c=out3,d=out4,e=out5,f=out6,g=out7,h=out8,sel=address,out=out);

在仿真器里速度调慢一点,注意观察在load位为1的时候,执行的写操作,非常神奇

RAM8和RAM64 ,512的区别是后者的容量大,可以存储更多的数据

但为什么是转移数据的RAM变化了,而永远是那八个输入输出口

//512RAM

DMux8Way(in = load, sel = address[6..8], a = loadA, b = loadB, c = loadC, d = loadD, e = loadE, f = loadF, g = loadG, h = loadH);

    RAM64(in = in, load = loadA, address = address[0..5], out = o1);
    RAM64(in = in, load = loadB, address = address[0..5], out = o2);
    RAM64(in = in, load = loadC, address = address[0..5], out = o3);
    RAM64(in = in, load = loadD, address = address[0..5], out = o4);
    RAM64(in = in, load = loadE, address = address[0..5], out = o5);
    RAM64(in = in, load = loadF, address = address[0..5], out = o6);
    RAM64(in = in, load = loadG, address = address[0..5], out = o7);
    RAM64(in = in, load = loadH, address = address[0..5], out = o8);

    Mux8Way16(a = o1, b = o2, c = o3, d = o4, e = o5, f = o6, g = o7, h = o8, sel = address[6..8], out = out);

中间的RAM64就是增加了RAM512 的存储量,扩容也只要两步

    1. 地址扩大
    2. 中间的RAM 扩大

a,b,c,d 那八个是中间八个RAM 的load位,用来控制往哪个里面存数据

在screen界面看起来就一目了然了

《计算机系统要素实验》Pro3: RAM是怎么组成的?_第7张图片

16kARM

再写之前的512,4k都没有问题,习惯了复制粘贴的单纯

但到16K突然懵了

16K原来还是改了改4K,但是突然报错,才惊醒,16 k = 4* 4k

内部不再是八个,改为了四个,还是报错

发现地址没改,之前八个寄存器,使用三位表示add范围【三位】,但现在是4个,用两位即可表示add[2位],同时load的位改为四个字母控制即可

CHIP RAM16K {
    IN in[16], load, address[14];
    OUT out[16];

    PARTS:
    DMux4Way(in = load, sel = address[12..13], a = loadA, b = loadB, c = loadC, d = loadD);

    RAM4K(in = in, load = loadA, address = address[0..11], out = o1);
    RAM4K(in = in, load = loadB, address = address[0..11], out = o2);
    RAM4K(in = in, load = loadC, address = address[0..11], out = o3);
    RAM4K(in = in, load = loadD, address = address[0..11], out = o4);
   

    Mux4Way16(a = o1, b = o2, c = o3, d = o4, sel = address[12..13], out = out);

你可能感兴趣的:(计算机系统)