微程序控制器实验报告.docx
《微程序控制器实验报告.docx》由会员分享,可在线阅读,更多相关《微程序控制器实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
微程序控制器实验报告
微程序控制器实验
预习报告
1.微程序控制器的组成和工作原理。
微程序控制器主要由控制存储器、微指令寄存器和地址转移逻辑三大部分组成。
其工作原理分为:
一、将程序和数据通过输入设备送入存储器;二、启动运行后,从存储器中取出程序指令送到控制器去识别,分析该指令要求什么事;三、控制器根据指令的含义发出相应的命令(如加法、减法),将存储单元中存放的操作数据取出送往运算器进行运算,再把运算结果送回存储器指定的单元中;四、运算任务完成后,就可以根据指令将结果通过输出设备输出
2.微程序、微指令、微命令之间的关系。
一系列微指令的有序集合称为微程序。
在微程序控制方式之下,从控制存储器中取出,完成一个或几个微操作的命令称为微指令。
控制部件通过控制线向执行部件发出各种控制命令,通常把这种控制命令叫做微命令。
所以总的来说:
微程序包含微指令,而每条微指令包含的微命令控制。
3.微指令、微程序的设计及调试。
在微程序流程图中,根据每个状态的微指令,将其进行编码,设计出所需硬件及执行效率较高的微程序控制电路,然后进行调试。
思考题:
1.举例说明实验中出现的基本概念:
微命令、微操作、微指令、微程序?
微命令:
控制器发出的每个控制信号,如对运算单元的控制mcns3s2s1
s0发出的010101等。
微操作:
由微命令控制实现的最基本的操作称为微操作。
如发出运算器加运算的微命令后,运算器进行加法计算,就称为微操作。
微指令:
完成一个或几个微操作的指令。
如控制器进行存数据的命令后,需要有we信号有效,pc保持,来控制这些的指令即为微指令。
微程序:
微程序包含微指令。
如微程序流程中包括很多微指令控制,进行一些加减运算,存储数据,地址自加一等等。
2.解释并比较微程序控制器的几种设计方法?
微序列控制器通过吧控制信号存储在一个查找Rom,
(1)用水平编码生成微操作
(2)用垂直编码生成微操作(3)从微代码直接产生控制信号。
3.微程序控制器的控制对象、手段及方法?
控制器如何取指令?
微程序控制器控制对象分为硬件方面和软件方面,硬件方面为数据通路的控制信号,软件方面为测试程序的控制信号。
控制器根据状态机的不同状态进行指令读取,在不同状态下取得的指令也不同。
4.控制器的功能?
如何取指令、分析指令、执行指令?
通过下址取得指令,根据控制信号进行不同信号的开启或关闭也就是分析指令,然后再在控制信号的作用下执行指令。
5.下址的产生方法?
常用的有哪些,实验中用到了哪些?
A:
计数器方式――在顺序执行微指令时,后续微指令地址由现行微指令加上一个增量来产生;在非顺序执行微指令时,必须在执行现行微指令后,转去执行指定后续微指令地址的下一条微指令。
B:
增量方式与断定方式的结合――微指令的顺序控制字段分成两部分:
条件选择字段与转移地址字段.由这两个字段结合,当转移条件满足时,将转移地址字段作下一个微地址;若无转移要求,则直接从微程序计数器中取得下一条微指令.一般用于微指令执行时,需要外部判断条件的场合。
C:
多路转移方式――当微程序不产生分支时,后续微地址直接由微指令的顺序控制字段给出;否则有若干个后续地址可以选择,此时必须由顺序控制字段的"判别测试"和"状态条件"信息来选择其中一个微地址一般用于有多个转移且可以使用组合逻辑设计转移地址逻辑的场合。
实验中用到了多路转移方式。
6.每条机器指令的指令码如何与其入口微地址对应?
微程序分支如何处理?
通过编码方式,将指令码的状态分成不同的几个,再运用微地址进行编码,对不同的指令码编程不同的地质,一一对应。
在不同分支出现时利用临时寄存器IR对几个分支进行编码,映射为不同状态。
7.如何简化微程序流程图,使其ADD、AND指令在部分微指令中合并?
(如AR→RAM、RAM→DR2、R5→DR1)
只对ALU部分的下址进行区分,其他部分用同样的下址即可,这样可以省去一个IR的编码状态。
8.电路设计过程中如果出现多个状态机怎么办?
将不同状态机的控制信号进行区分,在不同控制信号作用下进行多个状态机的控制。
实验日志
11月10日
对微指令的复习和理解,明白了下址的控制方法但是对电路中P1的意义不太理解。
经过看微程序流程图,发现P1在ldir需要进行下载时有效,所以P1即为控制临时存储器IR的控制信号,该控制信号由流程图中第四步中有效,来控制IR的下址是否有效。
11月12日
编写ROM时发现P1具体为1的状态不同会出现不能强读强写,所以将P1为1改为当RAM数据传到IR时令其有效,得到正确波形。
11月18日
仿真时发现ar的第一个地址不正确,应该为00H但是却是个不是个确定的值。
经分析发现第一个ar值应该为sw输入到总线上,而总线的值没有k输入,所以将k的输入设定为00H,得到的仿真结果正确。
实验报告ROM部分代码(只显示编码部分):
Swr4br5balupcbusdr1dr2r4lr5lmcns3s2s1s0werdpclrpcldpcenldarldirp1下址五位"0111100000000000010100000001"whenaddress="00000"ELSE--SW-->PC"1111000000000000011110000010"whenaddress="00001"ELSE--PC-->ARPC=PC+1"1111100000000000110001101000"whenaddress="00010"ELSE--RAM-->IR"1111000000000000011110010101"whenaddress="01001"ELSE--LDA1:
PC-->ARPC=PC+1"1111100000000000110010010110"whenaddress="10101"ELSE--LDA2:
RAM-->AR"1111100010000000110000000001"whenaddress="10110"ELSE--LDA3:
RAM-->R5"1111000000000000011110010111"whenaddress="01010"ELSE--STA1:
PC-->ARPC=PC+1"1111100000000000110010011000"whenaddress="10111"ELSE--STA2:
RAM-->AR"1101100000000001010000000001"whenaddress="11000"ELSE--STA3:
R5-->RAM"1111000000000000011110011001"whenaddress="01011"ELSE--OUT1:
PC-->ARPC=PC+1"1111100000000000110010011010"whenaddress="11001"ELSE--OUT2:
RAM-->AR"1111100000000000110000000001"whenaddress="11010"ELSE--OUT3:
RAM-->BUS"1101110000000000010000011011"whenaddress="01100"ELSE--COM1:
R5-->DR1"1110100011000000010000000001"whenaddress="11011"ELSE--COM2:
/ALU-->R5"1111000000000000011110011100"whenaddress="01101"ELSE--JMP1:
PC-->ARPC=PC+1"1111100000000000110100000001"whenaddress="11100"ELSE--JMP2:
RAM-->PC"1111000000000000011110000011"whenaddress="01110"ELSE--ADD1:
PC-->ARPC=PC+1"1111100000000000110010000100"whenaddress="00011"ELSE--ADD2:
RAM-->AR"1111101000000000110000000101"whenaddress="00100"ELSE--ADD3:
RAM-->DR2"1101110000000000010000000110"whenaddress="00101"ELSE--ADD4:
R5-->DR1"1110100010110010010000000001"whenaddress="00110"ELSE--ADD5:
ALU--R5加
"1111000000000000011110011101"whenaddress="01111"ELSE--AND1:
PC-->ARPC=PC+1"1111100000000000110010011110"whenaddress="11101"ELSE--AND2:
RAM-->AR"1111101000000000110000011111"whenaddress="11110"ELSE--AND3:
RAM-->DR2"1101110000000000010000000111"whenaddress="11111"ELSE--AND4:
R5-->DR1"1110100011010110010000000001"whenaddress="00111"ELSE--AND5:
ALU--R5101011and"0111100000000000010100010001"whenaddress="10000"ELSE--KWE1:
SW-->PC"1111000000000000011110010010"whenaddress="10001"ELSE--KWE2:
PC-->ARPC=PC+1"0111100000000001010000010001"whenaddress="10010"ELSE--KWE3:
SW-->RAM"0111100000000000010100010011"whenaddress="01000"ELSE--KWE1:
SW-->PC"1111000000000000011110010100"whenaddress="10011"ELSE--KWE2:
PC-->ARPC=PC+1"1111100000000000110000010011"whenaddress="10100"ELSE--KWE3:
RAM-->BUS"1111100000000000100010000000";
没有加数据通路部分时的仿真波形:
波形分析:
将状态机定为单步运行状态,dp为1,qd每次进行启动。
CLR由1->0->1,清零作用使微地址A4~0为00000。
执行第一个单拍,执行将输入值传给pc,得到下址00001执行第二个单拍,执行微地址为00001的微指令,PC->AR,pc自加一,地址计数加1变为01H,得到下址00010。
执行第三个单拍,将00地址的值读出来赋给IR,在T3时序信号到来时,执行将RAM中存放的数据(指令)送到IR(指令寄存器),此处运用手动输入的方法,同时给出判别信号P及下一条微指令的地址01000,在T4有效时,P1为1,IR7,IR6,IR5可以手动输入010将微地址改为01010,产生下条微指令的地址。
然后即可进入STA指令操作。
然后下址为10111,开始执行RAM〉-AR操作。
从其他输出信号看产生的输出也是正确的。
下一个操作进行强读信号的执行。
在之前将CLR信号置为0,进行清零才行,得到00000地址。
然后将KRD信号从1到0再到1,使得a[3]强置数为1,可以将地址从00000变为01000,该地址产生下址10011,即为强读控制信号。
加入数据通路部分进行仿真:
说明:
数据通路加上后应该修改部分控制信号,以满足状态机在不同
状态下控制ar,alu,pc等的正确执行。
修改如下:
T2时刻由于要将RAM的数据送出,同时dr1或者dr2得到数据,然后进行逻辑或算术运算,故RAMclk应该有效,lddr及lddr2有效。
T3时刻将地址送入ar或将dr1及dr2的运算结果存入R4或R5,故lddr4和lddr5有效,ar的clk有效。
波形如下:
波形分析:
(125为显示电路时钟信号,a|g为七段译码器各管,Eq为四个驱动灯控制信号,此处不做讨论)
1、初始状态clr为0,将a[4..0]清零,然后将qd从1变为0再到1,dp定为
1,使状态机进入单步运行状态(或者qd一直为1,为连续循环运行状态)。
可以看出t的变化从0000到1000循环。
2、随着一个单步周期a从00001到00010变化。
200ns到300ns,pc变为101置数状态,将sw-->pc执行。
3、地址a为00001,执行pc-->AR,pc变为111,ar为00H,使得RAM得到00H的地址为下一指令输出该地址的数据做准备,进行加计数得到总线数据位01H,同时产生下址00010。
4、地址为00010时,执行RAM-->IR指令,总线上显示00H,同时产生下址01000且令p1为1,使得IR在下一周期得到总线上高三位的地址。
(不再采用单步运行仿真,令qd=1连续运行)
5、地址为01000时,总线数据位00H单元的数据20H,其二进制高三位为001,由于P1为1,使得1.2us到1.3us时t4有效将ir送入a的低三位产生新的地址01001,开始进行LDA指令操作,往后依次类推。
6、地址为01001时进行PC-->AR,PC=PC+1操作,产生的下址为10101,总线显示为01H后,ar得到01H单元数据0D作为新的地址,然后送入RA(MRAM-->AR),pc的值为100及111也符合状态。
7、地址为10101产生的下址为10110,执行RAM-->R5,此时ar地址已经为0DH(见上一步骤产生原因)
8、在该单步运行周期结束后,下一周期t1变为1后送到数据通路部分进行执行,在数据总线显示55H后,再有一个时钟将总线数据打入R5,R5显示正确。
10110产生下址00001。
9、地址为00001时,pc加计数从02H变为03H,同时得到下址02H送到ar产生下址00010。
10、地址为00010时,第三个节拍,ar得到02H地址,在下一单步运行周期的第二节拍将02H地址的数据送出到总线,总线显示C0H,产生下址01000。
11、Pc保持100,此时p1为1,同时LDIR有效,取得总线数据高三位110作为a的后三位。
产生下址01110,进入ADD操作环节。
总结一下:
此时R5存储55H,R4,R2,R1都没有值。
下一步将要从RAM
中取得数据直接送入R2,再将R5的送入R1,运用ALU部分进行加运算
12、地址为00011前,数据通路部分执行上个周期的指令PC-->ARPC=PC+。
1总线上03H变为04H,与上次执行相同的指令,将03H地址给ar。
同时产下下址00100。
13、地址为00100时,数据通路部分执行上个周期的指令,得到03H单元的数据0EH作为地址,送入ar中,产生下址00101。
14、地址为00101时,数据通路部分执行上个周期的指令,得到0EH单元数据
8AH,总线显示出了该单元的数据即为8AH。
产生下址00110。
15、地址为00110时,执行上个周期指令,将8AH送入R2寄存器。
R2寄存器显示数据位8AH,正确。
同时产生下址00001。
16、地址为00001时,执行上一周期操作,将R5的数据送入到R1,看到R1
显示数据可以得知该显示为正确的。
然后进行ALU加运算,得到加的结果
为DFH,送入到R5。
总线显示计算结果正确,同时R5得到数据DFH。
产生下址00010
17、地址为00010时再次重复之前操作,此处不再分析。
18、在地址为01000时,与之前一样,但是此时pc加计数并且送到ar使其地
址为04H,然后得到04H单元数据40H,其二进制高三位为下址低三位。
所以得到下址为01010,进入STA指令操作。
19、地址为10111时,执行上条指令的操作PC-->ARPC=PC+,1将地址05H送入ar,pc自加一变为06H,显示在总线上。
然后下址为11000。
20、地址为11000时,操作上一步指令,将05H单元数据10H送入AR,作为
新的地址,产生下址00001。
21、地址为00001时,上一步操作将R5数据存入地址为10H的Ram中,总线
显示数据位DFH,操作正确,同时产生下址00010。
同样的经过几个节拍脉冲,将地址a到01000状态,此时总线高三位是
011,在p1为1,ldir有效时得到下址01011。
进入OUT操作分支。
24、与STA操作相同,只是在最后a地址为11010时产生下址00001。
同时执行RAM到AR的操作,此时RAM的07H单元数据位10H,将该数据继续作为AR,显示RAM10H地址的数据。
25、地址为00001时执行上步操作,将Ram的0H地址的数据显示出来为DFH,
可见数据写入成功。
余下的将进行如下操作:
将R5的数据DFH与Ram中0FH单元数据F0H进行相与运算得到D0H,送至R5,再对其取反的2FH。
最后无条件返回00H单元地址。
不再进行波形分析。
下载验证时引脚分配如下:
K的输入可以直接置为低电平,不再分配。
最后为模拟机部分:
运算公式为(A+B)'andC',其中ABC分别为01H,02H,03H。
模拟机修改内存值如下图:
程序运行步骤为:
先进行取A的值,到R5,然后加上12单元内部数据(B的值),存入R5,再运用com指令进行取反,得到的值存入R5及RAM14H单元。
然后取得13H单元数据到R5,进行取反运算后存到R5,再将14H单元数据存到R2,R5到R1,进行and运算,最后结果存入R5及15H单元,用JMP指令跳回至00H单元。
单步运行结果如下:
1、14H单元存入的数据应该为FFFC,即A+B取反的结果,从图中可以看出是正
确的