西南交通大学计算机组成原理课程设计报告_西南交通大学课程设计
西南交通大学计算机组成原理课程设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“西南交通大学课程设计”。
《计算机组成实验 C》
课程设计
适用专业:电子信息类专业
专 班 学 姓
业:软件工程 级:软件一班 号: 名:某某某
指导教师:陈红梅
实验学期:2014-2015 第 1 学期
西 南 交 通 大 学
信息科学与技术学院 目录
简化计算机系统的设计.......................................................................................................................2
一、实验目的...............................................................................................................................2 二.、实验内容...............................................................................................................................2 三.、预习要求...............................................................................................................................2
四、实验报告...............................................................................................................................2 1.BLOCK图...........................................................................................................................3 2.程序设计(纸质的版本我用手抄)...........................................................................4 3.仿真波形图.................................................................................................................114、仿真中遇到的问题:...................................................................................................14
五、实验感想............................................................................................................................15
简化计算机系统的设计
一、实验目的通过学习简单的指令系统及其各指令的操作流程,用 VHDL 语言实现简单 的处理器模块,并通过调用存储器模块,将处理器模块和存储器模块连接形成简化的计 算机系统。
二.、实验内容
1.用 VHDL 语言实现简单的处理器模块。2.调用存储器模块设计 64×8 的存储器模块。
3.将简单的处理器模块和存储器模块连接形成简单的计算机系统。4.将指令序列存入存储器,然后分析指令执行流程。
三.、预习要求
1、学习简单指令集。
2、学习各指令的操作流程。
四、实验报告
1.BLOCK图
2.程序设计(纸质的版本我用手抄)
CPU的设计: LIBRARY ieee;USE ieee.std_logic_1164.ALL;
PACKAGE mypack IS CONSTANT 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 DOWNTO 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 : 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):=“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 IS PORT(reset : IN std_logic;--清零信号低有效
clock : IN std_logic;--时钟信号
Write_Read: OUT std_logic;--读写信号,'1'为写 M_addre: OUT std_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 IS
SIGNAL IR: std_logic_vector(15 DOWNTO 0);--指令寄存器 SIGNAL MDR: std_logic_vector(7 DOWNTO 0);--数据寄存器 SIGNAL MAR: std_logic_vector(11 DOWNTO 0);--地址寄存器 SIGNAL status: integer RANGE 0 TO 6;--状态寄存器 BEGIN status_change: PROCESS(reset, clock, status)BEGIN IF reset = '0' THEN status
CASE status IS WHEN 0 =>
status IF IR(15 DOWNTO 12)= Stop THEN
status
status CASE IR(15 DOWNTO 12)IS
WHEN Read|Write|Jmp|Jz|Swap =>
status
WHEN OTHERS =>
status
END CASE;WHEN 3 => IF IR(15 DOWNTO 12)= Swap THEN
status
status status CASE IR(15 DOWNTO 12)IS
WHEN Read|Write =>
status
WHEN OTHERS =>
status
END CASE;WHEN OTHERS => status
ELSE
NULL;END IF;END PROCESS status_change;
seq: PROCESS(reset,clock)
VARIABLE PC:std_logic_vector(11 DOWNTO 0);--程序计数器
VARIABLE R0,R1,R2,R3: std_logic_vector(7 DOWNTO 0);--通用寄存器
VARIABLE A: std_logic_vector(7 DOWNTO 0);--临时寄存器
VARIABLE temp: std_logic_vector(8 DOWNTO 0);--临时变量 BEGIN IF(reset='0')THEN
--清零
IR '0');PC :=(OTHERS=>'0');R0 :=(OTHERS=>'0');R1 :=(OTHERS=>'0');R2 :=(OTHERS=>'0');R3 :=(OTHERS=>'0');A :=(OTHERS=>'0');MAR '0');MDR '0');ELSIF(clock'event AND clock='1')THEN overflow
WHEN 0=>--状态0 IR
--取指令
PC := PC+1;
--程序计数器加1
WHEN 1=>--状态1 IF(IR(15 DOWNTO 12)/= stop)THEN MAR
END IF;
CASE IR(15 DOWNTO 12)IS WHEN load => R0:= “0000” & IR(11 DOWNTO 8);WHEN shlp|shrp => CASE IR(11 DOWNTO 10)IS
--Rx to A WHEN “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 A WHEN “00”=> A:=R0;WHEN “01”=> A:=R1;WHEN “10”=> A:=R2;WHEN OTHERS=> A:=R3;END CASE;WHEN OTHERS => NULL;END CASE;
WHEN 2=>--状态2
CASE IR(15 DOWNTO 12)IS WHEN addx =>--Rx:= Rx + A;CASE IR(11 DOWNTO 10)IS WHEN “00”=> temp :=(R0(7)& R0(7 DOWNTO 0))+(A(7)& A(7 DOWNTO 0));
R0:=temp(7 DOWNTO 0);
overflow temp :=(R1(7)& R1(7 DOWNTO 0))+(A(7)& A(7 DOWNTO 0));
R1:=temp(7 DOWNTO 0);
overflow temp :=(R2(7)& R2(7 DOWNTO 0))+(A(7)& A(7 DOWNTO 0));
R2:=temp(7 DOWNTO 0);
overflow temp :=(R3(7)& R3(7 DOWNTO 0))+(A(7)& A(7 DOWNTO 0));
R3:=temp(7 DOWNTO 0);
overflow--Rx:= Rx-A;CASE IR(11 DOWNTO 10)IS WHEN “00”=> temp :=(R0(7)& R0(7 DOWNTO 0))+ NOT(A(7)& A(7 DOWNTO 0))+ 1;
R0:=temp(7 DOWNTO 0);
overflow temp :=(R1(7)& R1(7 DOWNTO 0))+ NOT(A(7)& A(7 DOWNTO 0))+ 1;
R1:=temp(7 DOWNTO 0);
overflow temp :=(R2(7)& R2(7 DOWNTO 0))+ NOT(A(7)& A(7 DOWNTO 0))+ 1;
R2:=temp(7 DOWNTO 0);
overflow temp :=(R3(7)& R3(7 DOWNTO 0))+ NOT(A(7)& A(7 DOWNTO 0))+ 1;
R3:=temp(7 DOWNTO 0);
overflow CASE IR(11 DOWNTO 10)IS WHEN “00”=> R0:= A;WHEN “01”=> R1:= A;WHEN “10”=> R2:= A;WHEN OTHERS=> R3:= A;END CASE;
WHEN shrp => CASE IR(11 DOWNTO 10)IS WHEN “00”=> R0:= '0' & A(7 DOWNTO 1);WHEN “01”=> R1:= '0' & A(7 DOWNTO 1);WHEN “10”=> R2:= '0' & A(7 DOWNTO 1);WHEN OTHERS=> R3:= '0' & A(7 DOWNTO 1);END CASE;WHEN shlp => CASE IR(11 DOWNTO 10)IS WHEN “00”=> R0:= A(6 DOWNTO 0)& '0';WHEN “01”=> R1:= A(6 DOWNTO 0)& '0';WHEN “10”=> R2:= A(6 DOWNTO 0)& '0';WHEN OTHERS=> R3:= A(6 DOWNTO 0)& '0';END CASE;WHEN andp =>--Rx:= Rx AND A;CASE IR(11 DOWNTO 10)IS WHEN “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)IS WHEN “00”=> R0:=R0 OR A;WHEN “01”=> R1:=R1 OR A;WHEN “10”=> R2:=R2 OR A;WHEN OTHERS=> R3:=R3 OR A;END CASE;WHEN xorp =>--Rx:= Rx XOR A;CASE IR(11 DOWNTO 10)IS WHEN “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)IS WHEN “0100”=> R0:=R1;WHEN “1000”=> 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=>--状态3 CASE IR(15 DOWNTO 12)IS WHEN Swap=>--Swap: A to Rx CASE 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)
WHEN OTHERS => NULL;END CASE;
WHEN 4=>--CASE IR(15 DOWNTO 12)IS WHEN jmp =>
条件转移指令
PC := IR(11 DOWNTO 0);MAR
WHEN Jz =>--令
IF(R0=“00000000”)then PC := IR(11 DOWNTO 0);MAR
WHEN Read => MAR MAR NULL;END CASE;
WHEN 5 =>--MAR--
CASE IR(15 DOWNTO 12)IS WHEN Read => R0 := M_data_in;
WHEN OTHERS=> NULL;END CASE;
取双字节指令的后半部分状态4
--无条件转移指状态5 状态6--
END CASE;END IF;END proce seq;
comb: PROCESS(reset, status)BEGIN IF(reset = '1' AND status = 5 AND IR(15 DOWNTO 12)= Write)THEN
Write_Read
ELSE Write_Read
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、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指令为Read 01F R0
第二条指令:同样的我们将24H设定为Move R1,R0 R1
第三、四指令:我们将 D0H、1FH设定为 Read 01F,即R0
第五条指令:我们将94H设定为 Shl R1 即将R1中的值左移一位,操作完成后R1的值变成了0A,与波形的情况也吻合。第六条指令:我们将31H设定为 Add R0,R1 R0
第七、八两条指令:我们将E0H和1EH设定为 Write 01E 01E
第九条指令:我们将41H设定为 SUB R0,R1 R0
第十条指令:我们将A1H设定为 Awap R0,R1(R0)(R1)指令,即为交换指令,我们预期R0=0A R1=39,从波形上看出我们执行了 A1H后与我们的R0、R1值与预期结果相同。
第十一条指令:61H 设定为 OR R0,R1 R0
第十二条指令:84H设定为Shr RI R1
第十三条指令:51H设定为AND R0,R1 执行相与操作,预计R0中为18,波形图上当执行到这条指令后R0中结果确实为38,指令运行正确。
第十四条指令:28H设定为Move R2,R0 转移指令,将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
第十九、二十条指令:C0H、19H 设定为:JZ019,若(R0)=0转移至019,否则执行下一条指令,我们分析R0中的值并不为0,故不会跳转,我们从波形上也可以看出,R0、R1、R2、R3中的值并没有发生任何变化
第二十一、二十二条指令:1DH、D0H设定为Read 01D R0
第二十三、二十四条指令:B0H、13H设定为: JMP 013指令 无条件跳转至013H地址,而013H 为JZ 019 指令 同时这是的R0寄存器中的值为0,满足了跳转条件,此时程序将跳转到019H地质处执行,即是我们的低二十五条指令,为停止指令,程序停止。
第二十五条指令:F0H 设定为Stop 指令,执行到此处程序停止。
此后的指令均为数据存储的指令,在这里我就不一一进行介绍了,详情可以查看下图这个32字节的RAM内情表。
4、仿真中遇到的问题:
仿真过程中的一些问题首先是PC、R0、R1、R2、R3里面的值的顺序需要将其颠倒。
仿真后还有一个问题是R0、R1、R2、R3的值显示不正确,R0只显示了到了05 后面的值就都不正确了,调试了半天,我发现波形显示M_q在上升沿变化后,与之相连的M_data_in竟然不变,最后经过各种搜索后解决了此问题,原来lpm为输出多做了一次寄存,也就是两个脉冲才会读出MAR的值。与PC的变化不衔接,整整快了两个脉冲。所以把图上红圈处的勾去掉就行了。
五、实验感想
经过此次实验
我对CPU的工作原理有了很深刻的认识,发现了其中蕴藏着巨大的乐趣,我完全的搞懂了此次试验的原理,再次基础上,我还能结合此次实验去理解微机接口,计算机组成原理等课程,通过此次实验,我能熟练的使用VHDL来编写大型的程序代码,对于一个学软件的人来说,我的编程能力又上了一个台阶。
除此之外,我学习到了很多底层的东西,让我对计算机的工作原理有了更深刻的理解,让我在此后的编程中将受益无穷。
可能老师您会看到我这个课程设计的很多拷贝,反正是我做的就是我做的,别人参考也好拷贝也好,我都觉得无所谓,重要的是我能学习到东西,这也让我学习到了很多做人的道理,你说同学问你要课程设计,我能不给么,但是作为同学我只能啰嗦一句,你只能参考啊,不要完全照搬。单是有些人他就要完全照搬你的图和分析,自己也不提出自己的看法和见解,这总是让我很心寒,特别是那些学习成绩还不错的。我真是想不通问什么要人家好心给你的报告参考,你反过来要坑人家,就这样的人品,学习好又能咋样呢,都是转空子的人,以后也不会得到大家的认可。