BUAA_CO_P5
P5_流水线CPU指令分析支持10指令
运算类:add sub nop lui ori
访存类:sw lw
分支跳转类:beq jal jr
数据冒险阻塞根据转发中的第2,3点分析,我们知道每条指令都有相应的产生新数据的时间Tnew(从刚进入D级算起,如果有的话),也有需要用到数据的时间Tuse(从刚进入D级算起,如果有的话)。这样就会构成如下的表格:
如果用不到数据我们就认为是一个很大的时间max(3)
add
sub
nop
ori
lui
sw
lw
beq
jal
jr
Tuse_RS
1
1
max
1
max
1
1
0
max
0
Tuse_RT
1
1
max
max
max
2
max
0
max
max
另一个指标是Tnew,用于体现要回写的新数据产生并存入最近的流水级寄存器堆的时间(从刚进入D级算起)
如果不会产生要回写的数据就记为一个很小的时间min(0)
add
sub
nop
ori
lui
sw
lw
beq
jal
jr
Tnew_DEin
2
2
min
2
1
min
3
min
1
min
...
BUAA_CO_P4
P4_Verilog实现10指令单周期CPU需求分析实现10指令:add, sub, ori, lw, sw, beq, lui, jal, jr, nop
在8指令的基础上增量开发实现10指令,我们首先分析新增指令的功能
jal:将pc + 4写入31号寄存器 + 跳转到指定地址
jr :从31号寄存器中读出 + 跳转到指定地址
思路分析
由于jal要求写入31号寄存器,所以的RegAddr需要至少3种编码,也就是说RegDst至少需要2位,分别对应写入寄存器编号来自rt rd 和 31号
123[1:0] RegDst // RegDst == 2'b00 RegAddr是rt对应的寄存器 (默认) // RegDst == 2'b01 RegAddr是rd对应的寄存器 // RegDst == 2'b10 RegAddr是31号寄存器
同 ...
BUAA_OOpre_5
Lecture 5 如何管理对象
对象与引用:
(1)对象是什么:
对象是程序通过new产生的实例
对象是堆内存中的一个区域,包含属性数据和指向类的指针
方法定义在类中而不是对象中
(2)对象引用是什么:
指向对象内存地址的指针,用以访问对象成员及其属性和方法
对象引用可能为null
改变对象引用的取值不会导致被引用对象数据的改变
(3)区别与联系
当堆中某个对象无法被程序访问时,Java垃圾回收机制会自动回收内存。
改变对象内容的唯一方法是通过对象引用去访问其修改方法
对象引用是一个变量(类似于C语言的指针型变量),对象引用内容的改变可以随时通过变量赋值实现
Java常见容器及其作用:
(1)ArrayList:可伸缩数组
(2)LinkedList:可伸缩链表
优点:当我们需要保持对象的顺序关系并且按照下标访问时,采用ArrayList或者LinkedList是比较好且比较简单的选择
缺点:查找某个对象需要遍历,查找速度较慢
(3)HashMap:哈希表
1234567891011public class Adeventurer { //par ...
BUAA_CO_P3
P3 Logisim实现单周期处理器目录 :
[toc]
整体结构
所要设计的版块:IFU,Splitter,Controller,GRF,ALU,DM,EXT
设计要求:支持的指令集:add sub ori lw sw beq lui nop 其中add和sub按照无符号处理
顶层驱动信号:异步复位reset
指令分析:
R型:add sub nop # Opcode + Rs + Rt + Rd + shamt + Func
I型:ori lw sw lui beq # Opcode + Rs + Rt + immediate
123456789add $t0, $t1, $t2 # 机器码:000000_01001_01010_01000_00000_100000sub $t0, $t1, $t2 # 机器码:000000_01001_01010_01000_ ...
BUAA_CO_P2
P2汇编语言目录:
[toc]
宏定义
P2_L0_Matrix和P2_L1_factorial涉及矩阵读入,运算与输出。可以使用一些宏定义可以增加代码可读性:
1234567891011121314151617181920212223242526272829303132.datastr_enter : .asciiz "\n" # .asciiz 伪指令用于定义一个以空字符结尾的字符串常量。str_space : .asciiz " " # .ascii 伪指令不包含结尾处的空字符.macro printSpace # 输出一个空格 la $a0, str_space # 用于将标签或变量的地址加载到指定的寄存器中。 li $v0, 4 syscall .end_macro .macro printEnter # 输出一个换行符 la $a0, str_enter li $v0, 4 ...
BUAA-CO-P1
P1_Verilog-HDL部件及状态机设计目录:
[toc]
Verilog-HDL语法
状态编码定义的两种方式:parameter 和 `define 语句
1234567891011121314151617181920//parameter语句parameter State1 = 4'b0001, //注意逗号和等号 State2 = 4'b0010, State3 = 4'b0100, State4 = 4'b1000; //分号结束case (State) State1 : begin end State2 : begin end //`define语句`define State1 4'b0000 // 不要加分号和等号`define State2 4'b0010`define State3 4'b0100`define State4 4'b1000case (State) `State1 : begin ...
线性神经网络
Chapter 3 线性神经网络线性回归
随机梯度下降:
预测结果
在线性假设(目标可以表示为特征的加权和)下,对于预测结果$\hat{y}$有:
$\hat{y} = w_1x_1 + …+w_dx_d + b$ 或 $\hat{y} = w^Tx + b$
其中$w$ 是所有权重构成的向量,$x$是所有特征构成的向量,b是偏移量。
损失函数
我们使用损失函数来量化目标的实际值与预测值之间的差距,当样本预测值为$\hat{y}^{(i)}$,真实值为$y^{(i)}$时,损失值是关于${w,b}$的函数。回归问题中常用的损失函数是平方损失函数。
$l^{(i)}(w,b) = \frac{1}{2}(\hat{y}^{(i)}- y^{(i)})^2$
其中常数$\frac{1}{2}$不会导致本质区别,但可以使求导后的结果系数为1,这样在形式上会稍有简化。
梯度下降
梯度下降方法通过不断地在损失函数递减的方向上更新参数来降低误差,具体的更新方法是:
每 ...
BUAA-CO-P0
P0_Logisim部件及状态机设计目录 :
[toc]
组合逻辑组合逻辑电路是指这样一类电路,它不具有像寄存器这样的与时序有关的器件。组合逻辑电路在输出被给出后极短时间内给出相应的输出;
P0_L0_CRC便是典型的组合逻辑,我们一次性地给出一个8位二进制被除数和一个4位二进制除数,在输入给出后的极短时间内反馈它的11位CRC校验码。根据题目描述易得我们需要完成8次4位除4位的模二除法,每次输出3位余数即可,由此我们考虑创建一个实现模二除法的子电路div。利用div就能很快实现该题目。
P0_L1_foti是一个组合电路问题,将输入16位数利用splitter分离为sign,exponent,float三部分。根据exponent进行分支,如果进入分支的判段为真,则利用一个三态缓冲器(controlled buffer)激活该分支电路。
时序逻辑时序逻辑电路一般具有寄存器,触发器这样的器件,它具有记忆功能,能够存储电路的状态信息,并根据输入信号和当前状态产生输出;
P0_L0_GRF是一个复杂的具有时序逻辑的电路。我们首先考虑实现一张端口定义表和功能表来清晰化我们要做的事情 ...
BUAA_OOpre_4
Lecture 4 Java程序的Bug分析与调试
多种输入指令的处理:
一个自然而然地想法是这样的:
12345678910111213141516171819202122import java.util.Scanner public class MainClass(){ public static void main(String[] args) { Scanner scanner = new scanner(System.in); int n = scanner.nextInt(); //表示接下来有n条指令 for (int i = 0; i < n; i++) { int instruction = scanner.nextInt(); switch (instruction) { case 1 : command1(); br ...
BUAA_OOpre_3
Lecture 3 继承与接口使用
继承:
继承是类之间的一种抽象层次关系
继承让子类获得父类的属性和方法,实现复用和扩展
继承可以把多个类中的重复内容提取出来形成父类,减少冗余和增强可维护性
继承在Java中的语法:
(1)extends关键词:Java通过关键字extends来定义继承关系
(2)super关键词:子类通过super.attribute引用父类的非私有属性,通过super.methodName()调用父类实现的方法
(3)父类中public和protected类型的成员可以被子类直接访问,private成员需要通过方法访问
(4)Java仅支持单继承,即一个类最多只能有一个父类
方法重写:
(1)子类重新实现父类已有的方法被称为方法重写(override),重写要求方法名称,参数(个数,顺序,类型)和返回类型均保持一致,这样既保持了类的抽象层次,又实现了子类的独有行为
(2)方法重写的访问权限:
重写方法的visibility范围必须大于等于父类的方法
(3)方法重写的返回类型:
若父类方法返回基本类型,则重写方法只能与其保持一致
若父类方法返回 ...