logo资料库

CPU设计实验报告.doc

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
一、 设计原理
二、设计步骤
VHDL代码
三、实验结果及结果分析
四、实验心得与总结
课 程 设 计 指 导 书 题 目: 硬件结构设计 院(系): 物联网工程学院 专 业: 姓 名: 班 级: 指导老师: 计算机科学与技术 紫林 计算机 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
分享到:
收藏