1、 计 算 机 组 成 实 验 C课 程 设 计适 用 专 业:电 子 信 息 类专 业 专 业 : 软件工程 班 级 : 软件一班 学 号 : 姓 名 : 某某某指 导 教 师: 陈红梅 实 验 学 期:2 014-2015 第 1 学期西 南 交 通 大 学信 息 科 学 与 技 术 学 院目录简化计算机系统的设计 .2一、实验目的 .2二.、 实验内容 .2三.、 预习要求 .2四、实验报告 .21. BLOCK 图 .32. 程序设计(纸质的版本我用手抄) 43. 仿真波形图 .114、仿真中遇到的问题: .14五、 实验感想 15简化计算机系统的设计一、实验目的通过学 习简 单的指 令
2、系 统及 其各 指令 的操作 流程 ,用 VHDL 语 言 实 现 简 单 的处理 器模 块,并通 过调 用存储 器模 块, 将处 理器 模块和 存储 器模 块连 接形 成简化 的计 算机系 统。二.、 实验内容1. 用 VHDL 语 言 实现 简单 的处 理 器 模 块。2. 调 用 存 储 器模 块设 计 64 8 的存 储器 模块 。3. 将简单 的处 理器 模块 和存 储器模 块连 接形 成简 单的 计算机 系统 。4. 将指令 序列 存入 存储 器, 然后分 析指 令执 行流 程。三.、 预习要求1、 学 习 简 单 指 令 集 。 2、 学 习 各 指 令 的 操 作 流 程 。四
3、、实验报告1. BLOCK 图 2. 程序设计(纸质的版本我用手抄)CPU的设计:LIBRARY ieee;USE ieee.std_logic_1164.ALL;PACKAGE mypack ISCONSTANT idle : std_logic_vector(3 DOWNTO 0) :=“0000“;CONSTANT load : std_logic_vector(3 DOWNTO 0) :=“0001“;CONSTANT move : std_logic_vector(3 DOWNTO 0) :=“0010“;CONSTANT addx : std_logic_vector(3 DOWN
4、TO 0) :=“0011“;CONSTANT subp : std_logic_vector(3 DOWNTO 0) :=“0100“;CONSTANT andp : std_logic_vector(3 DOWNTO 0) :=“0101“;CONSTANT orp : std_logic_vector(3 DOWNTO 0) :=“0110“;CONSTANT xorp : std_logic_vector(3 DOWNTO 0) :=“0111“;CONSTANT shrp : std_logic_vector(3 DOWNTO 0) :=“1000“;CONSTANT shlp :
5、std_logic_vector(3 DOWNTO 0) :=“1001“;CONSTANT swap : std_logic_vector(3 DOWNTO 0) :=“1010“;CONSTANT jmp : std_logic_vector(3 DOWNTO 0) :=“1011“;CONSTANT jz : std_logic_vector(3 DOWNTO 0) :=“1100“;CONSTANT read : std_logic_vector(3 DOWNTO 0) :=“1101“;CONSTANT write : std_logic_vector(3 DOWNTO 0) :=“
6、1110“;CONSTANT stop : std_logic_vector(3 DOWNTO 0) :=“1111“;END mypack;LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;USE WORK.mypack.ALL;-cpu实体声明-ENTITY cpu ISPORT(reset : IN std_logic; -清零信号低有效clock : IN std_logic; -时钟信号Write_Read: OUT std_logic; -读写信号,1为写M_address: OUT s
7、td_logic_vector(11 DOWNTO 0); -地址线M_data_in: IN std_logic_vector(7 DOWNTO 0); -数据输入线M_data_out: OUT std_logic_vector(7 DOWNTO 0); -数据输出线overflow: OUT std_logic); -溢出标志END cpu;-cpuRTL级行为描述-ARCHITECTURE RTL of cpu ISSIGNAL IR: std_logic_vector(15 DOWNTO 0); -指令寄存器SIGNAL MDR: std_logic_vector(7 DOWNTO
8、0); -数据寄存器SIGNAL MAR: std_logic_vector(11 DOWNTO 0); -地址寄存器SIGNAL status: integer RANGE 0 TO 6; -状态寄存器BEGINstatus_change: PROCESS(reset, clock, status )BEGINIF reset = 0 THEN status status IF IR(15 DOWNTO 12) = Stop THEN status CASE IR(15 DOWNTO 12) ISWHEN Read|Write|Jmp|Jz|Swap =status status IF IR
9、(15 DOWNTO 12)= Swap THENstatus status CASE IR(15 DOWNTO 12) ISWHEN Read|Write =status status status 0);PC := (OTHERS=0);R0 := (OTHERS=0);R1 := (OTHERS=0);R2 := (OTHERS=0);R3 := (OTHERS=0);A := (OTHERS=0);MAR 0);MDR 0);ELSIF(clockevent AND clock=1) THENoverflow -状态0IR -状态1 IF (IR(15 DOWNTO 12) /= st
10、op) THENMAR R0:= “0000“ WHEN shlp|shrp = CASE IR(11 DOWNTO 10) IS - Rx to AWHEN “00“= A:= R0;WHEN “01“= A:= R1;WHEN “10“= A:= R2;WHEN OTHERS = A:= R3;END CASE;WHEN Move|addx|subp|andp|orp|xorp|Swap= CASE IR(9 DOWNTO 8) IS - Ry to AWHEN “00“= A:=R0;WHEN “01“= A:=R1; WHEN “10“= A:=R2;WHEN OTHERS= A:=R
11、3;END CASE;WHEN OTHERS = NULL; END CASE;WHEN 2= -状态2CASE IR(15 DOWNTO 12) ISWHEN addx = - Rx:= Rx + A;CASE IR(11 DOWNTO 10) ISWHEN “00“=temp := (R0(7) R0:=temp(7 DOWNTO 0);overflow temp :=(R1(7) R1:=temp(7 DOWNTO 0);overflow temp :=(R2(7) R2:=temp(7 DOWNTO 0);overflow temp :=(R3(7) R3:=temp(7 DOWNTO
12、 0);overflow - Rx:= Rx - A;CASE IR(11 DOWNTO 10) ISWHEN “00“=temp :=(R0(7) R0:=temp(7 DOWNTO 0);overflow temp :=(R1(7) R1:=temp(7 DOWNTO 0);overflow temp :=(R2(7) R2:=temp(7 DOWNTO 0);overflow temp :=(R3(7) R3:=temp(7 DOWNTO 0);overflow CASE IR(11 DOWNTO 10) ISWHEN “00“= R0:= A; WHEN “01“= R1:= A; W
13、HEN “10“= R2:= A; WHEN OTHERS= R3:= A;END CASE;WHEN shrp = CASE IR(11 DOWNTO 10) ISWHEN “00“= R0:= 0 WHEN “01“= R1:= 0 WHEN “10“= R2:= 0 WHEN OTHERS= R3:= 0 END CASE;WHEN shlp = CASE IR(11 DOWNTO 10) ISWHEN “00“= R0:= A( 6 DOWNTO 0 ) WHEN “01“= R1:= A( 6 DOWNTO 0 ) WHEN “10“= R2:= A( 6 DOWNTO 0 ) WH
14、EN OTHERS= R3:= A( 6 DOWNTO 0 ) END CASE;WHEN andp = -Rx:= Rx AND A;CASE IR(11 DOWNTO 10) ISWHEN “00“= R0:=R0 AND A; WHEN “01“= R1:=R1 AND A; WHEN “10“= R2:=R2 AND A; WHEN OTHERS= R3:=R3 AND A;END CASE;WHEN orp = -Rx:= Rx OR A;CASE IR(11 DOWNTO 10) ISWHEN “00“= R0:=R0 OR A; WHEN “01“= R1:=R1 OR A; W
15、HEN “10“= R2:=R2 OR A; WHEN OTHERS= R3:=R3 OR A;END CASE;WHEN xorp = -Rx:= Rx XOR A;CASE IR(11 DOWNTO 10) ISWHEN “00“= R0:=R0 XOR A; WHEN “01“= R1:=R1 XOR A; WHEN “10“= R2:=R2 XOR A; WHEN OTHERS= R3:=R3 XOR A;END CASE;WHEN Swap = -Swap: Rx to Ry;CASE IR(11 DOWNTO 8) ISWHEN “0100“= R0:=R1;WHEN “1000“
16、= R0:=R2;WHEN “1100“= R0:=R3;WHEN “0001“= R1:=R0;WHEN “1001“= R1:=R2;WHEN “1101“= R1:=R3;WHEN “0010“= R2:=R0;WHEN “0110“= R2:=R1;WHEN “1110“= R2:=R3;WHEN “0111“= R3:=R1;WHEN “1011“= R3:=R2;WHEN “0011“= R3:=R0;WHEN OTHERS= NULL;END CASE;WHEN OTHERS = NULL;END CASE;WHEN 3= -状态3CASE IR(15 DOWNTO 12) IS
17、WHEN Swap= - Swap: A to RxCASE IR(11 DOWNTO 10) IS WHEN “00“= R0:=A;WHEN “01“= R1:=A;WHEN “10“= R2:=A;WHEN OTHERS= R3:=A;END CASE;WHEN jmp|Jz|Read|Write = IR(7 DOWNTO 0) NULL;END CASE;WHEN 4= -状态4 CASE IR(15 DOWNTO 12) ISWHEN jmp = - 无条件转移指令 PC := IR(11 DOWNTO 0);MAR - 条件转移指令 IF(R0=“00000000“) thenP
18、C := IR(11 DOWNTO 0);MAR MAR MAR NULL;END CASE;WHEN 5 = -状态5MAR -状态6CASE IR(15 DOWNTO 12) ISWHEN Read = R0 := M_data_in;WHEN OTHERS= NULL;END CASE;END CASE;END IF; END process seq;comb: PROCESS (reset, status)BEGINIF (reset = 1 AND status = 5 AND IR(15 DOWNTO 12)= Write ) THEN Write_Read = 1;ELSEWri
19、te_Read = 0;END IF;END PROCESS comb;M_address = MAR;M_data_out = MDR;END RTL;3. 仿真波形图3.1 总体的仿真波形图1、 我们可以看到CPU有6种工作模式,并且在不同的工作模式下实现了不同的功能。2、 我们的仿真波形上的M_q 输出的波形为,000、15、24、D0 、1F 与我们cpu_mem. Mif文件中所输入的指令一一对应。3、 我们看到PC随着时钟信号的改变在自加 1。并且不断的从内存文件中依次读出相应的指令,将其执行。4、 我们看到R0的值在变化,依次为 00、05、39、43、9、0A、3B 、18 、
20、43、00 ,和所给的实例程序的情况完全吻合。同理也可以看出R1、R2 、R3 均为正确结果5、 我们可以看到地址寄存器也随着时钟信号在自加1,说明我们的 PC和地址寄存器是共同协调工作的,随着PC加1地址也随之加1.6、 在数据寄存器在CPU执行第 7、8两条指令后其值也是随之改变为了R0中的值,与我们的预期相同。3.2 仿真波形的分析变化: 我们可以看到执行完上面的的七条指令后R0 、R1中的值发生了变化,而R2 、R3中的值依然为00 没有发生变化。分析:第一条指令:由于我们程序中设定为00010101即为load 指令,转化为十六进制即为第一条指令15H,而我们在 CPU中约定load
21、指令为Read 01F R0-(01F) ,即为将立即数5送给R0寄存器,所以当我们执行15H 这条指令后CPU会将05送给R0 寄存器,我们也可以从波形上看到,当执行完成15H指令后 R0中的值变成了05;第二条指令:同样的我们将24H设定为Move R1,R0 R1-(R0) 是一条转移指令,把R0中的值送给R1,从波形图上可看出 执行完成24H 后 R1中的值变成了 05,与我们的预期相符。第三、四指令:我们将 D0H、1FH设定为 Read 01F,即R0-(01)F 将1F中的值送给R0,操作完后R0的值就为我们在 1F单元中存储的39 的数据值了。从波形图上我们也能看出吻合。第五条
22、指令:我们将94H设定为 Shl R1 即将R1中的值左移一位,操作完成后 R1的值变成了0A,与波形的情况也吻合。 第六条指令:我们将31H设定为 Add R0,R1 R0-(R0)+(R1) 操作完成后R0 的值为R0和R1的和,很明显的看出我们仿真波形上的值是正确的。第七、八两条指令:我们将E0H和1EH设定为 Write 01E 01E-(R0) 我们执行完成后01E单元的值在RAM 中显示为43 ,与实际相符。第九条指令:我们将41H设定为 SUB R0,R1 R0-(R0-R1)指令,即为减法指令, 我们预测执行完41H 后R0的值为39,波形图显示正确。第十条指令:我们将A1H设
23、定为 Awap R0,R1 (R0)(R1)指令,即为交换指令 ,我们预期R0=0A R1=39 ,从波形上看出我们执行了 A1H后与我们的 R0、R1值与预期结果相同。第十一条指令:61H 设定为 OR R0,R1 R0-(R0) AND (RI) 执行完城后R0=3B 与波形图相同。第十二条指令:84H 设定为Shr RI R1-(RI)右移执行完成后R1 应为1C 与波形图结果相同指令正确。第十三条指令:51H 设定为AND R0,R1 执行相与操作,预计R0中为18 ,波形图上当执行到这条指令后R0中结果确实为 38,指令运行正确。第十四条指令:28H 设定为Move R2,R0 转移
24、指令,将R0的值送给R2 ,预计R2中的值将为18 ,从波形图上看出R2值当运行到 28H的时候确实为18,我们的指令运行正确。第十五条指令:2DH设定为Move R3,R1 转移指令 将R1中的值送给R3,我们预期R3 中的值将会为1C,但执行完成后我们从波形图上看出R3的值为1CH,指令运行正确。第十六条指令:7BH设定为XOR R2,R3 将R2和R3 异或 我们预期 R3中的之将会变为1CH,从波形图上看到我们运行完成7BH后R3 的值为1CH ,指令运行正确。第十七、十八条指令:D0H、1EH设定为Read 01E R0-(01E) 将01E地址中的值送给R0寄存器,我们预期R0中的
25、值将会为 43,从波形图上可以看出当运行到此处的时候 R0的值变成了43,指令运行正确。第十九、二十条指令:C0H、19H 设定为:JZ019,若(R0 )=0转移至019,否则执行下一条指令,我们分析R0中的值并不为 0,故不会跳转,我们从波形上也可以看出,R0、 R1、R2、R3中的值并没有发生任何变化第二十一、二十二条指令:1DH、D0H 设定为Read 01D R0-(01D ) ,即将01D地址中的值取出送给R0,预期 R0中的值将为 0,从波形图上也可以看出,执行到此处 R0的值变成了0 。第二十三、二十四条指令:B0H、13H设定为: JMP 013指令 无条件跳转至013H 地
26、址,而013H 为JZ 019 指令 同时这是的R0 寄存器中的值为0 ,满足了跳转条件,此时程序将跳转到019H地质处执行,即是我们的低二十五条指令,为停止指令,程序停止。第二十五条指令:F0H 设定为Stop 指令,执行到此处程序停止。此后的指令均为数据存储的指令 ,在这里我就不一一进行介绍了,详情可以查看下图这个32 字节的 RAM内情表。4、仿真中遇到的问题:仿真过程中的一些问题首先是PC、R0 、R1、R2、R3里面的值的顺序需要将其颠倒。仿真后还有一个问题是R0、R1、R2 、R3的值显示不正确, R0只显示了到了05 后面的值就都不正确了,调试了半天,我发现波形显示M_q 在上升
27、沿变化后,与之相连的 M_data_in竟然不变,最后经过各种搜索后解决了此问题,原来lpm为输出多做了一次寄存,也就是两个脉冲才会读出MAR 的值。与PC的变化不衔接,整整快了两个脉冲。所以把图上红圈处的勾去掉就行了。五、 实验感想经过此次实验 我对 CPU 的工作原理有了很深刻的认识,发现了其中蕴藏着巨大的乐趣,我完全的搞懂了此次试验的原理,再次基础上,我还能结合此次实验去理解微机接口,计算机组成原理等课程,通过此次实验,我能熟练的使用 VHDL 来编写大型的程序代码,对于一个学软件的人来说,我的编程能力又上了一个台阶。除此之外,我学习到了很多底层的东西,让我对计算机的工作原理有了更深刻的理解,让我在此后的编程中将受益无穷。可能老师您会看到我这个课程设计的很多拷贝,反正是我做的就是我做的,别人参考也好拷贝也好,我都觉得无所谓,重要的是我能学习到东西,这也让我学习到了很多做人的道理,你说同学问你要课程设计,我能不给么,但是作为同学我只能啰嗦一句,你只能参考啊,不要完全照搬。单是有些人他就要完全照搬你的图和分析,自己也不提出自己的看法和见解,这总是让我很心寒,特别是那些学习成绩还不错的。我真是想不通问什么要人家好心给你的报告参考,你反过来要坑人家,就这样的人品,学习好又能咋样呢,都是转空子的人,以后也不会得到大家的认可。