Pre

Coooookie hahah

Pre梳理

基础知识

原码、反码、补码

正数 :原码 = 反码 = 补码

负数 :原码 :符号位为1,其后为绝对值的原码
反码 :绝对值的原码各位取反
补码 :反码 + 1 (或2^n - x)

计算机中的整数都用补码储存

位宽大小

  1. 1Byte = 8bit
  2. 1字 = 4Byte(32位机)
  3. 在写MIPS程序时,一个寄存器是32位,4字节,MIPS中的offset偏移操作都是以字节为单位的

Logisim

  1. 模块化设计的思想
  2. 注意外观以及题目所给要求
  3. 优雅的赋初值操作:
    counter的输出端为initial,把counter设置为stay at max value,然后设置max value (maybe是1),再把initial标签与mux相接就可以啦
  4. 理解电路的“同步”,这与我们平常写高级语言代码的设计是不同的
  5. 注意时钟周期要求,学会使用寄存器而不是直接进行输出

Verilog

阻塞赋值与非阻塞赋值

  1. 时序逻辑,非阻塞赋值(<=);组合逻辑,阻塞赋值(=)
  2. 组合逻辑和时序逻辑的always块分开
  3. 不要出现对同一个变量在多个always块中赋值,也不要出现一个变量既用阻塞赋值又用非阻塞赋值
  4. 判断输出时,可以把输出部分写在always块中,也可以写在always块外使用assign语句,assign相当于是组合逻辑中的一根线,输出会随着输入而发生变化
    for example
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       always @(posedge clk, posedge rst) //异步复位
    begin
    //
    end
    assign ans = () ? 1'b1 : 1'b0;
    // another
    always @(posedge clk,posedge rst)
    begin
    //
    ans = () ? 1'b1 : 1'b0;
    end

状态机

  1. Moore与Meely的选择
    不用在最初设计电路时过多区分
    Moore机可以满足输出一个cycle的要求
    Meely机可以满足最早输出(越快越好的要求)
    (详见L4 P25 波形示意图)
    1
  2. 关键是次态逻辑与输出逻辑的设计
    设计次态逻辑时,先想清楚你需要哪些状态,然后对这些状态进行编码,然后设计好状态转移图,根据图去编写代码
    设计输出逻辑时,就要想清楚是Moore还是Meely,也就是说我的输入与当前输出是否有关

符号数处理

最保险的处理有符号数a:

1
$signed($signed(a)<<b)

异步复位处理

1
2
3
4
5
6
7
8
9
always @(posedge clk,posedge rst)
begin
if (rst) state <= `S0;
else
case(state)
//
default: ;//避免状态机跑飞了
endcase
end

初始化操作

1
2
3
4
initial  
begin
state <= `S0;
end

细节

  1. 注意不要忘记begin后的end,case后的default和endcase,以及最后的endmodule
  2. 模块端口定义的最后一行不要加’,’
    1
    2
    3
    4
    5
    module counting(
    input [1:0] num,
    input clk,
    input ans //不加','
    );//';'不要忘记

例题标程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
`define S0 2'b00
`define S1 2'b01
`define S2 2'b10
`define S3 2'b11
module counting(
input [1:0] num,
input clk,
input ans
);

reg [1:0] status;

initial
begin
status <= `S0;
end

always@(posedge clk)
begin
case(status)
`S0: begin
if (num == 2'b01)
begin
status <= `S1;
end
else if (num == 2'b10)
begin
status <= `S0;
end
else if (num == 2'b11)
begin
status <= `S0;
end
else
begin
status <= `S0; // 对于一切非正常输出,回到状态0
end
end
//
default: status <= `S0;
endcase
assign ans = (status == `S3) ? 1'b1 : 1'b0;
endmodule

MIPS

伪指令

1
2
3
4
5
6
.data
#.asciiz是字对齐的,可以放在前面,然后在后面申请空间(.space)
.text
#code
.word
#以字节存储

syscall

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#字符串输出
la $a0,addr # $a0:addr of the str;$a1: max size of the str;the end '\0'
li $v0,4
syscall

#整数输出
li $v0,1
syscall
#输出$a0寄存器中的值

#读入一个整数
li $v0,5
syscall
move $s0,$v0

#读入一个字符串
li $v0,8
syscall
# $a0 :the addr; $a1: the maxsize

#读入一个字符
li $v0,12
syscall
# $v0 cotains it

#结束程序
li $v0,10
syscall

上机总结

写在前面

此次pre考的比较基础,只过了Verilog,感觉对于基础知识模型要加强学习

Mealy机

此次Logisim和Verilog都考察的是Mealy型状态机

Mealy机的基本电路设计

1

失误地方

  1. 题意不清,应该是对于每个输入都会判断与之前输入之和是否大于等于5
  2. 寄存器的使用,请注意en端口与clk端口
    1

助教学长的标程

1
有疑问:

  1. 没有实现大于零时清空寄存器
    分析:使用mux实现的,如果all大于等于5,mux的选择端为1,mux输出为0,那么下一个时钟上升沿到来之时,register存入0,实现寄存器清零
  2. 为什么这是Mealy机呀,感觉输出状态是由输入状态唯一决定的
    分析:每一个时钟上升沿到来,寄存器存入当前多路选择器的输出值,与in相加并判断是否大于等于5(Mealy)

Verilog

考了异步复位以及状态转移

1
2
3
4
5
6
7
8
9
10
11
assign out = ((status == `S2)&(in == 1)) ? 1'b1 : 1'b0; //题目要求是Mealy机
always @(posedge clk,posedge reset) //异步复位
begin
if (reset)
else
case(status)//注意这里不要有冒号
`S0:
//不要打成中文的标点,很容易就CTRL切换中英了
default:;
endcase
end

MIPS

此次MIPS考察了求平方根,没有时间了就正向遍历,t了一个点,据大家讨论,反向遍历可以全过,正确做法是二分查找或者移位,主要考察对于循环的使用

碎碎念

  1. 掌握基础知识,比如verilog部分就是因为重点复习了状态机和异步复位等,在之前就把问题解决了(当然考到了这些问题),总之,多思考,多求教,多练习,帆帆加油!
  2. 对于机房环境,电脑容易卡掉线,不要慌多刷新几次;比较昏暗,注意键盘吧;不要被旁边同学影响了,专注自己,细心耐心静心,加油吧!
  • Post title:Pre
  • Post author:Coooookie
  • Create time:2023-01-02 20:28:46
  • Post link:https://coooookie0913.github.io/2023/01/02/Pre/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.