《第一行代码》笔记(一)-Kotlin语法
变量在Kotlin中,变量分有val(value)和var(variable)修饰的变量类型,由于Kotlin有类型推导机制,因此可以不声明变量数据类型。
12345val a = 10// val变量不可变var b = 10// var变量可变b = 20
当然我们也可以显性地声明变量类型:
1val a: Int = 10
和Java不同的是,在Kotlin中每个变量类型都是类,因此变量类型都是开头大写的
函数函数体如下所示:
123fun methodName(param1: Int, param2: Int): Int { return 0 }
首先fun(function的简写)是定义函数的关键字,无论你 定义什么函数,都一定要使用fun来声明。
紧跟在fun后面的是函数名,这个就没有什么要求了,你可以根据自己的喜好起任何名字,但是 良好的编程习惯是函数名最好要有一定的意义,能表达这个函数的作用是什么。
函数名后面紧跟着一对括号,里面可以声明该函数接收什么参数,参数的数量可以是任意多 个,例如上述示例就表示该函数接收两个Int类型的参 ...
CS61C学习笔记(九)-组合逻辑模块
组合逻辑模块-Combinational_Logic_Blocks
数据多路复用器(Data Multiplexor)Data Multiplexor (here 2-to-1, n-bit-wide)
当S = 0,C的值为A的值
当S = 1,C的值为B的值
N instances of 1-bit-wide mux
如何构建1位宽的mux?
4-to-1 Multiplexor
Mux:是否有其他方法可以做到这一点?
运算和逻辑单元(Arithmetic and Logic Unit\ALU)
Our simple ALU
加法器/减法器(Adder/subtracter)如何构建
真值表,然后确定标准式,然后最小化并实现如我们所见
看看把问题分解成更小的片断,我们可以级联或分层
Adder / Subtractor – One-bit adder LSB…
N 1-bit adders -> 1 N-bit adder
将N个1-bit adders串联起来后就变成了1个N-bit的加法器了!
接下来我们来考虑溢 ...
CS61C学习笔记(八)-组合逻辑
组合逻辑(Combinational_Logic)电路没有状态和记忆,某些输入集的输出总是相同。
真值表(Truth Tables/TT)
TT Example #1: 1 iff one (not both) a,b=1
这个也是后面会说到的XOR,trick xor treat!
使用a和b的关系简化真值表:
当a为0时,输出y等于b。
当a为1时,输出y等于not b。
TT Example #2: 2-bit adder
输入A和B分别有两位,输出C有三位(包括进位)。
总共需要16行(4位输入)。
TT Example #3: 32-bit unsigned adder
输入A和B分别有32位,输出C需要33位(包括进位)。
真值表的方法在这种情况下可能不适用,需考虑其他构建方法。
TT Example #4: 3-input majority circuit
逻辑门
如何记忆:
2-input gates extend to n-inputs
对于XOR的N-input数abc中有多少个1,奇数个1最终结果就是1
Truth Table -&g ...
CS61C学习笔记(七)-同步数字系统之状态
关于状态状态电路与组合逻辑电路:
状态电路用于记住值,如寄存器(小而快)或内存(大而慢)。
组合逻辑电路用于处理数据流。
状态的使用
作为存储某些不确定时间价值的场所:
寄存器文件(如RISC - V上的x0 - x31)
记忆(缓存和主存)
帮助控制组合逻辑块之间的信息流动。
状态变量用于在组合逻辑块的输入端保持信息的运动,并允许有序的传递。
构建累加器
在register这块中,数据从上到下,从右到左
刚开始时,reset初始化sum为0,随后sum和xi进行加法运算,sum再次进入register后传给xi
累加器的构建:
累加器的目标是将一系列输入值累加。
基本思路是通过循环累加输入数组中的每个元素,最终得到总和。
累加器的初步设计:
设计一个简单的累加电路,尝试在没有状态电路的情况下进行累加。
发现仅使用组合逻辑电路无法完成累加操作,因为无法控制循环的迭代,也无法初始化累加器。
引入状态电路:
为了解决上述问题,引入寄存器和复位线。
寄存器用于保存当前累加值,并在复位时将其设为零。
加载器(时钟)控制每个周期的累加操作。
反馈 ...
CS61C学习笔记(六)-同步数字系统
我们已经介绍了高级语言、汇编语言和机器语言,接下来我们从硬件架构和逻辑电路来讨论代码运行发生了什么
同步数字系统即Synchronous Digital Systems (SDS),接下来我们将讨论同步数字系统中的开关(Switches)、晶体管(Transistors)、信号(Signals)、波形(Waveforms)和状态(Status)
设计层次
同步数字系统
同步(Synchronous):系统有一个时钟信号(心跳),现代时钟频率通常在3到4 GHz范围内。
数字(Digital):
所有值都用离散值表示
将模拟电压和电流转换为数字信号(0和1)。
开关(Switches)物理电路的基本要素
我们通常把闭合称为”断言(asserrte)”
晶体管(Transistor)晶体管的基本概念
半导体:晶体管是半导体器件,有时导电,有时不导电。通过另一电源可以控制其导电性。
放大器与开关:晶体管既可用作放大器,也可用作开关。
CMOS技术:现代数字系统使用互补金属氧化物半导体(CMOS)技术,该技术使用电压控制开关。
MOS: Metal-Oxide on Se ...
3-CS61C项目笔记-Lab4-用指针编写RISCV函数
Exercise 1原代码:
12345678910111213141516171819202122232425262728293031323334353637383940414243map: addi sp, sp, -12 sw ra, 0(sp) sw s1, 4(sp) sw s0, 8(sp) beq a0, x0, done # if we were given a null pointer, we're done. add s0, a0, x0 # save address of this node in s0 add s1, a1, x0 # save address of function in s1 add t0, x0, x0 # t0 is a counter # remember that each node is 12 bytes long: # - 4 for the array pointer # - 4 for the size of the ...
CS61C学习笔记(五)-RISCV-CALL
CALLCompiling,Assembling, Linking, and Loading
伪代码给汇编理解的,而不是给机器了解的
答案:
翻译和运行项目:CALL
接下来我们将讨论怎么将高级语言翻译成机器码
我们怎么运行C程序?
**翻译器(Translator)**:将程序从源语言转换为另一种语言中的等效程序
翻译/编译成低级语言几乎总是意味着更高的效率和更高的性能。
与**解释器(Interpreter)**对比:直接在源语言中执行程序
▫注意:C 程序/RISC-V 也可以被解释执行! ▫
例如:Venus RISC-V 模拟器 对于学习/调试非常有用
编译和运行一个C项目的步骤
CALL: Compiler
CALL: Assembler
directives: 指令
指令(directives)
指令 向汇编器提供指示:
通常由编译器生成(上一个阶段)
指令不会生成机器指令!相反,它们指示如何构建目标文件的不同部分。
.text 随后的项放入用户文本段(机器代码)
.data 随后的项放入用户数 ...