当前位置: 首页 > news >正文

Nand2Tetris(计算机系统要素)学习笔记 Project 3

文章目录

    • 时序逻辑
        • 0 DFF
        • 1 Bit
        • 2 Register
        • 3 RAM8
        • 4 RAM 64
        • 5 PC
        • 6 RAM512
        • 7 RAM4K
        • 8 RAM16K

时序逻辑

0 DFF

跟Nand门一样,DFF门在我们的计算机体系中处于非常底层。可以说,计算机中的
所有时序芯片(寄存器、内存、计数器)都基于大量的DFF门。

  • out(t) = in(t-1)
1 Bit
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/a/Bit.hdl
/*** 1-bit register:* If load is asserted, the register's value is set to in;* Otherwise, the register maintains its current value:* if (load(t)) out(t+1) = in(t), else out(t+1) = out(t)*/
CHIP Bit {IN in, load;OUT out;PARTS:Mux(a = outT1, b = in, sel = load, out = inT);DFF(in = inT, out = out, out=outT1);
}
2 Register
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/a/Register.hdl
/*** 16-bit register:* If load is asserted, the register's value is set to in;* Otherwise, the register maintains its current value:* if (load(t)) out(t+1) = int(t), else out(t+1) = out(t)*/
CHIP Register {IN in[16], load;OUT out[16];PARTS: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]);}
3 RAM8
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/a/RAM8.hdl
/*** Memory of eight 16-bit registers.* If load is asserted, the value of the register selected by* address is set to in; Otherwise, the value does not change.* The value of the selected register is emitted by out.*/
CHIP RAM8 {IN in[16], load, address[3];OUT out[16];PARTS:Not(in = address[0], out = n0);Not(in = address[1], out = n1);Not(in = address[2], out = n2);And(a = address[0], b = address[1], out = a1a0);And(a = address[0], b = address[2], out = a2a0);And(a = address[1], b = address[2], out = a2a1);And(a = n0, b = n1, out = n1n0);And(a = n0, b = n2, out = n2n0);And(a = n1, b = n2, out = n2n1);// 000 Register0And(a = n1n0, b = n2, out = n2n1n0);And(a = n2n1n0, b = load, out = load0);Register(in=in, load = load0, out = out0);// 001 Register1And(a = n2n1, b = address[0], out = n2n1a0);And(a = n2n1a0, b = load, out = load1);Register(in=in, load = load1, out = out1);// 010 Register2And(a = n2n0, b = address[1], out = n2a1n0);And(a = n2a1n0, b = load, out = load2);Register(in=in, load = load2, out = out2);// 011 Register3And(a = a1a0, b = n2, out = n2a1a0);And(a = n2a1a0, b = load, out = load3);Register(in=in, load = load3, out = out3);// 100 Register4And(a = n1n0, b = address[2], out = a2n1n0);And(a = a2n1n0, b = load, out = load4);Register(in=in, load = load4, out = out4);// 101 Register5And(a = a2a0, b = n1, out = a2n1a0);And(a = a2n1a0, b = load, out = load5);Register(in=in, load = load5, out = out5);// 110 Register6And(a = a2a1, b = n0, out = a2a1n0);And(a = a2a1n0, b = load, out = load6);Register(in=in, load = load6, out = out6);// 111 Register7And(a = a2a1, b = address[0], out = a2a1a0);And(a = a2a1a0, b = load, out = load7);Register(in=in, load = load7, out = out7);Mux8Way16(a = out0, b = out1, c = out2, d = out3, e = out4, f = out5, g = out6, h = out7, sel = address, out = out);}
4 RAM 64
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/a/RAM64.hdl
/*** Memory of sixty four 16-bit RAM8_s.* If load is asserted, the value of the RAM8_ selected by* address is set to in; Otherwise, the value does not change.* The value of the selected RAM8_ is emitted by out.*/
CHIP RAM64 {IN in[16], load, address[6];OUT out[16];PARTS:Not(in = address[3], out = n0);Not(in = address[4], out = n1);Not(in = address[5], out = n2);And(a = address[3], b = address[4], out = a1a0);And(a = address[3], b = address[5], out = a2a0);And(a = address[4], b = address[5], out = a2a1);And(a = n0, b = n1, out = n1n0);And(a = n0, b = n2, out = n2n0);And(a = n1, b = n2, out = n2n1);// 000XXX RAM8// 543210// 000 RAM8_0And(a = n1n0, b = n2, out = n2n1n0);And(a = n2n1n0, b = load, out = load0);RAM8(in=in, load = load0, address=address[0..2], out = out0);// 001 RAM8_1And(a = n2n1, b = address[3], out = n2n1a0);And(a = n2n1a0, b = load, out = load1);RAM8(in=in, load = load1, address=address[0..2], out = out1);// 010 RAM8_2And(a = n2n0, b = address[4], out = n2a1n0);And(a = n2a1n0, b = load, out = load2);RAM8(in=in, load = load2, address=address[0..2], out = out2);// 011 RAM8_3And(a = a1a0, b = n2, out = n2a1a0);And(a = n2a1a0, b = load, out = load3);RAM8(in=in, load = load3, address=address[0..2], out = out3);// 100 RAM8_4And(a = n1n0, b = address[5], out = a2n1n0);And(a = a2n1n0, b = load, out = load4);RAM8(in=in, load = load4, address=address[0..2], out = out4);// 101 RAM8_5And(a = a2a0, b = n1, out = a2n1a0);And(a = a2n1a0, b = load, out = load5);RAM8(in=in, load = load5, address=address[0..2], out = out5);// 110 RAM8_6And(a = a2a1, b = n0, out = a2a1n0);And(a = a2a1n0, b = load, out = load6);RAM8(in=in, load = load6, address=address[0..2], out = out6);// 111 RAM8_7And(a = a2a1, b = address[3], out = a2a1a0);And(a = a2a1a0, b = load, out = load7);RAM8(in=in, load = load7, address=address[0..2], out = out7);Mux8Way16(a = out0, b = out1, c = out2, d = out3, e = out4, f = out5, g = out6, h = out7, sel = address[3..5], out = out);}
5 PC
resetloadincsel[1]sel[0]内容
10000out(t+1) = 0
10100out(t+1) = 0
11000out(t+1) = 0
11100out(t+1) = 0
01001out(t+1) = in(t)
01101out(t+1) = in(t)
00110out(t+1) = out(t) + 1
00011out(t+1) = out(t)
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/a/PC.hdl
/*** A 16-Register counter.* if      reset(t): out(t+1) = 0* else if load(t):  out(t+1) = in(t)* else if inc(t):   out(t+1) = out(t) + 1* else              out(t+1) = out(t)*/
CHIP PC {IN in[16],inc, load, reset;OUT out[16];PARTS:// reset; out0And16(a = in, b[0..15] = false, out = out0);// notResetAndLoad; out1 = inNot(in = reset, out = notReset);And(a = notReset, b = load, out = notResetAndLoad);// notResetNotLoadAndInc; out2Not(in = load, out = notLoad);And(a = notReset, b = notLoad, out = notResetNotLoad);And(a = notResetNotLoad, b = inc, out = notResetNotLoadAndInc);Inc16(in = out2T, out = out2);// notResetNotLoadNotInc; out3 = out3TNot(in = inc, out = notInc);And(a = notResetNotLoad, b = notInc, out = notResetNotLoadNotInc);Or(a = notResetAndLoad, b = notResetNotLoadNotInc, out = sel0);Mux4Way16(a = out0, b = in, c = out2, d = out3T, sel[0] = sel0, sel[1] = notResetNotLoad, out = outMux);Register(in = outMux, load = true, out = out, out = out3T, out = out2T);
}
6 RAM512
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/b/RAM512.hdl
/*** Memory of 512 16-bit registers.* If load is asserted, the value of the register selected by* address is set to in; Otherwise, the value does not change.* The value of the selected register is emitted by out.*/
CHIP RAM512 {IN in[16], load, address[9];OUT out[16];PARTS:Not(in = address[6], out = n0);Not(in = address[7], out = n1);Not(in = address[8], out = n2);And(a = address[6], b = address[7], out = a1a0);And(a = address[6], b = address[8], out = a2a0);And(a = address[7], b = address[8], out = a2a1);And(a = n0, b = n1, out = n1n0);And(a = n0, b = n2, out = n2n0);And(a = n1, b = n2, out = n2n1);// 000XXXXXX RAM64// 876543210// 000 RAM64_0And(a = n1n0, b = n2, out = n2n1n0);And(a = n2n1n0, b = load, out = load0);RAM64(in=in, load = load0, address=address[0..5], out = out0);// 001 RAM64_1And(a = n2n1, b = address[6], out = n2n1a0);And(a = n2n1a0, b = load, out = load1);RAM64(in=in, load = load1, address=address[0..5], out = out1);// 010 RAM64_2And(a = n2n0, b = address[7], out = n2a1n0);And(a = n2a1n0, b = load, out = load2);RAM64(in=in, load = load2, address=address[0..5], out = out2);// 011 RAM64_3And(a = a1a0, b = n2, out = n2a1a0);And(a = n2a1a0, b = load, out = load3);RAM64(in=in, load = load3, address=address[0..5], out = out3);// 100 RAM64_4And(a = n1n0, b = address[8], out = a2n1n0);And(a = a2n1n0, b = load, out = load4);RAM64(in=in, load = load4, address=address[0..5], out = out4);// 101 RAM64_5And(a = a2a0, b = n1, out = a2n1a0);And(a = a2n1a0, b = load, out = load5);RAM64(in=in, load = load5, address=address[0..5], out = out5);// 110 RAM64_6And(a = a2a1, b = n0, out = a2a1n0);And(a = a2a1n0, b = load, out = load6);RAM64(in=in, load = load6, address=address[0..5], out = out6);// 111 RAM64_7And(a = a2a1, b = address[6], out = a2a1a0);And(a = a2a1a0, b = load, out = load7);RAM64(in=in, load = load7, address=address[0..5], out = out7);Mux8Way16(a = out0, b = out1, c = out2, d = out3, e = out4, f = out5, g = out6, h = out7, sel = address[6..8], out = out);}
7 RAM4K
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/b/RAM4K.hdl
/*** Memory of 4K 16-bit registers.* If load is asserted, the value of the register selected by* address is set to in; Otherwise, the value does not change.* The value of the selected register is emitted by out.*/
CHIP RAM4K {IN in[16], load, address[12];OUT out[16];PARTS:Not(in = address[9], out = n0);Not(in = address[10], out = n1);Not(in = address[11], out = n2);And(a = address[9], b = address[10], out = a1a0);And(a = address[9], b = address[11], out = a2a0);And(a = address[10], b = address[11], out = a2a1);And(a = n0, b = n1, out = n1n0);And(a = n0, b = n2, out = n2n0);And(a = n1, b = n2, out = n2n1);// 000XXXXXX RAM512// 876543210// 000 RAM512_0And(a = n1n0, b = n2, out = n2n1n0);And(a = n2n1n0, b = load, out = load0);RAM512(in=in, load = load0, address=address[0..8], out = out0);// 001 RAM512_1And(a = n2n1, b = address[9], out = n2n1a0);And(a = n2n1a0, b = load, out = load1);RAM512(in=in, load = load1, address=address[0..8], out = out1);// 010 RAM512_2And(a = n2n0, b = address[10], out = n2a1n0);And(a = n2a1n0, b = load, out = load2);RAM512(in=in, load = load2, address=address[0..8], out = out2);// 011 RAM512_3And(a = a1a0, b = n2, out = n2a1a0);And(a = n2a1a0, b = load, out = load3);RAM512(in=in, load = load3, address=address[0..8], out = out3);// 100 RAM512_4And(a = n1n0, b = address[11], out = a2n1n0);And(a = a2n1n0, b = load, out = load4);RAM512(in=in, load = load4, address=address[0..8], out = out4);// 101 RAM512_5And(a = a2a0, b = n1, out = a2n1a0);And(a = a2n1a0, b = load, out = load5);RAM512(in=in, load = load5, address=address[0..8], out = out5);// 110 RAM512_6And(a = a2a1, b = n0, out = a2a1n0);And(a = a2a1n0, b = load, out = load6);RAM512(in=in, load = load6, address=address[0..8], out = out6);// 111 RAM512_7And(a = a2a1, b = address[9], out = a2a1a0);And(a = a2a1a0, b = load, out = load7);RAM512(in=in, load = load7, address=address[0..8], out = out7);Mux8Way16(a = out0, b = out1, c = out2, d = out3, e = out4, f = out5, g = out6, h = out7, sel = address[9..11], out = out);
}
8 RAM16K
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/3/b/RAM16K.hdl
/*** Memory of 16K 16-bit registers.* If load is asserted, the value of the register selected by* address is set to in; Otherwise, the value does not change.* The value of the selected register is emitted by out.*/
CHIP RAM16K {IN in[16], load, address[14];OUT out[16];PARTS:Not(in = address[12], out = n0);Not(in = address[13], out = n1);// 00XXXXXXXXXXXX RAM4K// 13,12// 00 RAM4KAnd(a = n1, b = n0, out = n1n0);And(a = n1n0, b = load, out = load0);RAM4K(in=in, load = load0, address=address[0..11], out = out0);// 01 RAM4KAnd(a = n1, b = address[12], out = n1a0);And(a = n1a0, b = load, out = load1);RAM4K(in=in, load = load1, address=address[0..11], out = out1);// 10 RAM4KAnd(a = address[13], b = n0, out = a1n0);And(a = a1n0, b = load, out = load2);RAM4K(in=in, load = load2, address=address[0..11], out = out2);// 11 RAM4KAnd(a = address[12], b = address[13], out = a1a0);And(a = a1a0, b = load, out = load3);RAM4K(in=in, load = load3, address=address[0..11], out = out3);Mux4Way16(a = out0, b = out1, c = out2, d = out3, sel = address[12..13], out = out);
}
http://www.dtcms.com/a/285594.html

相关文章:

  • sqli(1-8)
  • ASP.NET Core Web API 内存缓存(IMemoryCache)入门指南
  • Pytorch下载Mnist手写数据识别训练数据集的代码详解
  • PyTorch新手实操 安装
  • 填坑 | React Context原理
  • SpringMVC + Tomcat10
  • 小结:Spring MVC 的 XML 的经典配置方式
  • 计算机视觉与机器视觉
  • Tensorflow小白安装教程(包含GPU版本和CPU版本)
  • C++并发编程-13. 无锁并发队列
  • div和span区别
  • 【Python】python 爬取某站视频批量下载
  • 前端实现 web获取麦克风权限 录制音频 (需求:ai对话问答)
  • 20250718【顺着234回文链表做两题反转】Leetcodehot100之20692【直接过12明天吧】今天计划
  • AugmentCode还没对个人开放?
  • STL—— list迭代器封装的底层讲解
  • 71 模块编程之新增一个字符设备
  • Proto文件从入门到精通——现代分布式系统通信的基石(含实战案例)
  • 标题 “Python 网络爬虫 —— selenium库驱动浏览器
  • 光伏电站工业通信网络解决方案:高可靠工业通信架构与设备选型
  • 开源短链接工具 Sink 无需服务器 轻松部署到 Workers / Pages
  • 西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访庭田科技
  • ArcGIS Pro+PS 实现地形渲染效果图
  • WinDbg命令
  • FastAdmin框架超级管理员密码重置与常规admin安全机制解析-卓伊凡|大东家
  • 本地部署DeepSeek-R1并打通知识库
  • 数字地与模拟地隔离
  • 【C语言】深入理解柔性数组:特点、使用与优势分析
  • Cursor替代,公测期间免费使用Claude4
  • 首个直播流扩散(LSD)AI模型:MirageLSD,它可以实时把任意视频流转换成你的自定义服装风格——虚拟换装新体验