1、武汉轻工大学数学与计算机学院计算机组成原理实验报告学 校: 武汉轻工大学 院 系: 数学与计算机学院 班 级: 软件工程 13xx班 姓 名: xx 学 号: 13051xxxx 指导老师: 郭峰林 2015 年 11 月 23 日实验三 程序计数器 PC 与地址寄存器 AR实验【实验环境】1. Windows 2000 或 Windows XP2. QuartusII9.1 sp2、DE2-115 计算机组成原理教学实验系统一台。【实验目的】1掌握地址单元的工作原理。2掌握的两种工作方式,加 1 计数和重装计数器初值的实现方法;3掌握地址寄存其从程序计数器获得数据和从内部总线获得数据的实现方
2、法。【实验原理】程序计数器(PC)是用于存放下一条指令所在单元的地址的地方。为了保证程序(在操作系统中理解为进程)能够连续地执行下去, CPU 必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入 PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。当执行指令时,CPU 将自动修改 PC 的内容,即每执行一条指令 PC 增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是
3、简单的对 PC 加 1。当程序转移时,转移指令执行的最终结果就是要改变 PC 的值,下一条从内存取出的指令将由转移指令来规定,而不像通常一样按顺序来取得因此程序计数器的结构应当是具有寄存信息和计数两种功能的结构。转移指令执行后的 PC 值就是转去的地址,以此实现转移,有些机器中也称PC 为指令指针 IP(Instruction Pointer ) 。地址寄存器(AR)用来保存当前 CPU 所访问的内存单元的地址。由于在内存和 CPU之间存在着操作速度上的差别,所以必须使用地址寄存器来保持地址信息,直到内存的读/写操作完成为止 。当 CPU 和内存进行信息交换,即 CPU 向内存存/ 取数据时,
4、或者 CPU 从内存中读出指令时,都要使用地址寄存器和数据缓冲寄存器。同样,如果我们把外围设备的设备地址作为像内存的地址单元那样来看待,那么,当 CPU 和外围设备交换信息时,我们同样使用地址寄存器和数据缓冲寄存器。地址寄存器的结构和数据缓冲寄存器、指令寄存器一样,通常使用单纯的寄存器结构。信息的存入一般采用电位-脉冲方式,即电位输入端对应数据信息位,脉冲输入端对应控制信号,在控制信号作用下,瞬时地将信息存入寄存器。本实验采用总线多路开关联接方式地址单元主要由三部分组成:程序计数器 PC、地址寄存器 AR 和多路开关BUSMUX。图 3.1 程序计数器/地址寄存器原理图程序计数器 PC 用以指
5、出下一条指令在主存中的存放地址,CPU 正是根据 PC 的内容去存取指令的。因程序中指令是顺序执行的,所以 PC 有自增功能。程序计数器提供下一条程序指令的地址,如电路图所示,在 T4 时钟脉冲的作用下具有自动加 1 的功能;在LDPC 信号( 高电平 1)的作用下可以预置 lpm_counter 计数器的初值(如子程序调用或中断相应等) 。当 LDPC 为高电平时,lpm_counter 计数器装入 data 端输入的数据。aclr 是lpm_counter 计数器的清 0 端(使 q70输出为 0) ,高电平有效(高电平清零) ;aclr 为低电平时,允许 lpm_counter 计数器正
6、常计数。 地址寄存器 AR 锁存访问内存 SRAM 的地址。地址寄存器 AR 中的地址来自两个渠道,一是程序计数器 PC 的输出,通常是下一条指令的地址;二是来自于内部数据总线的数据,通常是被访问操作数的地址。为了实现对两路输入数据的切换,在 FPGA 的内部通过总线多路开关 BUSMUX 进行选择。LDAR 与多路选择器的 sel 相连,当 LDAR 为高电平,选择程序计数器的输出(lpm_counter 输出) ;当 LDAR 为低电平时,选择内部数据总线的数据。多路选择器 BUSMUX,当 sel 端为“1”时,多路选择器选择 datab输出到 result;当 sel 端为 “0”时,
7、多路选择器选择 dataa输出到 result。数据输出时需要用到带清除端 8D型触发器 74273(74273 功能表见附录 2) 。clrn 为低电平时,使 74273 输出为 0。关于 lpm_counter元件介绍:1) lpm_counter 是 LPM 元件库的可调参数计数器元件,其最大计数位宽为 32 bit,最小计数时钟周期达 8 ns(125 MHz,使用 EPM7032LC44-6 实现);实现加、减或可逆计数;同步或异步清零/置数功能可选;通过参数设置,实现任意进制、输出位宽不超过 32 bit 的加、减或可逆同步异步计数器。2) lpm_counte 引脚及功能描述1p
8、m_counter 元件的引脚端中,只有时钟端是必选的,需要外界提供计数信号;其他引脚端都为可选,当这些引脚端未选中时,其值为缺省值,引脚在计数器图形符号中不显示。各引脚端功能描述如下:data:数据输入端(总线) ,输入信号位宽由 LPM_WIDTH 决定,用于对lpm_counter 计数器进行异步或同步置数的输入值。clock:lpm_counter 时钟端,上升沿有效,触发 lpm_counter 计数器计数。aclr:异步清零端,缺省值为“0” ,高电平清零 lpm_counter 计数器输出。如果同时输入异步清零和异步输入设置信号,则异步清零信号有效,屏蔽异步输入设置信号。aloa
9、d:异步置数端,缺省值为“0” ,禁止置数。当 aload 为高电平 1 时,将输入 data值置入 lpm_counter 计数器,作为计数初始值。q:lpm_counter 计数值输出端,输出位宽由 “LPM_WIDTH”决定。clk_en:时钟信号输入允许端;缺省值为“1”( 允许)。cnt_en:计数允许端,缺省值为“1”(允许)。在同步置数、同步输入设置或同步清零时为“0”(禁止)。updown:计数方向控制端,缺省值为 “l”(加计数) 。若选择“LPM_DIRECTION”参数,则该引脚端禁止使用。cin:低位进位端,若省略,其缺省值为“0” 。aset:异步输入设置端,缺省值为
10、“0”(禁止)。当 aset 端输入“1”时,q输出全“1”或为“LPM_AVALUE”指定值。sclr:同步清零端,缺省值为“O ”(禁止)。如果同时输入同步清零和同步输入设置信号,则同步清零信号有效,屏蔽同步输入设置信号。sset:同步输入设置端,缺省值为“0”(禁止) 。当 sset 端输入 “1”时,q输出全“l”或为“LPM_SVALUE”指定值。sload:同步置数端,缺省值为“O ”(禁止)。若选用“同步置数”端,必须连接“dat”端。该 sload 端可置入计数初始值。eq15 0:输出端,计数器模值必须小于 16。当计数值为 c 时,则输出端eqc为 1(高电平 )。例如:当
11、计数值 c=0 时,则输出端 eq0=l;当计数值 c=1时,则输出端 eq1=1;。cout:进位端。3) lpm_counte 参数及功能lpm_counter 元件参数中 LPM_WIDTH 参数是必选项其他参数为可选项。各参数的功能说明如下:LPM_WIDTH(计数位宽) :该参数最大取值为 32。它决定计数器置数端(data)和输出端(q)的位宽;决定 LPM_MODULUS 的最大取值(2 LPM_WIDTH)。若 LPM_MODULUS 参数取值大于 2 LPM_WIDTH,则计数器不能正常工作。LPM_DIRECTION(计数方向):有“UP” , “DOWN”和“UNUSED
12、 ”3种取值。如果使用 LPM_DIRECTION 参数,则 updown 端不连接,其参数默认值为“UP ”。LPM_MODULUS(计数模数):该参数决定计数器的进制:如果该参数不设置,则其缺省值为二进制,且其最大计数值为 2 LPM_WIDTH;如果 aload(或sload、 asel、sset)所置数值比 LPM_MODULUS 参数大,则计数值出错。LPM_AVALUE(异步计数初值) :如果 aset=1,则该计数初值被加载。如果该指定值比 LPM_MODULUS 大,则计数器输出值出错。LPM_SVALUE(同步计数初值):如果 sset=1,则该计数初值被加载。如果该指定值比 LPM_MODULUS 大,则计数器输出值出错。【实验步骤】按照实验指导书把如图所示的原理图做好,然后运行一遍,无错误之后保存封装,如下图:随后新建立波形图,如图所示:仿真结果及结果分析:【实验总结】通过本次的上机实验,发现自己不够细心,没有看透书上所写的知识,经过和同学们的相互探讨,很多的问题都接解决了,但是还是有少许问题没弄明白,在我们自己不懂得时候,问问老师,问问同学,真的是很好的方法,同时我也明白,自己在知识方面还有些许没有掌握牢固,在今后的学习当中应该要努力学习,巩固自己所学的知识!也要相互帮助,更多理解含义所在,而不是学会怎样操作就好了,要注重方法!