20132184朱彦荣_计组课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机组成实验C》
课程设计
适用专业:电子信息类专业
专业:软件工程
班级: 2班
学号: ********
*名:***
指导教师:***
实验学期: 2015-2016上学期
西南交通大学
信息科学与技术学院
简化计算机系统的设计
一.实验目的:
通过学习简单的指令系统及其各指令的操作流程,用Verilog HDL 语言实现简单的处理器模块,并通过调用存储器模块,将处理器模块和存储器模块连接形成简化的计算机系统。
二. 实验内容
1. 底层用Verilog HDL 语言实现简单的处理器模块的设计。
2. 调用存储器模块设计64×8 的存储器模块。
3. 顶层用原理图方式将简单的处理器模块和存储器模块连接,形成简单的计算机系统。
4. 将指令序列存入存储器,然后分析指令执行流程。
三. 预习要求:
1、学习简单指令集。
2、学习各指令的操作流程。
四. 实验报告
1. 顶层原理图设计文件(BLOCK 图)
2.底层模块的Verilog HDL源程序设计
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
ENTITY cpu IS
PORT(
M_data_in: IN std_logic_vector(7 DOWNTO 0); --输入
M_data_out: OUT std_logic_vector(7 DOWNTO 0); --输出
cpupc:out std_logic_vector(11 downto 0); --pc寄存器
cpustatus: out integer RANGE 0 TO 6; --状态信息,共7种
cpuR0,cpuR1,cpuR2,cpuR3,cpuA:out std_logic_vector(7 DOWNTO 0);
cpuIR: out std_logic_vector(15 downto 0); --存放指令本身
reset : IN std_logic; --清零信号低电平有效
clock : IN std_logic; --时钟
overflow: OUT std_logic ; --溢出
Write_Read: OUT std_logic; --读写信号,'1'为写,‘0’为读
M_address: OUT std_logic_vector(11 DOWNTO 0); --地址12根,不全用
SEL:buffer STD_LOGIC_VECTOR(2 DOWNTO 0);
LED7:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END;
ARCHITECTURE zyr20132184_behavior of cpu IS
CONSTANT idle : std_logic_vector(3 DOWNTO 0) :="0000";
--无操作,PC++
CONSTANT load : std_logic_vector(3 DOWNTO 0) :="0001";
--R0<-I,PC++
CONSTANT move : std_logic_vector(3 DOWNTO 0) :="0010";
--Rx<-(Ry);PC++
CONSTANT addx : std_logic_vector(3 DOWNTO 0) :="0011";
--Rx <- (Rx)+(Ry);PC++
CONSTANT subp : std_logic_vector(3 DOWNTO 0) :="0100";
--Rx <- (Rx)+(Ry);PC++
CONSTANT andp : std_logic_vector(3 DOWNTO 0) :="0101";
--Rx <- (Rx) and (Ry);PC++
CONSTANT orp : std_logic_vector(3 DOWNTO 0) :="0110";
--Rx <- (Rx) or (Ry);PC++
CONSTANT xorp : std_logic_vector(3 DOWNTO 0) :="0111";
--Rx <- (Rx) xor (Ry);PC++
CONSTANT shrp : std_logic_vector(3 DOWNTO 0) :="1000";
--Rx<-(Rx)逻辑右移;PC++
CONSTANT shlp : std_logic_vector(3 DOWNTO 0) :="1001";
--Rx<-(Rx)逻辑左移;PC++
CONSTANT swap : std_logic_vector(3 DOWNTO 0) :="1010";
--A<-(Ry);Ry<-(Rx);Rx<-(A);PC++
CONSTANT jmp : std_logic_vector(3 DOWNTO 0) :="1011";
--pc++;pc<-addr
CONSTANT jz : std_logic_vector(3 DOWNTO 0) :="1100";
--pc++; if(R0)=0 then pc<-addr else pc++
CONSTANT read : std_logic_vector(3 DOWNTO 0) :="1101";
--pc++;R0<-(addr);pc++
CONSTANT write : std_logic_vector(3 DOWNTO 0) :="1110";
--pc++;addr<-(R0);PC++
CONSTANT stop : std_logic_vector(3 DOWNTO 0) :="1111";
--无操作,pc不变
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; --状态寄存器
shared VARIABLE PC:std_logic_vector(11 DOWNTO 0); --程序计数器
shared VARIABLE R0,R1,R2,R3: std_logic_vector(7 DOWNTO 0); --通用寄存器
shared VARIABLE A: std_logic_vector(7 DOWNTO 0); --临时寄存器
SIGNAL DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clock)
BEGIN
IF clock'EVENT AND clock='1'
THEN
IF SEL>="001" THEN SEL<="000";
ELSE SEL<=SEL+1;
END IF;
CASE SEL IS
WHEN "000"=> DATA<=M_data_in(3 downto 0);
WHEN "001"=> DATA<=M_data_in(7 DOWNTO 4);
WHEN OTHERS =>NULL;
END CASE;