青岛理工大学控制器设计_第1页
青岛理工大学控制器设计_第2页
青岛理工大学控制器设计_第3页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、某某理工大学实验报告实验课程:计算机组成原理I实验日期: 2014年11月7日, 交报告日期:2014年11月曰,成绩: 实验地点:现代教育技术中心 305计算机实验室计算机工程 学院,计算机科学与技术 专业,班级:计算122班实验指导教师:龚玉玺批阅教师:龚玉玺同组 学生某某郝兴明徐鹏学号201207051201207065一、实验课题按照题目要求设计计算机控制器的根本逻辑不包括微操作信号产生电路,决定外部的端口名称、有效电平和内部各元件的连接,画出系统框图和逻辑图,设计仿真 数据,用VHDL编程和仿真。实验内容:用层次结构设计的方法设计控制器的指令部件。下层元件的设计已经在实验 3中完成。

2、包括:程序计数器、指令存放器、数据存放器、地址存放器、指令译码器等。本实验只需要做 顶层设计。顶层设计功能要求:具有控制器的局部根本功能,能够控制取指令操作、控制访存取数据操作、控制访存存 数据操作、指令译码,等。取指令机器周期:把程序计数器的内容送到地址总线,延迟一段时间后把从存储器中读 出的指令通过数据总线读入,送到指令存放器;每取一个指令字程序计数器加1。取数据机器周期:把地址存放器的内容送到地址总线,延迟一段时间后把从存储器中读 出的数据通过数据总线送到数据存放器。存数据机器周期:把地址存放器的内容送到地址总线,把数据存放器中的数据送到数据 总线,延迟一段时间后完毕。指令译码:假设操作

3、码在指令字的最高3位。提示1:控制器内部数据通路,可以是总线结构,也可以是直接连接结构。提示2:控制器与系统总线的连接方法,有两种结构可以考虑: 程序计数器、指令存放器、数据存放器、地址存放器都与系统总线有直接连接。 只有数据存放器和地址存放器与系统总线连接。程序计数器和指令存放器不与系统总线连接。程序计数器内容必须先送到地址存放器, 然后才能到地址总线。从存储器中读出的指 令必须先送到数据存放器,然后才能到指令存放器。仿真设计仿真波形数据,模拟取指令、访存取数据、访存存数据等操作。要考虑到所有可 能的情况。在实验报告中必须清楚说明仿真波形数据是怎样设计的。逻辑设计控制器系统框图LoadqLo

4、addLoadaLoadizqzdelkzpcIdretCotOCotlqaOqa7qd7qdOza端口说明:Loadq,loadd数据存放器的同步置数端口 Loada:地址存放器的同步置数端口Loadi:指令存放器的同步置数端口 zq,zd;数据存放器的三态控制端口Clk :时钟信号Zpc:程序计数器的三态控制端口 Za:地址存放器的三态控制端口 ld:程序计数器的同步置数端口 r:程序计数器的同步清零端口 et:程序计数器的加1控制端口 cot: cot(0),cot(1)分别控制数据存放器和程序计数器向地址存放器和指令存放器 的数据传送qd:数据的双向输入输出端口(连接系统数据总线)数据

5、从外部先送到系统总线才 可以送到数据存放器da:地址存放器输出端口连接系统地址总线 ic:经过译码器输出的控制信号 d:程序计数器的置数端口。控制器逻辑图三、VHDL源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;-ContolUnitentity control_unit isport(-loadd,loadq,loada,loadi同步置数端口高电平有效-zq,zd三态控制端口,低电平有效-zpc,za三态控制端口,高电平有效-elk时钟信号,上升沿有效-Id程序计数器的预置数端口,低电平有效

6、-r程序计数器的清零端口,低电平有效-et控制程序计数器自动加1功能-qd数据从内存读岀数据后送入系统总线的输入端,也是输岀端口 -ic译码器的输出端口,即:控制信号。-cot是控制数据在存放器间传输的信号-cot(O)控制DR到IR的数据流通-cot(1)控制程序计数器到AR的数据流通-d程序计数器的输入端口loadd,loadq,loada,loadi,zq,zd,clk,ld,r,et,za,zpc : in std_logic; cot : in std_logic_vector(1 downto 0);qd : inout std_logic_vector(7 downto 0);d

7、 : in unsigned(7 downto 0);ic : out std_logic_vector(7 downto 0);qa : out std_logic_vector(7 downto 0);end control_unit;architecture behave of control_unit is-数据总线和地址总线-signal ABUS : std_logic_vector(7 downto 0);-signal DBUS : std_logic_vector(7 downto 0);-引用地址存放器ponent address_registerport(-load同步并

8、行置数-z 三态输出 z=1 is valide signal-d输入-q输出load ,z ,clk : in std_logic;d : in std_logic_vector(7 downto 0);q : out std_logic_vector(7 downto 0);end ponent;-引用数据存放器ponent data_registerport(-elk时钟信号-zq控制q端口的三态-zd控制d端口的三态-Ioad1,load2同步并行置数.1 oadd控制d, loadq控制q-d输入输出双向端口-q输入输出端口elk,zd,zq,loadd,loadq : in std

9、_logic;d : inout std_logic_vector(7 downto 0);q : inout std_logic_vector(7 downto 0);end ponent;-引用译码器ponent decodeport(A: in std_logic_vector(2 downto 0);-输入Y: out std_logic_vector(7 downto 0)-输出);end ponent;-引用程序计数器ponent eight_countport(-et控制自动加1的端口-clk时钟信号-c进位输出-Z三态们 z=1-ld预制数控制端ld=0-r同步清零端r=0有效

10、et,clk ,z, ld,r :in std_logic;c : out std_logic;d : in unsigned(7 downto 0);q : out unsigned(7 downto 0);end ponent;-引用指令存放器ponent instruction_registerport(clk ,load : in std_logic;d : in std_logic_vector(7 downto 0);q : out std_logic_vector(7 downto 0);end ponent;-在程序计数器和地址存放器之间的内部信号signal pcdr : s

11、td_logic_vector(7 downto 0);signal USpcdr : unsigned(7 downto 0);-在数据存放器到指令存放器之间的内部信号signal drir : std_logic_vector(7 downto 0);signal deir : std_logic_vector(7 downto 0);-暂存信号signal t1 : std_logic_vector(7 downto 0);signal t2 : std_logic_vector(7 downto 0);signal t3 : std_logic_vector(7 downto 0);b

12、eginP1 : process(cot)beginif cot(1) = '0' thent1<=(others=>('Z');else t1<=pcdr;end if;if cot(0)='0' thent2<=(others=>('Z');else t2<=drir;end if;end process;-实例化程序计数器,PC : eight_count port map(clk=>clk,z=>zpc,et=>et,d=>d,ld=>ld,r=>r,

13、q=>USpcdr);-convert unsigned data to std_logic_vector;pcdr<=conv_std_logic_vector(USpcdr,8);-t1 <= cot(1) and pcdr;-实例化地址存放器AR : address_register port map(clk=>clk,z=>za,load=>loada,d=>t1,q=>qa);-实例化数据存放器DR : data_register port map(clk=>clk,zq=>zq,zd=>zd,loadd=>lo

14、add,loadq=>loadq,q=>qd,d=>drir);-实例化指令存放器IR : instruction_register port map(clk=>clk,load=>loadi,d=>t2,q=>deir);-实例化译码器DE : decode port map(A=>deir(7 downto 5),Y=>ic);end behave;-address_registerlibrary ieee;use ieee.std_logic_1164.all;entity address_register isport(-load同

15、步并行置数-z 三态输出 z=1 is valide signal-d输入-q输出load ,z ,clk : in std_logic;d : in std_logic_vector(7 downto 0);q : out std_logic_vector(7 downto 0);end address_register;architecture behave of address_register is signal iq : std_logic_vector(7 downto 0);beginprocess(clk,z,load)beginif rising_edge(clk) and

16、load = '1' then iq<=d;end if;if z='1' thenqv=(others=>'Z');elseq<=iq;end if ;end process;end behave;-data registerlibrary ieee;use ieee.std_logic_1164.all;entity data_register isport(-clk时钟信号-zq控制q端口的三态-zd控制d端口的三态-load1,load2同步并行置数.loadd控制d, loadq控制q-d输入输出双向端口-q输入输出端

17、口clk,zd,zq,loadd,loadq : in std_logic;d : inout std_logic_vector(7 downto 0);q : inout std_logic_vector(7 downto 0);end data_register;architecture behave of data_register issignal iq : std_logic_vector(7 downto 0);beginprocess(clk,zd,zq,loadd,loadq)beginif rising_edge(clk) thenif loadd = '1'

18、 and zd = '0' then-因为d是双向端口,当 d作为输入端口时,-d作为输岀端口时应该是高阻态,否如此会产生线 与iq <=d;d<=(others=>'Z');end if;if loadq = '1' and zq = '0' theniq<=q;q<=(others=>'Z');end if;end if;if zd = '0' then -三态门关闭d<=(others=>'Z');else d<=iq;en

19、d if;if zq = '0' then-三态门关闭q<=(others=>'Z');else q<=iq;end if;end process;end behave ;-Decodelibrary ieee;use ieee.std_logic_1164.all;entity decode isport(A: in std_logic_vector(2 downto 0);-输入Y: out std_logic_vector(7 downto 0)-输出);end decode;architecture de_behave of decod

20、e issignal s: std_logic;beginprocess(A)begincase A iswhen "000"=> Y<="11111110"when "001"=> Y<="11111101"when "010"=> Y<="11111011"when "011"=> Y<="11110111"when "100"=> Y<="1

21、1101111"when "101"=> Y<="11011111"when "110"=> Y<="10111111"when "111"=> Y<="01111111" end case;end process;end de_behave;-eight_countlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity eight_

22、count isport(-et控制自动加1的端口-elk时钟信号-c进位输出-Z三态们 z=1-ld预制数控制端ld=0-r同步清零端r=0有效et,clk ,z, ld,r :in std_logic;c : out std_logic;d : in unsigned(7 downto 0);q : out unsigned(7 downto 0);end eight_count;architecture behave of eight_count is signal iq : unsigned(7 downto 0);beginprocess (clk,et,z,ld,r)beginif

23、 rising_edge(clk) thenif r = '0' then-同步清零 iqv=(others=>'0');elsif ld = '0' then iq<=d;-预制数 elsif et = '1' then iq<=iq+1;-计数 end if;end if;if iq = 255 then c <='1'-计数至U 255,产生进位 else cv='O:end if;q<=iq;if z = '1' then -三态们关闭c<=

24、9;Z'qv=(others=>'Z');end if;end process;end behave;library ieee;use ieee.std_logic_1164.all;entity instruction_register isport(clk ,load : in std_logic;d : in std_logic_vector(7 downto 0);q : out std_logic_vector(7 downto 0);end instruction_register;architecture behave of instruction_

25、register issignal save : std_logic_vector(7 downto 0);beginprocess(clk , load)beginif rising_edge(clk) and load='1' thensave<=d;end if;qv=save;end process;end behave;四、仿真设计由于元器件的仿真在实验 3中已经做过,所以此处不再进展元器件的仿真。 首先令clk每隔10纳秒翻转一次。et=1有效,ld=1无效,r=1无效 这是程序计数器处于工作状态。取指令:在第三个时钟上升沿时,zpc=0,(程序计数器三态门打开),loada=1(地址存放器同步控制端有效),za=0(地址存放器三态门打开),Cot(1)=1(让pc输出的数据传入地址存放器),这是输出应该是00000010,因为程序计数器刚好计数三个。访存取指令:下一个时钟上升沿时.qd=11111111,zq=0,zd=1,loadq=1,loadd=0.za=1,zpc=1,loada=0,loadi=1,cot(0)=1下一个时钟上升沿时:zd=1(数据存放器的三态门打开),loadi=1(指令存放器的同步置数端口有效),cot= '1'让数据存放器里的数据传入指令存放器)。结果ic输出的应该是qd的高三位对应的指

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论