您的当前位置:首页正文

实验4-4. 微控制器实验:程序计数器PC与地址寄存器AR实验

2022-06-13 来源:星星旅游
实验4-4. 微控制器实验:程序计数器PC与地址寄存器AR实验

一、实验目的:1.掌握地址单元的工作原理;2.掌握PC的两种工作方式,加1计数和重装计数器初值的实现方法;3.掌握地址寄存器AR从程序计数器PC获得数据和从内部总线BUS获得数据的实现方法。

二、实验原理:采用总线多路开关联接方式

地址单元主要由三部分组成:程序计数器PC、地址寄存器AR和多路开关BUSMUX。程序计数器PC用以指出下一条指令在主存中的存放地址,CPU正是根据PC的内容去存取指令的。因程序中指令是顺序执行的,所以PC有自增功能。程序计数器提供下一条程序指令的地址,如图4-64所示,在T4时钟脉冲的作用下具有自动加1的功能;在LDPC信号的作用下可以预置计数器的初值(如子程序调用或中断相应等)。当LDPC为高电平时,计数器装入data[ ]端输入的数据。aclr是计数器的清0端,高电平有效(高电平清零);aclr为低电平时,允许计数器正常计数。

地址寄存器AR(DFF_8)锁存访问内存SRAM的地址。地址寄存器AR的地址来自两个渠道,一是程序计数器PC的输出,通常是下一条指令的地址;二是来自于内部数据总线的数据,通常是被访问操作数的地址。为了实现对两路输入数据的切换,在FPGA的内部通过总线多路开关BUSMUX进行选择。LDAR与多路选择器的sel相连,当LDAR为低电平,选择程序计数器的输出;当LDAR为高电平时,选择内部数据总线的数据。

图4-64 程序计数器原理图

三、实验任务:按照图4-64,程序计数器原理图编辑、输入电路,实验台选择0工作模式。对输入原理图进行编译、引脚锁定、并下载到实验台。

1.首先下载pc_unit.sof,用模式键选模式“0”,再按一次右侧的复位键;键2和键1可输入8位总线数据B[7..0](此值显示于发光管D1~D8和数码管2/1);CLR(键5)按2次(010),产生一正脉冲,高电平清零;LDAR(键6)=0时,BUSMUX输出程序计数

器PC的值;LDAR=1时,BUSMUX输出B[7..0]总线数据。LDPC(键7):程序计数器PC预置控制端,当LDPC=1时,将B[7..0]总线数据装入程序计数器PC;当LDPC=0时,程序计数器PC处于计数自动工作状态,对T4进行计数;T4(键8):程序计数器PC的计数时钟CLK,键8按动两次产生一个计数脉冲。

2.通过B[7..0]设置程序计数器的预加载数据。当LDPC=0时,观察程序计数器自动加1的功能;当LDPC=1时,观察程序计数器加载输出情况。示例操作步骤如下:

(1)所有键置0,键2/键1输入A5;按键5PC计数器清0(010); (2)连续按动键8,可以从数码8/7上看到AR的输出,即PC值;

(3)按键6,输出高电平 ’1’,选通直接输出总线上的数据A5作为PC值,按键8,产生一个脉冲上升沿,即可看到AR(显示在数码8/7)的输出为A5;

(4)使键6=0,仍选通PC计数器输出,这时键2/1输入86,按键7产生一个上升脉冲(010),即用LDPC将86加载进PC计数器;

(5)连续按动键8,可以发现AR的输出在86上累加输出:86、87、88等。 四、实验报告:1、实验原理;2、实验结果分析、讨论。

五、思考题:1.说明顺序执行程序时,将PC的值送AR,从AR所指向的RAM地址单元取出指令的操作步骤;2.执行分支/转移程序与执行顺序程序时,对地址单元的操作有何区别?3.请说明实现PC值自动加1,指向下一个地址单元的操作过程,给出控制信号的时序波形,;4.要实现程序的分支和转移,需对图4-64中的程序计数器PC和地址寄存器AR作怎样的操作?应改变哪些控制信号?

#include

float Max=0,Min=0; /*全局变量*/ void main()

{ float average(float array[ ],int n); float ave,score[10]; int i;

for(i=0;i<10;i++)

scanf(″%f″,&score[i]); ave= average(score,10); printf(“max=%6.2f\nmin=%6.2f\n

average=%6.2f\n“,Max,Min,ave); }

float average(float array[ ],int n)

/* 定义函数,形参为数组 */ { int i;

float aver,sum=array[0]; Max=Min=array[0]; for(i=1;i<n;i++)

{ if(array[i]>Max)Max=array[i]; else if(array[i]<Min)Min= array[i]; sum=sum+array[i]; }

aver=sum/n; return(aver); }

因篇幅问题不能全部显示,请点此查看更多更全内容