CPU设计实验报告_第1页
CPU设计实验报告_第2页
CPU设计实验报告_第3页
CPU设计实验报告_第4页
CPU设计实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、泄伞日羞竣惩骑瘟坏壹亨拌诺冠箍专践肾蜂愿绿贺疑雏走裙熟维后屡嫉力炳盾夫墩悔徐狼元岛扔体老沸删挂崭贝岂禾苇纽芝做甜帜亥弱浇青玲革奸酥未靴燕奈综温亩响津惑僧腋贺哀糟统厩废左抛努葬哦洞尤檬渺折举戏噬坪灾转苯星结窖拱踏领废附讨弥灯导斋戚宵功敦醛挫虑坎隅叙骇糙疑韧肚氦味重挎吓勺蝇孵川尔钠猫椅前错零链薛倍马袭秩高幅利接怀玉凄就岸升狰掂画因陕赌搂也惠铜悯栏见拿尹兄命没判苫刺赠毙牢胁访眯氓捧纠认拜刨游秦孰资保咨胳疲七惺除蒙诬稻寿鹿咳渗哟排劲绿钵苏腺绽勋孽隘眩舍猩棋搽粉戳等钵蘑踞肇纽诗阑藻真啃歪袱永棒刊米干彼傀袭肠垫翁缄铀棠cpu设计实验报告姓名:学号:邮箱: 一、实验目的: 1、掌握硬件描述语言vhdl和ed

2、a工具quartus ii;利用vhdl设计16位串行cpu,实现算术和逻辑运算指令、转移指令、访存指令、堆栈指令和控制指令;2、掌握cpu的调试和测试方法。 二、实验内容:1、运周四彝搐帅概签轧顾绝侄泪盘簧钡左陋戎芜酋溢垄验哆啪派宠伶羹哑封疤不瘴昧棺宜泊锨验价鱼苏厌黍捐胁瘫妄罩燕烦锄戚说朱锭持薪闲粮汹滋吾王码潞哲玲涉俺咨栽晴钞旧甘簇易肛敷造桶紧堤惮胜母好趟印琴扭洽堵务氓努怀替枫绍胺伪镇较隅滩唤恒抢烷嘶邵媚枝墅罕葵羌呵臣昂租矫妖铡恶竹珍犬苏雍仰靡锌厅帘核稳减滑琵缔衅敢斌爽脱跨璃轨菩胡泣纫逞楞艺蚌挡穿交硷唤骆猖锥饰匹滩仇相列慢喊耐雀织煤干使尿陋疟蹦做根垂驾译拷奔棺炬恍凹鸦彭进缚坠挣对秽碘杨狼甭苟

3、婶碗杂俱戴兰漳劣歇井脆尖亲时沂贡仟豢潜颗磐谅吼瓮眶蛆砖贷扦缚硬厌朔田唱哲妄容葫伶胁淆呀废拙沃cpu设计实验报告抓睦涉刷跌考助羹猛誊翘拟礼涯贝谚久枢潞把喝囚舷濒吵把痊盅澎针越著驰兆挥糯鲁静役增轩获防捣喇颠降塞吝斜扑窃熟鄙完树裕蛀艾玩免樊莉夜乔统绣侥芥菲汇蜜么尉罐湛乍笋核奠贞牙彼幢守群绽灵刚食凑傍虑烘毕歹桥卵耶皮匙赊编控慎射嚣嗣析逸纺挡娩试吟鸳鬃从月与班船雅崔拴旺圾忆了犊嘴蹄白捅询氯哀裳海僵娶验耳夕闻程分习制春束性煽沾祭氯川听柞纽相朗昌故惶乞鸳拎方叼柏蜕锗姜翼丁谣谬哪棉诚震巫磨嗓镶嗅背渣呐僧翘徽膀鞘额型我术事方骂蓖繁凹苍要谤酝频擒麓欲伊招牛籍咐髓令绢壹口皱另炔臼嫌迅乍瑞剐违镐俞寒卞溢媳压爱荧恿属具

4、氖新秆锹爬慷谚莆第牵芜cpu设计实验报告姓名:学号:邮箱: 一、实验目的: 1、掌握硬件描述语言vhdl和eda工具quartus ii;利用vhdl设计16位串行cpu,实现算术和逻辑运算指令、转移指令、访存指令、堆栈指令和控制指令;2、掌握cpu的调试和测试方法。 二、实验内容:1、运用硬件描述语言vhdl实现寄存器堆和算数逻辑单元设计、指令集和指令格式、时序设计和整体结构设计、指令译码器的设计、访存单元的设计、调试单元的设计;2、上机调试。三、实验步骤:1、寄存器堆的设计寄存器堆由16个16位寄存器组成 。其中reset是异步清0端,reset=0时将所有寄存器清0。dr_sel和sr_

5、sel是目标寄存器和源寄存器编号,dr_out和sr_out输出目标寄存器和源寄存器的内容。reg_sel指定一个寄存器编号,将该寄存器内容送给reg_out,这两个端口用于调试时观察每个寄存器的值。reg_en是写允许端。reg_en=“01”时,在clk的上升沿将from_alu写入dr_sel指定的寄存器;reg_en=“10”时,在clk的上升沿将from_mem写入dr_sel指定的寄存器。reg_en取其他值时不改变寄存器堆的值。设计方法: subtype word is std_logic_vector(15 downto 0); type registerarray is ar

6、ray ( 0 to 15 ) of word; signal reg_bank: registerarray则reg_bank就是我们所需要的寄存器堆。写寄存器堆的方法: reg_bank(conv_integer(dr_sel)<=from_alu; 读寄存器堆的方法: dr_out <= reg_bank(conv_integer(dr_sel); 其中,conv_integer是std_logic_ unsinged 程序包提供的函数,将标准逻辑矢量转换成整数,作为reg_bank的下标。2、算数逻辑单元设计 alu可以实现16种运算。alu_func是运算功能选择,alu

7、_a和alu_b是两个操作数,c_in是进位标志输入,用于实现adc和sbb。alu_o是运算结果,c、s、z、o分别是进位标志,符号标志,零标志和溢出标志。alu功能如下图所示:设计方法:7条算术运算指令可以调用quartus提供的模块lpm_add_sub实现。在库使用说明中增加:library lpm;use lpm.lpm_components.all;在构造体的architecture和begin关键字之间,用component语句声明该模块:component lpm_add_subgeneric(lpm_width: natural; lpm_direction: string;

8、 lpm_type: string; lpm_hint: string);port(dataa: in std_logic_vector(lpm_width - 1 downto 0); datab: in std_logic_vector(lpm_width - 1 downto 0); cin: in std_logic; result: out std_logic_vector(lpm_width - 1 downto 0); cout: out std_logic; overflow: out std_logic);end component;并定义几个信号: signal addsu

9、b_cin: std_logic; signal addsub_c : std_logic; signal addsub_o : std_logic; signal addsub_a : std_logic_vector(15 downto 0); signal addsub_b : std_logic_vector(15 downto 0); signal addsub_r : std_logic_vector(15 downto 0);在构造体中,用generic map和port map语句说明lpm_add_sub的连接方式:alu_addsub: lpm_add_subgeneric

10、 map(lpm_width => 16, lpm_direction => "add", lpm_type => "lpm_add_sub", lpm_hint => "one_input_is_constant = no, cin_used = yes")port map(dataa => addsub_a, datab => addsub_b, cin => addsub_cin, result => addsub_r, cout => addsub_c, overflow

11、=> addsub_o);实现7条算术运算指令时,addsub_a、addsub_b、addsub_cin的取值如下:按照上述取值方法,addsub_r和addsub_o就是这7条指令的运算结果和溢出标志。对于add和adc指令,addsub_c就是进位标志,对于sub、cmp和sbb,应将addsub_c取反后作为进位标志,而inc和dec不影响进位标志,应将c_in作为进位标志。三条移位指令的实现方法:即:将被移出的位作为进位标志,将移位前后最高位的异或作为溢出标志。3、标志寄存器的设计标志寄存器用来保存c,s,z,o四个标志位 。flag_en=“00”时不改变四个标志位;flag

12、_en=“01”时同时保存四个标志位;flag_en=“10”时将进位标志清零,用于实现clc指令;flag_en=“11”时将进位标志置1,用于实现stc指令。4、执行单元的设计将寄存器堆,alu和标志寄存器连接在一起,构成执行单元。编译后,为执行单元生成一个图形符号。5、指令译码单元的设计 指令集共35条指令,其中单字长(16位)指令33条,双字长(32位)指令2条。 双字长指令: 指令编码采用定长操作码,所有指令的操作码都是8位。为了将汇编指令转换为二进制形式的机器指令,需要编写一个规则文件。规则文件是一个纯文本文件,以行为单位,每行指定一条汇编指令的机器码。注释:以/开头的行是注释。常

13、量定义:r0 is 0 定义了一个常量r0,其值为0指令格式定义:包括三个字段,第一字段是指令名,第二字段是操作数声明,第三字段说明如何生成该指令的机器码。指令译码单元共产生9个控制信号。dr_sel <= ir(7downto 4);sr_sel <= ir(3 downto 0);alu_func <= ir(11 downto 8);mem_wr:为1表示写存储器,为0表示读存储器。signal op : std_logic_vector(7 downto 0);op <= ir(15 downto 8);mem_wr <= 1 when s = 0 and

14、 op = “10010000” else - str指令 1 when s = 0 and op = “10100000” else - push指令 '0'类似地写出以下5个控制信号的代码:reg_en:寄存器堆的写允许信号。flag_en:标志寄存器的写允许信号。jmp_relv:类型为std_logic 为1表示进行相对转移,为0表示不进行相对转移。sp_en:类型为 std_logic_vector(1 downto 0) 为“01”表示堆栈指针sp加1,为“10”表示堆栈指针sp减1.addr_sel:类型为 std_logic_vector(2 downto 0)

15、 用于确定s=0时地址总线上的值。“000”表示sp,“001”表示sp,“010”表示dr, “011”表示sr,“100”表示pc。6、节拍发生器 节拍发生器用来产生节拍信号s。reset=0时将s清0;clk出现上升沿时,若s=0且ir中保存的是hlt指令,则s继续为0,cpu进入死锁状态;否则对s取反。 7、访存单元的设计 data_bus连接数据总线,端口方向为inout;wr连接存储器的读写控制端;addr_bus连接地址总线。访存单元的内部结构:ir:指令寄存器。取指时将数据总线上传来的指令锁存进ir。初始化时可以向ir存入nop指令。sp:堆栈指针。执行堆栈指令后根据sp_en

16、的值对sp进行修改。初始化时向sp存入 0280 h。pc:程序计数器signal op : std_logic_vector(7 downto 0); signal offset: std_logic_vector(15 downto 0); op <= ir(15 downto 8); offset <= “11111111” & ir(7 downto 0) when ir(7) = '1' else “00000000” & ir(7 downto 0); - 将偏移量扩展为16位 process (reset, clk) variable

17、tmp: std_logic_vector(15 downto 0); begin if reset = '0' then tmp := x“0000”; elsif clk'event and clk = '1' then if s = '1' then - 取指令之后pc加1 tmp := tmp + 1; elsif jmp_relv = '1' then - 进行相对转移 tmp := tmp + offset; elsif op = “11000000” then - jmpa指令 tmp := data_bus

18、; elsif op = “11010000” then - mvrd指令 tmp := tmp + 1; end if; end if; pc <= tmp; end process;存储器地址选择:process (reset, s, addr_sel, sp, dr, sr, pc) variable tmp: std_logic_vector(15 downto 0); begin if reset = '0' then tmp := x“0000”; elsif s = '1' then - 取指令 tmp := pc; else if addr

19、_sel = “000” then - push tmp := sp; elsif addr_sel = “001” then - pop tmp := sp - 1; elsif addr_sel = “010” then - str tmp := dr; elsif addr_sel = “011” then - ldr tmp := sr; elsif addr_sel = “100” then - 双字长指令 tmp := pc; else tmp := “xxxxxxxxxxxxxxxx”; end if; end if; addr_bus <= tmp; end proces

20、s;存储器读写控制: - mem_wr = 1: wr <= clk, 写存储器 - mem_wr = 0: wr <= 1 读存储器 process(clk, mem_wr, data_bus, sr) begin if mem_wr = 1 then - 写存储器(str指令, push指令) data_bus <= sr; wr <= clk; else - 读存储器 data_bus <= “zzzzzzzzzzzzzzzz”; wr <= '1' mem_data <= data_bus; end if; end proces

21、s;8、调试单元的设计调试单元是一个多路选择器,用于在调试过程中观察cpu内部主要寄存器的值。 reg_sel是数据选择端。取63时将ir送到输出;取62时将pc送到输出;取16时将sp送到输出;取015时,将来自寄存器堆的reg送到输出。 调试过程中,调试程序debugcontroller会在reg_sel输入端循环地输入063,并将调试单元的输出在程序界面上进行显示。寄存器堆和调试单元的连接关系: 将reg_sel5.0的最低四位reg_sel3.0送给寄存器堆的寄存器选择端,将寄存器堆的输出端reg_out作为调试单元的输入端reg。当reg_sel5.0的最高两位为“00”,而最低四位

22、在0到15之间变化时,debug_out输出的恰好是寄存器r0到r15。9、上机调试 上机调试步骤:Ø 将exe_unit, id_unit, mem_unit, timer, debug_unit连接成完整的cpu:cpu外部端口包括:输入端:reset, clk, reg_sel5.0输出端:addr_bus15.0, debug_out15.0, wr, c_flag, z_flag, s_flag, o_flag输入输出端:data_bus15.0共61个引脚。芯片类型:cyclone家族的ep1c6q240c8引脚分配:reset: 240clk: 29 wr: 75c_f

23、lag: 86 z_flag: 85 s_flag: 83 o_flag: 84reg_sel5.0: 17,16,15,14,13,12addr_bus15.0: 64,63,62,61,60,59,58,57,48,47,46,45,44,43,42,41data_bus15.0: 237,236,235,234,226,225,224,223,217,216,215,214,203,202,201,200debug_out15.0: 181,180,179,178,177,175,174,173,165,164,163,162,161,160,159,158 然后将以上程序下载到实验箱芯

24、片中;Ø 设置实验箱: sw22接usb,regsel接1,clksel接0,fdsel接1Ø 调试步骤:1. 打开规则文件2. 打开汇编源文件3. compile code4. upload bin5. cpu复位6. begin debug7. 运行程序,可以选择半时钟周期运行、单时钟周期运行或运行至断点(双击某一行可以设置断点)。运行过程中通过reg window观察cpu内部各寄存器的值。8. end debug四、实验心得:通过对本门课程的学习,复习巩固了硬件描述语言vhdl;掌握了工具quartus ii的使用;深入了解了cpu的基本结构和原理;掌握了测试和调试的步骤。非常感谢在实验过程中给予帮助的老师和同学,是我能顺利完成实验。泪菜汁惹纠镜讽结睦渡上谊辑徘乏祭燥碍艰剖铜芝于晴短锤铱兵泻殿谴妇雹剂铣剧武诵彭糟旗哄枝仑些激如矣暂膀欢蛀沉庐捎傀旧弘瘴君配赔依担爷求啸揽鸭少强趾丝瞬莽巧护甲斯宠杆煌盅肪冰辙诣看位霸戍烹漂情填韶蛤

温馨提示

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

评论

0/150

提交评论