个人所写 有参照(最后一个综合题有错)勿骂(yysy数字逻辑和数逻实验真的太难了
一.
1.在Logisim中打开给定的project.circ 。
2.然后,点击“大作业逻辑图”,查看电路图(此时你可能不理解电路结构),将Shared Label内容修改为与你的学号相关。
3.然后,点击“应用测试”,看到基于逻辑符号(应有你的学号信息)的电路设计,并截图。
4.对该电路进行测试,填写下表
Sel=00 | Sel=01 | Sel=10 | Sel=11 | ||
输入 | 输出 | 输出 | 输出 | 输出 | 输出 |
ABCD | Out3-0 | Out3-0 | Out3-0 | Out3-0 | FLAG |
0000 | 0011 | 0000 | 0000 | 0000 | 0 |
0001 | 0100 | 0001 | 0001 | 0000 | 0 |
0010 | 0101 | 0010 | 0011 | 0000 | 0 |
0011 | 0110 | 0011 | 0010 | 0000 | 0 |
0100 | 0111 | 0100 | 0110 | 0000 | 0 |
0101 | 1000 | 1011 | 0111 | 0000 | 0 |
0110 | 1001 | 1100 | 0101 | 0000 | 0 |
0111 | 1010 | 1101 | 0100 | 0000 | 0 |
1000 | 1011 | 1110 | 1100 | 0000 | 0 |
1001 | 1100 | 1111 | 1000 | 0000 | 0 |
1010 | 0000 | 0000 | 0000 | 0000 | 1 |
1011 | 0000 | 0000 | 0000 | 0000 | 1 |
1100 | 0000 | 0000 | 0000 | 0000 | 1 |
1101 | 0000 | 0000 | 0000 | 0000 | 1 |
1110 | 0000 | 0000 | 0000 | 0000 | 1 |
1111 | 0000 | 0000 | 0000 | 0000 | 1 |
分析电路实现的逻辑功能,对电路结构的理解:
Logisim 是电子元件模拟软件的简化版本,近似于电子元件。
提供了我们在计算机组成原理所需要的基本所有元器件的逻辑结构,是非常有效的快速自行实验验证学习结果的工具。
二.
1.利用Logisim中的基本门元件(与门/或门/非门/异或门…),搭建1位全加器电路,并封装电路,编辑逻辑符号(学号+add1);利用自己封装的1位全加器,搭建32位全加器电路(提示:可以先用1位全加器搭建4位全加器,继而封装成16位全加器,以此类推),并封装电路,编辑逻辑符号(学号+add32)。
2. 利用上面封装过的32位全加器以及Logisim中的基本门元件搭建32位全减器,并封装电路,编辑逻辑符号(学号+sub32)。
3.利用上面封装过的32位全加器、全减器以及Logisim中的与门、或门以及选择器,构造能完成四种运算的ALU,功能表如下:
4.添加运算结果为零的标志信号zero。
5.算术运算(补码)测试:若(A)10 = -8,(B)10 = 8,填表并截取正确结果电路图。
6.逻辑运算测试:若(A)16=55550000,(B)16=0000AAAA,填表截取正确结果电路图。
7.编辑逻辑符号(ALU-学号),截图备用。
8.截取以上要求图例(包含所有搭建和封装过程用图)并完成word报告。
ALU_sel | ALU_out | (ALU_out)10 | zero |
00 | ![]() | 0 | 1 |
01 | ![]() | 8 | 0 |
ALU_sel | ALU_out |
10 | ![]() |
11 | ![]() |
module alu_20074407(A,B,ALU_sel,ALU_out,zero);
input [31:0] A,B;
input [1:0] ALU_sel;
output [31:0] ALU_out;
output zero;
reg ALU_out;
assign zero=is(ALU_out==32’b0)?1:0;
always @(A or B or ALU_sel)
case (ALU_sel)
0: ALU_out = A+B ;
1: ALU_out = A-B ;
2: ALU_out = A&B ;
3: ALU_out = A|B ;
default: ALU_out = 32’b0 ;
endcase
endmodule
三.
立即数扩展电路的设计与验证
1.按照要求将输入的16位数扩展成32位输出。
2.功能表
信号名 | 位宽 | 方向 | 说明 |
Imm16 | 16 | 输入 | 来自指令寄存器的16位立即数 |
Extsel | 2 | 输入 | 00:无符号扩展,将16位立即数进行0扩展至32位立即数; 01:符号扩展,将16位补码立即数扩展成32位补码立即数; 10:低位0扩展,将16位立即数移至32位立即数的高16位,低16位补0。 |
ExtImm32 | 32 | 输出 | 扩展后的32位立即数 |
3.利用Logisim中的“分线器”和“选择器”,构造立即数扩展电路。
4.模拟验证,填表下表,并截取正确结果电路图。
Imm16 | Extsel | ExtImm32 |
1111000011110000 | 00 | ![]() |
0000000000001111 | 01 | ![]() |
1000111111110111 | 01 | ![]() |
0000111100001111 | 10 | ![]() |
四.
1.7条指令说明见相关ppt,根据7条MIPS指令的特征码“opcode”和“funct”,设计指令译码器。
2.指令译码器功能表
输入 | 输出 | |||||||
加法 | 减法 | 或立即数 | 立即数置高位 | 取字 | 存字 | 相等跳转 | ||
opcode | funct | addu | subu | ori | lui | lw | sw | beq |
000000 | 100001 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
000000 | 100011 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
001101 | X | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
001111 | X | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
100011 | X | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
101011 | X | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
000100 | X | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
3.在Logisim中设计实现指令译码器,进行验证,并截取正确结果电路图。
4.编辑逻辑符号(Mdec-学号),备用。
5.截取以上要求用图并完成word报告。
五.
1.当指令被译码后,为完成指令功能,应对数据通路中的选择信号进行编码。例如:addu和subu指令完成A、B两个数的运算;ori指令完成A与立即数的“按位或”逻辑运算;lui指令完成高位“置”有符号立即数;lw和sw指令要通过A+有符号立即数获得数据存放地址;beq指令通过判断A-B的结果是否为零,建立PCsel信号。见图1。
2.编码器功能表(对照图1,理解编码含义)
3.在Logisim中设计实现编码器,进行验证,并截取正确结果电路图。
4.编辑逻辑符号(Mcod-学号),备用。
5.截取以上要求用图并完成word报告。
六.
综合验证
1.在Logisim中,按照图1进行电路(逻辑符号)连接。
当A=32、B= -30、Imm16=-6时,完成addu测试,截取测试结果并说明;
当A=10、B=10、Imm16=-2时,完成subu测试,截取测试结果并说明;
当A=10、B=10,Imm16=-1时,完成ori测试,截取测试结果并说明;
当A=0、B=10,Imm16=15时,完成lui测试,截取测试结果并说明;
当A=33、B=33,Imm16=32时,完成beq测试,截取测试结果并说明;
当A=2、B=10,Imm16=32时,完成beq测试,截取测试结果并说明;
当A=10、B=8,Imm16=-5时,完成lw测试,截取测试结果并说明;
七.
小结
学习了ALU,立即数拓展,MIPS等内容,为数据结构打下了基础。在了解他们的同时,可以通过实操实现加减法,相等,立即数等相关功能。通过看教材等方式,了解了其他的元器件使用功能等,了解了数字逻辑LogiSim这个平台的使用方法以及CPU中央处理器的知识等。