触发器 DFF
DFF简单的将前一个时间周期的输入值作为当前周期的输出。
1bit寄存器
加一个输入脚,由load门控制。
1
2
Mux(a=preOut, b=in, sel=load, out=o1);
DFF(in=o1, out=preOut, out=out);
16bit寄存器 Register
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PARTS:
// Put your code here:
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]);
8-RAM
RAM 由n个宽度为w的寄存器组成。
读取 读取编号为m的寄存器,将m置于address输入管脚。
写入 数值d写入编号为m的寄存器。m置于address中,d置于in输入管脚。load位为1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CHIP RAM8 {
IN in[16], load, address[3];
OUT out[16];
PARTS:
// Put your code here:
DMux8Way(in=load, sel=address, a=a1, b=a2, c=a3, d=a4, e=a5, f=a6, g=a7, h=a8);
Register(in=in, load=a1, out=o1);
Register(in=in, load=a2, out=o2);
Register(in=in, load=a3, out=o3);
Register(in=in, load=a4, out=o4);
Register(in=in, load=a5, out=o5);
Register(in=in, load=a6, out=o6);
Register(in=in, load=a7, out=o7);
Register(in=in, load=a8, out=o8);
Mux8Way16(a=o1, b=o2, c=o3, d=o4, e=o5, f=o6, g=o7, h=o8, sel=address, out=out);
}
多路RAM
RAM8 address[3] , 8个1bit寄存器。
RAM64 address[6], 64个1bit寄存器。
RAM512 address[9] , 512 个1bit寄存器。
RAM4K address[12] , 4096 个1bit寄存器。
RAM16K address[14] 1638 个1bit寄存器。
计数器
计数器芯片有两个附加的控制位reset和inc。当inc=1时,计数器在每个时钟周期自加,输出值out(t)=out(t-1)+1。如果想要将计数器重置为0,就将reset位置为1;如果想要将其初始化为某个计数值d,就将d置于in输入管脚然后将1oad位置1。
计数器的这段代码有空多看看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CHIP PC {
IN in[16],load,inc,reset;
OUT out[16];
PARTS:
// inc=1 ++
Mux16(a=preOut, b=addOut, sel=inc, out=o1);
// load=1 b=in
Mux16(a=o1, b=in, sel=load, out=o2);
//reset=1 置零
Mux16(a=o2, b=false, sel=reset, out=o3);
//寄存器的每个时钟周期都在更改,load直接设置位true
Register(in=o3, load=true, out=out,out=preOut);
Inc16(in=preOut, out=addOut);
}