Skip to content

Latest commit

 

History

History
111 lines (78 loc) · 3.1 KB

基础知识.md

File metadata and controls

111 lines (78 loc) · 3.1 KB

基础知识

此文件旨在帮助掌握选择题以及基础语法
主要还是,,人太健忘了
学了Verilog忘了MIPS
学了MIPS忘了Verilog
(´-_-`)||

Logisim

Decoder是什么

将二进制码转换为one-hot码,如:
00 -> 0001
01 -> 0010
10 -> 0100
11 -> 1000

加法器

和有符号无符号没什么关系,即不论是理解成带符号运算还是理解成无符号运算,都是同样的值。
如:
1001+0111,结果是0000。
理解成有符号的话,就是进位进没了;
理解为无符号,就是0111-0111=0000。(转自BUAA-Wander)

Verilog & ISE

最稳的算数右移

$signed($signed(A)>>>B)

位数扩展及拼接

assign A = {16'h0000, B}

这个“{}”可以看成一种操作(符),和 “+”、“-”没什么区别,都会产生一个结果。

循环操作的语法

integer i;
always @(vote) begin
    sum = 3'b000;
    for(i = 0; i <7; i = i + 1) begin
        if(vote[i]) sum = sum + 1;
    end
    if(sum >= 3'd4) pass = 1'b1;
    else pass = 1'b0;
end

组合逻辑的构建

  1. 使用assign语句,搭配三目运算符

  2. 使用always@(*) 和 <=

  3. 尤其注意组合逻辑是随着周期还是assign

MIPS & Mars

大端存储和小端存储

小端存储听起来更正常一些:
LSB存储到低地址

伪指令(directives)

伪指令不会被编译成机器码,但却影响其他指令的汇编结果。
伪指令有点像变量分配

.data
用于预先存储数据的伪指令的开始标志
就是在告诉Mars,我从这要开始变量的声明和分配了

branch和j能跳转多少

  1. branch 有16位的offset(imm),采用相对寻址的方式
    首先,如果条件不成立,那么会有:
    PC = PC + 4
    如果条件成立,有:
    PC = PC + 4*(imm)
    由于指令是4字节对齐的,因此可支持的跳转范围实际上是2^18=256KB(相对PC的-128KB~+128KB)。
    如果确定跳转目标地址在分支指令前后的128KB范围内,编译器就可以编码只生成一条简单的条件分支指令。
    -128KB~+128KB,-32Kword~+32Kword
    大约在三千条指令内跳转,所以一般来说,不会跳太远

  2. j指令 MIPS指令中最小的操作码域占6位,剩下的26位(instr_index)用于跳转目标的编址。
    PC = {PC[31:28]:instr_index:00}
    OX0FFFFFFC是能跳转最多的
    由于所有指令在内存中都是4字节对齐的,因此最低的2个比特位是无需存储的,这样实际可供寻址范围为2^28=256MB。
    分支跳转地址被当做一个256MB的段内绝对地址,

常用的syscall

if($v0 == XX) then ($a0/$v0 will XX)

print

Service Code in $v0 Arguments
print integer 1 $a0: the integer to print
print string 4 $a0: the address of null-terminated string to print

read

Service Code in $v0 Arguments
read integer 5 $v0 contains the num
read a string 9 $a0: the address of input buffer
$a1: max num of character to read
read a character 12 $v0 contains the char