/**
* 1-bit register:
* If load[t] == 1 then out[t+1] = in[t]
* else out does not change (out[t+1] = out[t])
*/
如果load 选择为1,输出为上一个时间单位的输入
这个是不是和选择器一个画风?
选择器为1,记录后一个值,b = in,sel =load 但是a是什么?输出是什么?
a必然为另一种情况,out(t) = out(t-1) 但是这种关联时间的之前基础门没有呀!
哎,不是刚学了和Nand一样底层的DFF吗?查看功能
a 就等于 DFF的输出,但是DFF的输入是什么呢?
这里的输入实际上不再是以往的某个变量,而是很有时间循环特色的Bit的输出
构成时间的闭环,才能不断执行
但我没想明白的是DFF居然有两个输出!
Mux(a = preOut,b=in,sel = load,out=dffIn);
DFF(in=dffIn,out = preOut,out=out);
相比于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 不影响变化
这个内存单元不会像之间和与或非那样产生加减乘除的效果
而是用于往特定地址写入或者读取内容的
以写为例:
写是选择往哪个里面输出,可以使用DMux选择输出管道
类比四通道输入,我们要造八通道输出,
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 的存储量,扩容也只要两步
a,b,c,d 那八个是中间八个RAM 的load位,用来控制往哪个里面存数据
在screen界面看起来就一目了然了
再写之前的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);