课 程 设 计 指 导 书
题 目:
硬件结构设计
院(系):
物联网工程学院
专 业:
姓 名:
班 级:
指导老师:
计算机科学与技术
紫林
计算机 1304
柴志雷
设计时间: 15-16 学年
1
学期
2015 年 12 月
目录
一、 设计原理............................................................................................................. 2
CPU 结构 Vision 图................................................................................................3
二、设计步骤............................................................................................................... 3
VHDL 代码..............................................................................................................4
三、实验结果及结果分析......................................................................................... 10
四、实验心得与总结................................................................................................. 10
一、 设计原理
目前以硬件描述语言( VHDL)所完成的电路设计,可以经过简单的综合与布
局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编
辑元件可以被用来实现一些基本的逻辑门电路(比如 AND、OR、XOR、NOT)或
者更复杂一些的组合功能比如解码器或数学方程式。在大多数的 FPGA 里面,这
些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的
记忆块。
系统设计师可以根据需要通过可编辑的连接把 FPGA 内部的逻辑块连接起来,就
好像一个电路试验板被放在了一个芯片里。一个出厂后的成品 FPGA 的逻辑块和
连接可以按照设计者而改变,所以 FPGA 可以完成所需要的逻辑功能。计算机最
核心的部分叫做中央处理器,也就是我们常说的 CPU,计算机所做的所有工作都
需要经过 CPU 的处理,本设计以 VHDL 位基础设计一个简易的 CPU。
CPU 结构 Vision 图
这样一个完整的CPU内部电路就出来了。
二、设计步骤
处理器的字长为 16b;包括四种指令格式,格式 1、格式 2、格式 3 的指令字长
度为 8b,格式 4 的指令字长度为 16b;处理器内部的状态机包括 6 个状态。
关于 CPU:
操作码 4 位,一共设计 16 条指令,主要包括空操作指令、中断指令、加法指令、
减法指令、三种逻辑运算指令、循环移位操作指令,数据传输指令,转移类指令,
特权指令等等。
关于 RAM:
地址线设置成 16bits,主存空间为 64words。 书中原 CPU 的主要修改:
(1)模型机 CPU 指令集中的逻辑左移与逻辑右移改成算术左移与算术右移左
移。
(2)模型机 CPU 指令集中的 add 实现减法,sub 实现加法。 (3)模型机 CPU
指令集中的 Jmp,Jz 改为 skp,not 指令。 (4)模型机 CPU 指令的执行流程及状态
跳转。
VHDL 代码
swap
std_logic_vector(3
std_logic_vector(3
std_logic_vector(3
std_logic_vector(3 :
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE namespack IS
CONSTANT idle : std_logic_vector(3 DOWNTO 0) :="0000";
CONSTANT load : std_logic_vector(3 DOWNTO 0) :="0001";
CONSTANT move 0) :="0010";
CONSTANT addP 0) :="0011";
CONSTANT andp 0) :="0100";
CONSTANT nandp 0) :="0101";
CONSTANT orp 0) :="0110";
CONSTANT xnorp 0) :="0111";
CONSTANT shrp 0) :="1000";
CONSTANT shlp 0) :="1001";
:
CONSTANT
std_logic_vector(3 :
std_logic_vector(3 std_logic_vector(3
std_logic_vector(3 std_logic_vector(3 DOWNTO DOWNTO DOWNTO DOWNTO
DOWNTO DOWNTO DOWNTO DOWNTO 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 namespack;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE WORK.namespack.ALL;
------------------------cpu 实体声明---------------------------------
ENTITY cpu IS
PORT(
reset
--清零信号低有效
clock
--时钟信号
Write_Read:
--读写信号,'1'为写 : IN std_logic; : IN std_logic; OUT std_logic;
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;
------------------------cpu 寄存器传输级行为描述
--------------------------------
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 Swap|Jmp|Jz|Read|Write => 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
IR <= M_data_in & "00000000"; --取指令
PC := PC+1; --程序计数器加 1
WHEN
--状态 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 Move => --Move Rx,Ry;
CASE IR(11 DOWNTO 8) IS
WHEN "0001"=> R0:=R1;
WHEN "0010"=> R0:=R2;
WHEN "0011"=> R0:=R3;
WHEN "0100"=> R1:=R0;
WHEN "0110"=> R1:=R2;
WHEN "0111"=> R1:=R3;
WHEN "1000"=> R2:=R0;
WHEN "1001"=> R2:=R1;
WHEN "1011"=> R2:=R3;
WHEN "1100"=> R3:=R0;
WHEN "1101"=> R3:=R1;
WHEN "1110"=> R3:=R2;
WHEN OTHERS=> NULL;
END CASE;
WHEN Shrp
--算术右移;
CASE IR(11 DOWNTO 10) IS
WHEN "00"=>
R0:="000"&R0(5 DOWNTO 1); WHEN "01"=>
R1:="000"&R1(5 DOWNTO 1); WHEN "10"=>
R2:="000"&R2(5 DOWNTO 1); WHEN OTHERS=>
R3:="000"&R3(5 DOWNTO 1); END CASE;
WHEN
--算术左移;
CASE IR(11 DOWNTO 10) IS
WHEN "00"=>
R0:=R0(4 DOWNTO 0)&"000"; WHEN "01"=>
R1:=R1(4 DOWNTO 0)&"000"; WHEN "10"=>
R2:=R2(4 DOWNTO 0)&"000"; WHEN OTHERS=>
R3:=R3(4 DOWNTO 0)&"000"; END CASE;
WHEN Addp|Andp|Nandp|Orp|Xnorp|Swap =>
CASE IR(9 DOWNTO 8) IS
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
CASE IR(15 DOWNTO 12) IS
WHEN
--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(8) XOR temp(7);
WHEN "01"=>
temp :=(R1(7) & R1(7 DOWNTO 0)) + NOT(A(7) & A(7 DOWNTO 0))+1;
R1:=temp(7 DOWNTO 0);
overflow <= temp(8) XOR temp(7); WHEN "10"=>
temp :=(R2(7) & R2(7 DOWNTO 0)) + NOT(A(7) & A(7 DOWNTO 0))+1;
R2:=temp(7 DOWNTO 0);
overflow <= temp(8) XOR temp(7); WHEN OTHERS=>
temp :=(R3(7) & R3(7 DOWNTO 0)) + NOT(A(7) & A(7 DOWNTO 0))+1;
R3:=temp(7 DOWNTO 0);
overflow <= temp(8) XOR temp(7); END CASE;
WHEN
-- 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 Nandp -- Rx:= Rx NAND A;
CASE IR(11 DOWNTO 10) IS WHEN "00"=>
R0:=R0 nand A; WHEN "01"=>
R1:=R1 nand A; WHEN "10"=>
R2:=R2 nand A; WHEN OTHERS=>
R3:=R3 nand 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 Xnorp --Rx=Rx XNOR A;
CASE IR(11 DOWNTO 10) IS WHEN "00"=>
R0:=R0 XNOR A; WHEN "01"=>
R1:=R1 XNOR A; WHEN "10"=>
R2:=R2 XNOR A; WHEN OTHERS=>
R3:=R3 XNOR A; END CASE;
WHEN Swap