




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单计算机系统基本模块设计实验报告一. 实验目的1. 掌握简单计算机系统的指令系统2. 掌握简单计算机基本模块设计的方法3. 巩固eda电路仿真和调试方法4. 掌握执行r型、i型、j型指令的数据通道5. 掌握alu运算单元模块的设计方法6. 掌握简单控制单元模块的设计方法二. 设计思路简单的计算机系统的基本组成如下图1所示。整个系统山寄存器组、alu、控制单元、 rom、ram、输入设备、输出设备以及输入/输出设备接口组成,各部分通过总线连接起来, 总线内部包括地址、数据、和控制等信号。|控制单元寄存器组alucpui/o端口及其映射ramromi/o 接口i/o 接口5?输入设备输岀设备图1
2、计算机系统从输入设备(如键盘)输入参加运算的操作数及加、减等运算符,并通过输 入设备接口将这些操作数和运算符存放在寄存器或存储系统中,然后通过执行存放在存储系 统屮的程序,实现运算,并将运算的结果通过输出设备(如数码管)显示出來。整个过程的 实现是通过存储在rom屮的程序来进行控制的。整个系统的设计思路是根据计算机系统的组成,分别设计出相应的模块,最终在将各个 模块连接起来,组成整个系统。三. 模块说明1.寄存器组模块根据指令的特点,在r型指令小有两个操作数來白寄存器组,作为算术逻辑单元 alu的输入,另一个操作数是alu的输出,需要写回寄存器组。所以寄存器模块需要两 个读通道,1个写通道,至
3、少需要3个寄存器。本次实验设计的寄存器组中共含冇4个 寄存器,因此 需要读写通道各需要两位输入,用nl, n2, nd分别输入读通道1,读通道2,写通道的寄存器号,信号为“00”“01”“10”“11”分别对应寄存器r0,rl,r2, r3o为了能够控制寄存器的读写,需要设置一个写允许信号,当该信号为1 时,在clk的上升沿将输入数据di写入nd对应的寄存器,为0时禁止对寄存器进行 写操作,只能进行读操作,将n1对应的寄存器中的内容从q1输出,将n2对应的寄存 器的内容从q2输出。寄存器组模块由1个2-4译码器,2个8位4选1数据选择器和4个寄存器组成, 这三个基本单位可以ill quartu
4、sll的mega wizard生成。sel4 1一 dataox7.o一 data1x7.0l一 data2刈7.0 data3 刈 7.0sel1.0result7.oaclrq70clockdata7.oenablereginstlinst3其中寄存器(reg)还有一个杲步清零端和一个使能端,将写通道的输入nd作为2-4 译码器的输入信号,译出的4个信号分别与输入reg_we相与作为reg的enable信号, nl, n2信号分别作为两个数据选择器的sei信号,4个寄存器的输出作为数据选择器的 数据输入,两个数据选择器的输出分别为qi, q2。按照上述逻辑构成的寄存器组电路寄存器组模块信号
5、说明:输入信号:n11.o:读通道1的寄存器号n21.0j:读通道2的寄存器号nd1.o:写通道的寄存器号di7.0j:写通道的输入数据clk:时钟脉冲信号,上升沿冇效reg_we:写允许,为1吋,在clk上升沿,将数据di写入nd指定的寄存器; 为“0”时,禁止对寄存器阵列进行写操作。rst:异步复位信号,清空所有寄存器的内容输出信号:q1 7.0:输出nl 1 .0指定寄存器的内容q27.o:输出n21.0指定寄存器的内容仿真结果:clk11iii r1111 di18)(0r70田n1厂 _0el n20x2x0a nd0()(0田qi18)(0el q2<ox18dc8x0reg
6、-wereset仿真完成的操作是先向r0写入数据18后读出,然后再向r2写入数据8后读出, 最后执行了一个清零操作2. ram数据存储系统模块ram数据存储系统容最为256x8,即有256个存储单元,地址编码顺序为0x000xff, 每个单元可以存放8位二进制信息,利用quartusll生成相应的模块如下:ram模块信号说明如下:输入信号:address7.o:需要进行读/写操作ram单元的地址data7.o:待写入ram中的数据wren:写允许信号,为1时写;为0则读clock:时钟脉冲信号,上升沿将数据写入或读出aclr:异步复位信号,对q7.o进行清0输岀信号:q7.o:输出addres
7、s 7.0指定的ram单元的内容仿真结果如下:ulr1i1田 tddrtsiti)-: 6 )【0】clocks data 田qvreni n r1 11 11 11 1_:14xx8x0:0厂14x8 )ox1波形完成的操作是先向地址1写入14,然后读出地址1里的数,乂向地址6写入数据8, 然后读出地址6里的数据,最后执行了 一个清零操作。3. i/o端口及其映射模块i/o端口是输入/输出接口电路中用來存放输入输出设备的数据缓冲器。计算机系统 通过读写i/o端口的数据,实现与外部设备的数据传送。为了实现i/o的双向读写,需 要设计基木的三态门单元。指令系统屮没有肓接对i/o端口的操作指令,为
8、了实现用指 令对i/o的控制,盂要设计一个映射模块,将指令系统中对ram存储单元0x00-0x07 的读写转换成为对i/o对应地址的读写。还需要一个数据选择器将8个i/o端口的输入 选择输出。三态门由quartusll牛成,如卜-图所示:8位8选1数据选择器也由quartusll牛成,如下图所示:sel_8_dataox7.oresult7.o一datalx7.odata2x7.odata3x7.odata4x7.odata5x7.odata6x7.odata7x7.osel2.oinst33映射模块用vhdl语言写成,代码如下:library ieee;use ieee.std logic
9、1164.all;use ieee.std logic arith.all;use ieee.std_logic_unsigned.all;entity orm isport ( address : in std_l0gic_vect0r(7 downto 0); we : in std logic;sei : out std_l0gic_vect0r(2 downto 0); i : out std_l0gic_vect0r(7 downto 0);endorm;architecture behave of orm isbeginprocess (address ,we)beginif we
10、='l,thencase address iswhen "00000000,=> l<="00000001,'when n00000001"=> l<="00000010,;when "00000010"=> l<="00000100"when "00000011"=> lv二”00001000”;when "00000100"=> l<="00010000m;when "0000010
11、1"=> lv二”00100000”;when ,00000110"=> l<="01000000,;when "00000111"=> lv二”10000000”; when others=> null;end case;else null;end if;end process;end behave;信号说明:输入:address7.o:指令中的地址we:写控制信号,为高电平时将地址译成对应端口的写有效控制信号07.0:对应于8个i/o端口的写控制信号sel2.o:取address的低3位作为数据选择器的选择信号
12、三个部分z间的连接规则:将映射模块给出的写控制信号分别作为8个三态门的写控制信号,读信号作为8 个三态门的读控制信号,sei作为数据选择器的选择信号。根据以上逻辑连接的i/o模 块原理图如下: -ia*封装后电路图如下:io_portdin7.odout7.0iaddr7.oi007.0reio17.01weq27.o1q37.o1io47.0io57.0io67.0q77.oinstli/o端口及其映射模块信号说明:输入信号:addr7.0j:地址输入信号din7.o:写入i/o端口中的数据信号re:读控制信号,高电平有效we:写控制信号,高电平有效输出信号dout7.0j:读i/o端口时输
13、出的数据信号ioead: i/o端口读控制信号,高电平有效,读0x000x07存储单元时有 效io_write: 1/0端口写控制信号,高电平冇效,写0x000x07存储单元时冇 效输入/输出信号1007.0:双向i/o端口 0的数据信号1017.,0:双向i/o端口 1的数据信号1027.,0:双向i/o端口 2的数据信号io37.0:双向i/o端i丨3的数据信号1047.0:双向i/o端口 4的数据信号1057.0:双向i/o端口 5的数据信号1067.0:双向i/o端口 6的数据信号1077.0:双向i/o端口 7的数据信号仿真结果如下:仿真波形截图如卜一,第一幅图可以看出在向3号i/o
14、写入6,然后乂从3号i/o读 出2,第二幅图是结果+ addr田din田 dout田100s"ioi0 102田103s 104田105田106 107i o_readio write(3xeh(6x2(0x厂(0x厂厂_厂r厂厂rewei o readresuj4. rom程序存储模块rom程序存储系统容屋为256x16,共有256个存储单元,地址为oxoooxff,每个 单元可存放16位二进制信息。由quartusti生成如下模块:ipm rom 256 16address7.o> clockq15.oinst2输入信号:addrcss7.o: rom单元的地址clock:
15、时钟脉冲信号,在时钟的上升沿,将选中的rom单元内容输出 输出信号:q15.o:输岀address 7.0指定的rom单元的内容5. 8位算术逻辑运算器alu模块8位计算器能完成的运算有7种:”与”、”或'、”比较”、”不带进位加”、”不带借 位减”、”带进位加”、”带借位减”,运算关系如下表所示cs3.o运算001与010或011不带进位加100不带进位减101带进位加110带进位减111比较根据以上运算关系,编写vhdl语言代码如下:library ieee;use ieee.std logic 1164.all;use ieee.std logic arith.all;use i
16、eee.std_logic_unsigned.all;entity alu isport( cs : in std_l0gic_vect0r(2 downto 0);data_a,data_b : in std_l0gic_vect0r(7 downto 0); carryjn : in std_logic;s : out std_l0gic_vect0r(7 downto 0); zerozcarry_out,overflow : out std_logic);end alu;architecture behave of alu isbeginprocess(cs,data_a,data_b
17、,carryjn)variable temp_a,temp_b,pius_temp,temp_carry : std_l0gic_vect0r(8 downto 0);variable s_temp,temp,tempi: std_l0gic_vect0r(7 downto 0);variable t: std_l0gic_vect0r(2 downto 0);begincase cs iswhen "001"=>s_temp:=data_a and data_b;s<=s_temp; carry_out<=,0'overflow<='
18、;0,;when "010"=>s_temp:=data_a or data_b;s<=s_temp; carry_out<=,0,;overflow<='0,;whentemp_a:='o'&data_a;temp_b:o'&data_b; plus_temp:=temp_a+temp_b;s_temp:=plus_temp(7 downto 0);s<=s_temp;carry_out<=plus_temp(8); t:=data_a(7)&data_b(7)&plus_
19、temp(7);if t=u001" or t="lll" then overflowed 1'else overflow<=*0'end if;when "100n=>if data_a<data_b then carry_out<='0'else carry_out<='l'end if;s_temp:=data_a data_b;s<=s_temp;temp:=data_a+data_b;t:=data_a(7)&data_b(7)&temp( 7)
20、;if t="100h or t="100" then overflow<='l'else overflow<=*0'end if;when "101"=>temp_a:='o'&data_a;temp_b:=,o,&data_b;temp_carry:二”00000000“&carry_in; p i u s_te mp:=tem p_a+te m p_b+te m p_ca r ry;s_temp:=plus_temp(7 downto 0);s<=s_
21、temp;carry_out<=plus_temp(8); t:=data_a(7)&data_b(7)&plus_temp(7);if t="001" or t="lll" then overflow<='l'else overflow<='0'end if;when "110"=>if data_a<data_b then carry_out<=,0,;else if data_a=data_b thenif carry_in='o'
22、; then carry_out<='0'else carry_out<='l'end if;else carry_out<='l*;end if;end if;templ:="0000000"&carry_in;s_temp:=data_a-data_b-("00000001"-templ);s<=s_temp;temp:=data_a+data_b+("00000001"-templ);t:=data_a(7)&data_b(7)&temp(7
23、);if t="100h or t=h010" then overflow<='l'else overflow<='0'end if;when ,111"=>if data_a<data_b then s_temp:=”00000001”;else s_temp:=,00000000"end if;s<=s_temp;carry_out<='0,; overflow<='0'when others=>null;end case;if s_temp=&q
24、uot;00000000, then zero<='l' else zero<='0' end if;end process;end behave;封装后得到:alucs2.os?.oidata_a7.ozerodata_b7.ocarry _outcarrynov erf lowinst输入信号:data_a7.0> data_b7.o:参与操作的两个8位二进制数cs2.o:存放7种运算操作的编码,编码规则自定carryjn:参与运算的进/借位值 输出信号:s7.o:操作后的8位结果存放在中,zero:零标志 当 s7.o为 0 时,zero
25、= 1;否则 zero=0;carry_out:进位/借位标志 当加法运算过程最高位有进位时,carry_out= 1;否则carry_out=0;当减法运算最高位产生借位时,carry_out=0;否则,carry_out= 1 overrow:溢出标志把参加、减运算的过程看作是符号数运算吋,当结果产生溢出时, overrow= 1;否则,overrow=0,表示未溢出。仿真结果:上图第一幅波形执行的操作是两个数的与、或、不带进位加、不带进位减4种操作,第二幅 执行两个数的带进位加、带进位减、比较3种运算,由图可见电路逻辑正确6.标志寄存器模块标志寄存器与寄存器组中的寄存器功能相似,均可用于
26、存放信息,不同的是标志寄 存器用于存放算术、逻辑运算过程和结果的一些标志信息,如进/借位carry>零标志位 zero、溢出标志位overflow等。编写的vhdl语言如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std logic unsigned.all;entity flag isport( flagin : in std_l0gic_vect0r(7 downto 0);clk : in std_logic;reset: in std_logic;flagout:
27、 out std_l0gic_vect0r(7 downto 0) );end flag;architecture behave of flag isbeginprocess(clk,reset)variable temp : std_l0gic_vect0r(7 downto 0); beginifreset='l'thentemp:=,00000000,'flagout<="00000000,'elseflagout<=temp;if clk'event and clk=1 thentemp:=flagin;end if;end
28、 if;end process;end behave;封装后如f:flagiflagin7.oflagout7.0clkresetinstl标志寄存器模块信号说明:输入信号:flagin7.o:写人标志寄存器的数据,如carry、zero> overflow等信息, 每个标志占j位,共3位,其他5位暂时无用。clk:写时钟脉冲信号,上升沿时,将flagin上的数据写入flagout中reset:界步复位信号,对标志寄存器内容清零flagout7.0=0 输出信号:flagout7.0j:标志寄存器的数据仿真结果如下: nnjuinjuuuuuuirlnjinjuuuuijirlruuuu
29、uinjijuuuuulnjuuuuuuuinjin s flagin柯 x"而x )ckq 0【"门门门1 100s flagoutreset由仿真波形可见寄存器的读写以及清零功能都完成了。7. 控制器单元模块控制单元的逻辑如下: 当op3.o为“0000"或“1000"时,执行and或andi; 当op3.0为“0001 ”或“ 1001 ”时,执行or或ori; 当op3.o为“001(f或t01(f或“1011”或“1100”时,执行add或addi或lw、sw屮需要的不带 进位加法操作; 当op3.0为“0011”或“1101”或“1110”吋
30、,执行sub或subi或分支指令bnc、bcq中需要的不 带进位减法操作; 当op3.0为“0100”时,执行sit (小于则置1)比较操作;当op3.0为“01心时,执行addc带进位加法操作;当op3.0为“0101”时,执行subc带借位减法操作; 当op3.o为”1000“或”1001”或t010”或”1011”或”1100”或t101”或t110”时,立即数指令 控制信号alusrcb为“1”,其他情况alusrcb为“(t; 当 o p3.o为 ”0000“ 或”0001 ”或”0010”或”0011 ”或“0100”或”0101 ”或”0110”或” 1000”或 t001”或”
31、1010”或t011”时,写寄存器控制信号writereg为t,其他情况writereg为o; 为op3.0为“1100"时,写存储器控制信号writemem为“1”,否则为“(f;当op3.o为“1011”时,memtoreg为t,否则为“0"; 当op3.o为“0000”或“0001”或“0010"或“0011”或“0100” 或”010!'或"0110"时,目的寄存 器控制信号regdes为“1”,目的寄存器是rd;其他情况则为“(f,目的寄存器是rt;当op3.,0为t 111叩寸,跳转指令控制信号jump为t,其他情况为“0”
32、; 当op3.0为“1101”且zero为“1”时,或者当op3.o为“11 kfuzero为“(t时,分支跳转控 制信号branch为“厂;其他情况卜'branch为“0”。 当op3.o为“001(f或“0011”或“0110”或“0101”或“1010"时,标志写信号wrflag为”厂; 其他情况wrflag为0。根据以上逻辑写出vhdl语言程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std logic unsigned.all;entity ct
33、rlunit isport( op : in std_l0gic_vect0r(3 downto 0);zero : in std_logic;jump,branch : out std_logic;aluc: out std_l0gic_vect0r(2 downto 0);alusrcb,writemem,writereg,memtoreg,regdes,wrflag : out std_logic );end ctrlunit;architecture behave of ctrlunit isbeginprocess(op,zero)variable temp : std_l0gic_
34、vect0r(7 downto 0);begincase op iswhen "0000"=> aluc<="001"when h1000"=> aluc<="oo1u;when ”0001”二aluc<="010,'when "1001m=> aluc<=h010"when "0010"=> alucv二”011“;when ”2010”=> alucv二”011”;when二alucv二”011“;when "
35、1100,=>aluc<=,011"when "0011"=> aluc<="100n;when "1101"=> aluloo"when ”1110”二alucv二”100“;when "0100h=> aluc<="111"whenaluc<="101n;when "0101m=>aluc<="110"when othersalucv二”000:end case;if op>7 and
36、op<15 then alusrcb<='1'else alusrcb<=*0'end if;if0p<12 thenif 0p=7 then writereg<='o'else writereg<='1'end if;else writereg<=,0,;end if;if op="hoo" then writemem<='1'else writemem<='o*;end if;if op二t011” then memtoreg<=,
37、1'else memtoreg<=,0,;end if;if op<7 then regdes<='1'else regdes<='o,;end if;if op="0111" then jump<='r;else jump<='o'end if;ifop="1101, thenif zero二 1 then branch®'else branch<='o'end if;else ifop=,1110" thenif zer
38、o=,0, then branchv二t;else branchv二o;end if;else branch<='0'end if;end if;if op=,0010n or op="ooh" or op=“0110“ or op="0101" or op="1010h thenwrflag<='1,;else wrflag<='0'end if;end process;end behave;程序解释距离: 当 op3.0为”1000“或”1001”或”1010”或”1011”或”11
39、00”或”1101“或t110”吋,立即数指 令控制信号alusrcb为t”,其他情况alusrcb为“0”;在程序中是按如卜-语句实现的:if op>7 and op<15 then alusrcb<=,1,;else alusrcb<='0,;end if;封装后如下:仿真波形(部分):zeros aluc alusrcb branch jw memtoregregdes wrflag writehef4 writereg图中执行了&程序指针计数器pc模块计算机指令保存在程序存储器rom中。cpu执行指令时,首先要把指令从指令存储器 屮取出來。为了取指令,在计算机屮除了有保存指令的存储器外,还需要有保存计算机 指令地址的器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江鸭2025版高考生物二轮复习第4讲细胞呼吸和光合作用练习含解析
- 2025届高考地理考点一本通考点28工业区位因素练习含解析新人教版
- 买卖茶叶合同范本
- 如何将教学目标落实到小学数学教学
- 公司电脑租用合同范例
- 散水施工方案台阶
- 中天劳务合同范本
- 钢管桩简易施工方案
- 专项工程合同范例
- 保理服务合同范例
- 起重机维护保养记录表
- 《摄影构图》课件
- 医药河南省城市医师卫生支农工作鉴定表
- 自然辩证法智慧树知到期末考试答案章节答案2024年浙江大学
- 《我爱上班》朗诵稿
- 大唐杯5G大赛考试题库原题真题版(含答案)
- 临床重点专科申报书(麻醉、病理、检验)
- 2024届高考英语复习语法填空课件
- JTGT F81-01-2004 公路工程基桩动测技术规程
- 第14课当代中国的外交课件-高中历史选择性必修一
- 设计服务项目应急预案
评论
0/150
提交评论