您的当前位置:首页正文

西南交通大学计算机组成原理课程设计报告

2022-07-08 来源:趣尚旅游网


.

.

《计算机组成实验 C》

课程设计

适用专业:电子信息类专业 专 业:软件工程 班 级:软件一班 学 号: 姓

名:某某某

指导教师:陈红梅

实验学期:2014-2015 第 1 学期

西 南 交 通 大 学

信息科学与技术学院

.

目录

简化计算机系统的设计 ....................................................................................................................... 2

一、实验目的 ............................................................................................................................... 2 二.、实验内容 ............................................................................................................................... 2 三.、预习要求 ............................................................................................................................... 2 四、实验报告 ............................................................................................................................... 2

1. BLOCK图 ........................................................................................................................... 3 2. 程序设计(纸质的版本我用手抄) ........................................................................... 4 3. 仿真波形图 ................................................................................................................. 11 4、仿真中遇到的问题: ................................................................................................... 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_address: 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 <= 0 ; ELSIF clock'EVENT AND clock = '0' THEN CASE status IS WHEN 0 => status <= 1; WHEN 1 =>

IF IR(15 DOWNTO 12) = Stop THEN status <= 1; ELSE

status <= 2; END IF; WHEN 2 =>

CASE IR(15 DOWNTO 12) IS WHEN Read|Write|Jmp|Jz|Swap => status <= 3; WHEN OTHERS => status <= 0; END CASE; WHEN 3 =>

IF IR(15 DOWNTO 12)= Swap THEN status <= 0; ELSE

status <= 4; END IF; WHEN 4 =>

status <= 5; WHEN 5 =>

CASE IR(15 DOWNTO 12) IS WHEN Read|Write => status <= 6; WHEN OTHERS => status <= 0; END CASE; WHEN OTHERS => status <= 0; END CASE; 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 <= (OTHERS=>'0'); PC := (OTHERS=>'0'); R0 := (OTHERS=>'0'); R1 := (OTHERS=>'0'); R2 := (OTHERS=>'0'); R3 := (OTHERS=>'0'); A := (OTHERS=>'0'); MAR <= (OTHERS=>'0'); MDR <= (OTHERS=>'0');

ELSIF(clock'event AND clock='1') THEN overflow <= '0'; CASE status IS

WHEN 0=> --状态0 IR <= M_data_in & \"00000000\"; --取指令 PC := PC+1; --程序计数器加1 WHEN 1=> --状态1 IF (IR(15 DOWNTO 12) /= stop) THEN MAR <= PC; 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)); WHEN \"01\"=>

temp :=(R1(7) & R1(7 DOWNTO 0)) + (A(7) & A(7 DOWNTO 0)); WHEN \"10\"=>

temp :=(R2(7) & R2(7 DOWNTO 0)) + (A(7) & A(7 DOWNTO 0)); WHEN OTHERS=>

temp :=(R3(7) & R3(7 DOWNTO 0)) + (A(7) & A(7 DOWNTO 0)); END CASE;

WHEN subp => -- 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; WHEN \"01\"=>

temp :=(R1(7) & R1(7 DOWNTO 0)) + NOT(A(7) & A(7 DOWNTO 0)) + 1; WHEN \"10\"=>

temp :=(R2(7) & R2(7 DOWNTO 0)) + NOT(A(7) & A(7 DOWNTO 0)) + 1; WHEN OTHERS=>

temp :=(R3(7) & R3(7 DOWNTO 0)) + NOT(A(7) & A(7 DOWNTO 0)) + 1; END CASE;

WHEN move => CASE IR(11 DOWNTO 10) IS WHEN \"00\"=> R0:= A; WHEN \"01\"=> R1:= A; WHEN \"10\"=> R2:= A; WHEN OTHERS=> R3:= A; END CASE;

.

R0:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); R1:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); R2:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); R3:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); R0:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); R1:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); R2:=temp(7 DOWNTO 0); overflow <= temp(8) xor temp(7); R3:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); .

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)<= M_data_in; PC := PC+1; WHEN OTHERS => NULL; END CASE;

WHEN 4=> -- CASE IR(15 DOWNTO 12) IS WHEN jmp => 条件转移指令

PC := IR(11 DOWNTO 0); MAR <= IR(11 DOWNTO 0); WHEN Jz => -- 令

IF(R0=\"00000000\") then PC := IR(11 DOWNTO 0); MAR <= IR(11 DOWNTO 0); else

MAR <= PC; END IF; WHEN Read => MAR <= IR(11 DOWNTO 0);

WHEN Write => MAR <= IR(11 DOWNTO 0); MDR <= R0;

WHEN OTHERS => NULL; END CASE;

WHEN 5 => -- MAR <= PC;

WHEN 6 => -- 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 process seq; comb: PROCESS (reset, status) BEGIN

IF (reset = '1' AND status = 5 AND IR(15 DOWNTO 12)= Write ) THEN Write_Read <= '1';

ELSE Write_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、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<-(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 的数据值了。从波形图上我们也能看出吻合。 第五条指令:我们将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设定为 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 转移指令,将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中的值将会为 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地址,而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来编写大型的程序代码,对于一个学软件的人来说,我的编程能力又上了一个台阶。 除此之外,我学习到了很多底层的东西,让我对计算机的工作原理有了更深刻的理解,让我在此后的编程中将受益无穷。 可能老师您会看到我这个课程设计的很多拷贝,反正是我做的就是我做的,别人参考也好拷贝也好,我都觉得无所谓,重要的是我能学习到东西,这也让我学习到了很多做人的道理,你说同学问你要课程设计,我能不给么,但是作为同学我只能啰嗦一句,你只能参考啊,不要完全照搬。单是有些人他就要完全照搬你的图和分析,自己也不提出自己的看法和见解,这总是让我很心寒,特别是那些学习成绩还不错的。我真是想不通问什么要人家好心给你的报告参考,你反过来要坑人家,就这样的人品,学习好又能咋样呢,都是转空子的人,以后也不会得到大家的认可。

.

因篇幅问题不能全部显示,请点此查看更多更全内容