SAP-1CPU及计算机的组成架构介绍课件_第1页
SAP-1CPU及计算机的组成架构介绍课件_第2页
SAP-1CPU及计算机的组成架构介绍课件_第3页
SAP-1CPU及计算机的组成架构介绍课件_第4页
SAP-1CPU及计算机的组成架构介绍课件_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

SAP-1Cpu电路设计一.SAP-1CPU及计算机的组成架构简介二.SAP-1CPU指令.寻址法.程序设计三.16*8的ROM设计与仿真四.SAP-1CPU设计与仿真SAP-1Cpu电路设计一.SAP-1CPU及计算机1实验目的:实验目的:2实验原理实验原理3小组成员薛宝(20054440118)汪威(20054440119)高亮(20054440120)吴安乐(2005444021)陆仁聪(20054440122)谢素斌(20054440123)吴运兴(20054440124)江宪清(20054440126)小组成员薛宝(20054440118)4一.SAP-1CPU及计算机的组成架构简介

一.SAP-1CPU及计算机的组成架构简介

5所有寄存器是以三态(threestate)输出方式,连接至webus上。虽然现在不是使用传统TTL电路组成,而是使用CPLD&FPGA类型组件来实现它,这也就意味着图1的一些功能方块或一些控制线需要作部分调整或修改,但无论如何对于每个方块所扮演的角色,是绝对有必要了解的!所有寄存器是以三态(threestate)输出方式,连接至6Programcounter48InputandMAR4416*8RAMInstructiontegisterController/sequencer41248888AccumulatorA8Adder/subtractorBregisterOutputregisterBinarydisplay88888WbusLACLKEASUEULBCLKLOCLKCLRCLKL1E1CECLKLMEPCLRCPCLKCLKCLKCLRCLRCPEPLMCELIEILAEASUEULBLO图1:SAP-1结构Program48Input4416*8Instructio7

说明:1.程序计数器它是一个4Bits的计数器,计数范围由0~15。主要功用是记录下每个执行的指令地址,并把这个地址传送至MAR寄存器存放。2.输入与MAR(MemoryAccessRegister)

这个方块应分成两个部分,一个是接受由“输入”部分输入到RAM内存的外部程序和数据,另一部分“MAR”是用来在CPU执行上述所加载的程序时,暂存下一个要执行的指令地址。3.16×8RA

这个RAM和其它的部分构成图10-1的SAP-1计算机,而且它的内存大小共有16地址×8位。所以这个RAM的地址总线是4bit,地址编码是由0000,0001,0010…1111,这个地址内容是由上述MAR传送过来,然后通过译码将地址存放的8位数据或指令输出至Wbus。

84.指令寄存器

属于CPU内的控制单元,主要是将在RAM的8位数据,通过Wbus后读入指令寄存器,然后再把数据一分为二,较高的4位属于指令部分,送至下一级的“控制器”,而较低的4位属于数据部分,将会被送至Wbus。5.控制器/序列发生器这个项目也是属于CPU内控制单元的一部分,这个控制器在程序执行时,负责送出整个计算机的时序信号CLK,而且会把指令寄存器送来的4位指令,解译成12位的控制信号,由这组控制信号指挥其它的功能方块,完成该指令的运作。由于使用VHDL语言设计整个SAR-1,依照语法的使用,这部分会被省略,而且不会影响整个CPU运作。6.累加器

累加器是个8位的缓冲寄存器,它是存放目前计算机执行的实时数据地方。不同的指令也将使它产生不同的工作方式。4.指令寄存器97.加减法器

这个加减法器负责执行数学的加法和减法运算,而且运算的结果会放回“累加器”暂存。8.B寄存器

这个寄存器用来配合“累加器”、“加减法器”,执行“加法”或“减法”的工作。9.输出寄存器这个输出寄存器的用途是,SAP-1CPU执行到“输出结果”的指令时,便将“累加器”的结果传至“输出寄存器”,所以它是负责存放输出结果,当然这个存放的结果是二进制形式的。7.加减法器1010.二进制显示在图1的SAP-1计算机里,以8个LED作程序执行结果的显示,这个算是这台计算机的输出部分,而不是SAP-1CPU的功能方块。最后就VHDL语言设计的观点来对图1作设计分类:

SAP-1CPU部分:程序计数器、MAR、指令寄存器、控制器/序列发生器、累加器、加减法器、B寄存器、输出寄存器。

16×8MAR部分:考虑直接改成ROM的形式,这是因为程序执行时,它不接受外界输入。10.二进制显示11二.SAP-1CPU指令.寻址法.程序设计

二.SAP-1CPU指令.寻址法.程序设计

12SAP-1的CPU指令,共有5个且可分成两种类型,如表指令运算码范例说明LDA0000LDA9H将9H内存的内容值加载累加器ADD0001ADDBH将BH的内存内容值和累加器内容值相加,再存放运算结果回累加器SUB0010SUBEH将EH的内存内容值和累加器内容值相减,再存放运算结果回累加器直接寻址法(DirectAddressing)SAP-1的CPU指令,共有5个且可分成两种类型,如表指令13指令运算码范例说明OUT1110OUT将累加器内容输出至“输出寄存器”HLT1111HLT结果CPU执行零位寻址法(ZeroAddressing)指令运算码范例说明OUT1110OUT将累加器内容输出至“输14范例:试使用SAP-1指令,执行下列运算结果。10+20+30-15=4B(十六进制)解答:首先将运算数据10,20,30,15依序放在9H-CH地址里第一个指令写在0H地址,功能是先将10加载累加器,所以指令写成:

LDA0H

这是因为9H存放着数值10的内容范例:试使用SAP-1指令,执行下列运算结果。15第二个指令写在1H地址,功能是将20加载B寄存器,然后与累加器里的10作相加后,再将结果30存回累加器,所以指令写成(地址AH内存数值20):ADDAH第三个指令写成在2H地址,功能是将30加载B寄存器,然后与累加器里的30作相加后,再将结果60存回累加器,所以指令写成(地址BH内存放数值30数据):

ADDBH第二个指令写在1H地址,功能是将20加载B寄存器,然后与累加16第四个指令写在3H地址,功能是将15加载B寄存器,然后与累加器里的60作相减后,再将结果4B存回累加器,所以指令写成(地址CH内存放数值15数据):

SUBCN第五个指令写在4H地址,是将累加器数值结果4B作输出显示,所以指令写成:

OUT第六个指令写在5H地址,功能在停止CPU运算,所以指令写成:

HLT第四个指令写在3H地址,功能是将15加载B寄存器,然后与累加17最后,整个程序和数据写在RAM里,机械码表示如下:地址汇编语言机械码0HLDA9H000010011HADDAH000110102HADDBH000110113HSUBCH001011004HOUT1110xxxx5HHLT1111xxxx6HXXXxxxxxxxx最后,整个程序和数据写在RAM里,机械码表示如下:地址汇编语18地址汇编语言机械码7HXXXxxxxxxxx8HXXXxxxxxxxx9H10H00010000AH20H00100000BH30H00110000CH15H00010101地址汇编语言机械码7HXXXxxxxxxxx8HXX19三.16*8的ROM设计与仿真

三.16*8的ROM设计与仿真

20范例: 配合SAP-1指令,设计16(Word)x8(Bit)的ROM,使其能够执行如下预算:10+14+18-20=1C(Hex)范例: 配合SAP-1指令,设计16(Word)x8(Bit21地址汇编语言机械码0HLDA9H000010011HADDAH000110102HADDBH000110113HSUBCH001011004HOUT111000005HHLT111100006HXXX000000007HXXX00000000地址汇编语言机械码8HXXX000000009H10H00010000AH14H00100100BH18H00011000CH20H00100000地址汇编语言机械码0HLDA9H000010011H22对于原本Don’tcare部分,直接写入0,这是因为Altera软件会将Don’tcare视为0处理.程序:ROM16_8.VHD

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;对于原本Don’tcare部分,直接写入0,这是因为Al23ENTITYROM16_8isPORT(DATAOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--DataOutputADDR:INSTD_LOGIC_VECTOR(3DOWNTO0);--ADDRESSCE:INSTD_LOGIC--ChipEnable);ENDROM16_8;ENTITYROM16_8is24

ARCHITECTUREaOFROM16_8ISBEGINDATA<=“00001001”WHENADDR=“0000”ANDCE=‘0’--LDA9H“00011010”WHENADDR=“0001”ANDCE=‘0’ELSE--ADDAH“00011011”WHENADDR=“0010”ANDCE=‘0’ELSE--ADDBH“00101100”WHENADDR=“0011”ANDCE=‘0’ELSE--SUBCH“11100000”WHENADDR=“0100”ANDCE=‘0’ELSE--OUT“11110000”WHENADDR=“0101”ANDCE=‘0’ELSE--HLT“00010000”WHENADDR=“1001”ANDCE=‘0’ELSE“00010100”WHENADDR=“1010”ANDCE=‘0’ELSE“00011000”WHENADDR=“1011”ANDCE=‘0’ELSE“00100000”WHENADDR=“1100”ANDCE=‘0’ELSE“00000000”;ENDa;

ARCHITECTUREaOFROM16_8I25程序说明:实际上仍是使用when-else方式,以类似查表方式作ROM的设计.这个ROM有个CE使能接脚,它必须为“0”时,才接受读取数据的命令.

仿真结果:略

程序说明:实际上仍是使用when-else方式,以类似查表方26四.SAP-1CPU设计与仿真

四.SAP-1CPU设计与仿真

27SAP-CPU在前面所提的指令,它们执行的指令周期总长度基本上都是6个脉冲长度,这可以用下图说明S0S1S2S3S4S5(Fetch)

磅(Execute)

MachineCycle

InstructionCycle

图2:SAP-1指令周期(InstructionCycle)SAP-CPU在前面所提的指令,它们执行的指令周期总长度基本28时序状态S0-S2范围为指令周期,而时序状态S3-S5为指令执行周期.下面是每个时序状态下,SAP-1CPU的工作任务:

1.指令捉取周期(FetchCycle)

(1)状态S0:

(寻址状态,AddressState)

这个状态下,“程序计数器”负责将所要执行的指令地址值传递至MAR存放.

(2)状态S2:(增加状态,IncrementState)

这个状态下,“程序计数器”的值加1,代表计数器将指针指向下一个要执行的指令地址值.

时序状态S0-S2范围为指令周期,而时序状态S3-S5为指令29例如:

原先在状态S0时,“程序计数器”的值是01H,它会传递01H给“MAR”,然后在这个状态S1时,将内容值加1后变成02H,这样以便记录下次要执行的指令地址值.(3)状态S2:(记忆状态,MemoryState)

这个状态下,将把记录在“MAR”里的指令地址值,送入“RAM”里后,由“RAM”读出该地址的指令码,再将该指令放入“指令寄存器”.

有一点必须强调的是,不论是执行哪个指令,它们的状态S0-S2的动作方式都是相同的,不过状态S3-S5的动作方式就会因执行对那个指令而有所不同.例如:302.指令执行周期(1)LDA指令状态S3:

这个状态下,上述的09H数据传入MAR,以便下个状态能取出该数值所代表的地址里的值,比如20H.状态S4:

这个状态是将存放在“MAR”里的09数据,通过RAM读出09H地址的数据,比如是数值20H数值至“累加器”状态S5:

这个状态下的LDA指令并没有作用2.指令执行周期(1)LDA指令31(2)ADD指令状态S3:

这个状态下,上述的AH数据将传入MAR,以便下个状态取出该数值所代表地址里的内容值,比如是数值14H状态S4:

这个状态是将存放“MAR”里的AH数据,通过RAM读出AH地址内的数据状态S5:

这个状态是将存在“累加器”和“B寄存器”的数值内容存放入“加减法器”相加后,再将相加结果放回“累加器”

(2)ADD指令32(3)SUB指令状态S3:

这个状态下,上述的BH数据传入MAR,以便下个状态能取出该数值所代表地址里的值状态S4:

这个状态是将存放在“MAR”的BH数据,通过RAM读出BH地址内的数据状态S5:

这个状态是将存放在“累加器”和“B寄存器”的数值放入“加减法器”相减后,再将相减后结果放回“累加器”(3)SUB指令33OUT指令状态S3:

这个状态下,累加器的内容将经Wbus传至“输出寄存器”,然后显示在二进制显示装置.状态S4:

这个状态OUT指令没有作用.状态S5:这个状态OUT指令没有作用OUT指令34(5)HLT指令状态S3:

这个状态下“控制器/序列发生器”将停止送出脉冲信号CLK,这时SAP-1CPU会停止执行工作.状态S4:这个状态HLT指令没有作用状态S5:这个状态HLT指令没有作用(5)HLT指令35SAP-1CPU设计

1.使用Process与CaseWhen命令架构出6个脉冲的指令周期

SAP-1CPU设计

1.使用Process与Case36ARCHITECTUREaOFSAP1IS……TYPESTATEIS(SO,S1,S2,S3,S4,S5);--statetypedeclareSIGNALPState:STATE;--presentstateSIGNALNState:STATE;--nextstate……BEGIN..**********************************************ChangeStateMode:PROCESS(CR,RST)--states0~s5BEGINIFRST=‘1’THEN--resetcpuPC<=“0000”;--pogramcounter=0HACC<=“00000000”;--accumulator=0HRUN<=‘1’;--CPUrunprogramenablePState<=S0;--InitialcpupresentstateELSIFCP’EVENTANDCP=‘0’THEN--clocknegativeedageARCHITECTUREaOFSAP1IS37IFRUN=‘1’THEN--runprogrameanble?CASEPStateIS--checkcpupresentstateWHENS0=>--(addressstate&fetchcycle-1)NState<=S1;--cpunextstateWHENS1=>--(incrementstate&fetchcycle-2)NState<=S2;--cpunextstateWHENS2=>--(memorystate&fetchcycle-3)NState<=S3;--cpunextstateWHENS3=>--STATES3(Executioncycle-1)NState<=S4;--cpunextstateWHENS4=>--STATES4(Executioncycle-2)NState<=S5;--cpunextstateWHENS5=>--STATES5(Executioncycle-3)NState<=S0;--cpunextstateENDCASE;PState<=NState;--切换状态ENDIF;ENDIF;ENDPROCESSChangeStateMode;ENDa;

IFRUN=‘1’THEN--run382.编写“指令捕捉周期(fetchcycle)即状态S0~S2的命令2.编写“指令捕捉周期(fetchcycle)即状态S0~39Changestatemode:process(cp,rst)--states0~s5variableflag,f1:boolean;beginifrst=‘1’then…….Pstate<=s0;flag:ture;Enableelsifcp’eventandcp=‘0’thenifrun=‘1’thencasepstateiscasepstateiswhenso=>nstate<=s1;mar<=std_logic_vector(pc);whens1=>nstate<=s2;ifflag=turethenpc<=pc+1;flag:=false;endif;Changestatemode:process(cp,rst40Whens2=>Nastate<=s3;Flag:ture;Ir<=databus;Whens3=>……Endcase;……Whens2=>413.编写”指令执行周期(fetchcycle)”,即状态S3~S5的命令3.编写”指令执行周期(fetchcycle)”,即状态S42

首先在CaseWhen语句的状态S3处,加入下面粗体字命令,将“指令寄存器”(IR)截取高4位指令至TMP里……Elsifcp’eventandcp=‘0’then……whens2=>……Whens3=>nstate<=s4;temp<=ir(7downto4),

whens4=>……首先在CaseWhen语句的状态S3处,加入下面粗体字43其余指令执行周期的命令,不放入CASEWHEN语句里,而改以IF-ELSE将状态S3~S5命令独立出来,这么作只是不希望CASEWHEN语句太过冗长。

changestatemode:process(cp,rst)variableflag,F1:boolean;BeginIfrst=‘1’then……Elsifcp’eventandcp=‘0’thenIfrun=‘1’thencasepstateiswhens0=>nstate<=s1;……endcase;pstate<=nstate;Endif;其余指令执行周期的命令,不放入CASEWHEN语句里,而改44Ifpstate=s3thenIf(tmp=“0000”)or(tmp=“0001”)or(tmp=“0010”)thenMar<=ir(3downto0);elsiftmp=“1110”thenoutreg<=acc;elsiftmp=“1111”thenrun<=‘0’;EndifElsifpstate=s4theniftmp=“0000”thenacc<=databus;elsiftmp=“0001”thenbreg<=databus;elsiftmp=“0010”thenbreg<=databus;endif;Elsifpstate=s5theniftmp=“0001”andf1=turethenNum<=unsigned(acc)+unsigend(breg);Ifpstate=s3then45Acc<=std_logic_vector(num);F1:=false;Elsiftmp=“0010”andf1=truethennum<=unsigned(acc)-unsigned(breg);Acc<=std_logic_vector(num);F1:false;Endif;Endif;Endif;Endprocesschangestatemode;Acc<=std_logic_vector(num);46连接连接47SAP-1Cpu电路设计一.SAP-1CPU及计算机的组成架构简介二.SAP-1CPU指令.寻址法.程序设计三.16*8的ROM设计与仿真四.SAP-1CPU设计与仿真SAP-1Cpu电路设计一.SAP-1CPU及计算机48实验目的:实验目的:49实验原理实验原理50小组成员薛宝(20054440118)汪威(20054440119)高亮(20054440120)吴安乐(2005444021)陆仁聪(20054440122)谢素斌(20054440123)吴运兴(20054440124)江宪清(20054440126)小组成员薛宝(20054440118)51一.SAP-1CPU及计算机的组成架构简介

一.SAP-1CPU及计算机的组成架构简介

52所有寄存器是以三态(threestate)输出方式,连接至webus上。虽然现在不是使用传统TTL电路组成,而是使用CPLD&FPGA类型组件来实现它,这也就意味着图1的一些功能方块或一些控制线需要作部分调整或修改,但无论如何对于每个方块所扮演的角色,是绝对有必要了解的!所有寄存器是以三态(threestate)输出方式,连接至53Programcounter48InputandMAR4416*8RAMInstructiontegisterController/sequencer41248888AccumulatorA8Adder/subtractorBregisterOutputregisterBinarydisplay88888WbusLACLKEASUEULBCLKLOCLKCLRCLKL1E1CECLKLMEPCLRCPCLKCLKCLKCLRCLRCPEPLMCELIEILAEASUEULBLO图1:SAP-1结构Program48Input4416*8Instructio54

说明:1.程序计数器它是一个4Bits的计数器,计数范围由0~15。主要功用是记录下每个执行的指令地址,并把这个地址传送至MAR寄存器存放。2.输入与MAR(MemoryAccessRegister)

这个方块应分成两个部分,一个是接受由“输入”部分输入到RAM内存的外部程序和数据,另一部分“MAR”是用来在CPU执行上述所加载的程序时,暂存下一个要执行的指令地址。3.16×8RA

这个RAM和其它的部分构成图10-1的SAP-1计算机,而且它的内存大小共有16地址×8位。所以这个RAM的地址总线是4bit,地址编码是由0000,0001,0010…1111,这个地址内容是由上述MAR传送过来,然后通过译码将地址存放的8位数据或指令输出至Wbus。

554.指令寄存器

属于CPU内的控制单元,主要是将在RAM的8位数据,通过Wbus后读入指令寄存器,然后再把数据一分为二,较高的4位属于指令部分,送至下一级的“控制器”,而较低的4位属于数据部分,将会被送至Wbus。5.控制器/序列发生器这个项目也是属于CPU内控制单元的一部分,这个控制器在程序执行时,负责送出整个计算机的时序信号CLK,而且会把指令寄存器送来的4位指令,解译成12位的控制信号,由这组控制信号指挥其它的功能方块,完成该指令的运作。由于使用VHDL语言设计整个SAR-1,依照语法的使用,这部分会被省略,而且不会影响整个CPU运作。6.累加器

累加器是个8位的缓冲寄存器,它是存放目前计算机执行的实时数据地方。不同的指令也将使它产生不同的工作方式。4.指令寄存器567.加减法器

这个加减法器负责执行数学的加法和减法运算,而且运算的结果会放回“累加器”暂存。8.B寄存器

这个寄存器用来配合“累加器”、“加减法器”,执行“加法”或“减法”的工作。9.输出寄存器这个输出寄存器的用途是,SAP-1CPU执行到“输出结果”的指令时,便将“累加器”的结果传至“输出寄存器”,所以它是负责存放输出结果,当然这个存放的结果是二进制形式的。7.加减法器5710.二进制显示在图1的SAP-1计算机里,以8个LED作程序执行结果的显示,这个算是这台计算机的输出部分,而不是SAP-1CPU的功能方块。最后就VHDL语言设计的观点来对图1作设计分类:

SAP-1CPU部分:程序计数器、MAR、指令寄存器、控制器/序列发生器、累加器、加减法器、B寄存器、输出寄存器。

16×8MAR部分:考虑直接改成ROM的形式,这是因为程序执行时,它不接受外界输入。10.二进制显示58二.SAP-1CPU指令.寻址法.程序设计

二.SAP-1CPU指令.寻址法.程序设计

59SAP-1的CPU指令,共有5个且可分成两种类型,如表指令运算码范例说明LDA0000LDA9H将9H内存的内容值加载累加器ADD0001ADDBH将BH的内存内容值和累加器内容值相加,再存放运算结果回累加器SUB0010SUBEH将EH的内存内容值和累加器内容值相减,再存放运算结果回累加器直接寻址法(DirectAddressing)SAP-1的CPU指令,共有5个且可分成两种类型,如表指令60指令运算码范例说明OUT1110OUT将累加器内容输出至“输出寄存器”HLT1111HLT结果CPU执行零位寻址法(ZeroAddressing)指令运算码范例说明OUT1110OUT将累加器内容输出至“输61范例:试使用SAP-1指令,执行下列运算结果。10+20+30-15=4B(十六进制)解答:首先将运算数据10,20,30,15依序放在9H-CH地址里第一个指令写在0H地址,功能是先将10加载累加器,所以指令写成:

LDA0H

这是因为9H存放着数值10的内容范例:试使用SAP-1指令,执行下列运算结果。62第二个指令写在1H地址,功能是将20加载B寄存器,然后与累加器里的10作相加后,再将结果30存回累加器,所以指令写成(地址AH内存数值20):ADDAH第三个指令写成在2H地址,功能是将30加载B寄存器,然后与累加器里的30作相加后,再将结果60存回累加器,所以指令写成(地址BH内存放数值30数据):

ADDBH第二个指令写在1H地址,功能是将20加载B寄存器,然后与累加63第四个指令写在3H地址,功能是将15加载B寄存器,然后与累加器里的60作相减后,再将结果4B存回累加器,所以指令写成(地址CH内存放数值15数据):

SUBCN第五个指令写在4H地址,是将累加器数值结果4B作输出显示,所以指令写成:

OUT第六个指令写在5H地址,功能在停止CPU运算,所以指令写成:

HLT第四个指令写在3H地址,功能是将15加载B寄存器,然后与累加64最后,整个程序和数据写在RAM里,机械码表示如下:地址汇编语言机械码0HLDA9H000010011HADDAH000110102HADDBH000110113HSUBCH001011004HOUT1110xxxx5HHLT1111xxxx6HXXXxxxxxxxx最后,整个程序和数据写在RAM里,机械码表示如下:地址汇编语65地址汇编语言机械码7HXXXxxxxxxxx8HXXXxxxxxxxx9H10H00010000AH20H00100000BH30H00110000CH15H00010101地址汇编语言机械码7HXXXxxxxxxxx8HXX66三.16*8的ROM设计与仿真

三.16*8的ROM设计与仿真

67范例: 配合SAP-1指令,设计16(Word)x8(Bit)的ROM,使其能够执行如下预算:10+14+18-20=1C(Hex)范例: 配合SAP-1指令,设计16(Word)x8(Bit68地址汇编语言机械码0HLDA9H000010011HADDAH000110102HADDBH000110113HSUBCH001011004HOUT111000005HHLT111100006HXXX000000007HXXX00000000地址汇编语言机械码8HXXX000000009H10H00010000AH14H00100100BH18H00011000CH20H00100000地址汇编语言机械码0HLDA9H000010011H69对于原本Don’tcare部分,直接写入0,这是因为Altera软件会将Don’tcare视为0处理.程序:ROM16_8.VHD

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;对于原本Don’tcare部分,直接写入0,这是因为Al70ENTITYROM16_8isPORT(DATAOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--DataOutputADDR:INSTD_LOGIC_VECTOR(3DOWNTO0);--ADDRESSCE:INSTD_LOGIC--ChipEnable);ENDROM16_8;ENTITYROM16_8is71

ARCHITECTUREaOFROM16_8ISBEGINDATA<=“00001001”WHENADDR=“0000”ANDCE=‘0’--LDA9H“00011010”WHENADDR=“0001”ANDCE=‘0’ELSE--ADDAH“00011011”WHENADDR=“0010”ANDCE=‘0’ELSE--ADDBH“00101100”WHENADDR=“0011”ANDCE=‘0’ELSE--SUBCH“11100000”WHENADDR=“0100”ANDCE=‘0’ELSE--OUT“11110000”WHENADDR=“0101”ANDCE=‘0’ELSE--HLT“00010000”WHENADDR=“1001”ANDCE=‘0’ELSE“00010100”WHENADDR=“1010”ANDCE=‘0’ELSE“00011000”WHENADDR=“1011”ANDCE=‘0’ELSE“00100000”WHENADDR=“1100”ANDCE=‘0’ELSE“00000000”;ENDa;

ARCHITECTUREaOFROM16_8I72程序说明:实际上仍是使用when-else方式,以类似查表方式作ROM的设计.这个ROM有个CE使能接脚,它必须为“0”时,才接受读取数据的命令.

仿真结果:略

程序说明:实际上仍是使用when-else方式,以类似查表方73四.SAP-1CPU设计与仿真

四.SAP-1CPU设计与仿真

74SAP-CPU在前面所提的指令,它们执行的指令周期总长度基本上都是6个脉冲长度,这可以用下图说明S0S1S2S3S4S5(Fetch)

磅(Execute)

MachineCycle

InstructionCycle

图2:SAP-1指令周期(InstructionCycle)SAP-CPU在前面所提的指令,它们执行的指令周期总长度基本75时序状态S0-S2范围为指令周期,而时序状态S3-S5为指令执行周期.下面是每个时序状态下,SAP-1CPU的工作任务:

1.指令捉取周期(FetchCycle)

(1)状态S0:

(寻址状态,AddressState)

这个状态下,“程序计数器”负责将所要执行的指令地址值传递至MAR存放.

(2)状态S2:(增加状态,IncrementState)

这个状态下,“程序计数器”的值加1,代表计数器将指针指向下一个要执行的指令地址值.

时序状态S0-S2范围为指令周期,而时序状态S3-S5为指令76例如:

原先在状态S0时,“程序计数器”的值是01H,它会传递01H给“MAR”,然后在这个状态S1时,将内容值加1后变成02H,这样以便记录下次要执行的指令地址值.(3)状态S2:(记忆状态,MemoryState)

这个状态下,将把记录在“MAR”里的指令地址值,送入“RAM”里后,由“RAM”读出该地址的指令码,再将该指令放入“指令寄存器”.

有一点必须强调的是,不论是执行哪个指令,它们的状态S0-S2的动作方式都是相同的,不过状态S3-S5的动作方式就会因执行对那个指令而有所不同.例如:772.指令执行周期(1)LDA指令状态S3:

这个状态下,上述的09H数据传入MAR,以便下个状态能取出该数值所代表的地址里的值,比如20H.状态S4:

这个状态是将存放在“MAR”里的09数据,通过RAM读出09H地址的数据,比如是数值20H数值至“累加器”状态S5:

这个状态下的LDA指令并没有作用2.指令执行周期(1)LDA指令78(2)ADD指令状态S3:

这个状态下,上述的AH数据将传入MAR,以便下个状态取出该数值所代表地址里的内容值,比如是数值14H状态S4:

这个状态是将存放“MAR”里的AH数据,通过RAM读出AH地址内的数据状态S5:

这个状态是将存在“累加器”和“B寄存器”的数值内容存放入“加减法器”相加后,再将相加结果放回“累加器”

(2)ADD指令79(3)SUB指令状态S3:

这个状态下,上述的BH数据传入MAR,以便下个状态能取出该数值所代表地址里的值状态S4:

这个状态是将存放在“MAR”的BH数据,通过RAM读出BH地址内的数据状态S5:

这个状态是将存放在“累加器”和“B寄存器”的数值放入“加减法器”相减后,再将相减后结果放回“累加器”(3)SUB指令80OUT指令状态S3:

这个状态下,累加器的内容将经Wbus传至“输出寄存器”,然后显示在二进制显示装置.状态S4:

这个状态OUT指令没有作用.状态S5:这个状态OUT指令没有作用OUT指令81(5)HLT指令状态S3:

这个状态下“控制器/序列发生器”将停止送出脉冲信号CLK,这时SAP-1CPU会停止执行工作.状态S4:这个状态HLT指令没有作用状态S5:这个状态HLT指令没有作用(5)HLT指令82SAP-1CPU设计

1.使用Process与CaseWhen命令架构出6个脉冲的指令周期

SAP-1CPU设计

1.使用Process与Case83ARCHITECTUREaOFSAP1IS……TYPESTATEIS(SO,S1,S2,S3,S4,S5);--statetypedeclareSIGNALPState:STATE;--presentstateSIGNALNState:STATE;--nextstate……BEGIN..**********************************************ChangeStateMode:PROCESS(CR,RST)--states0~s5BEGINIFRST=‘1’THEN--resetcpuPC<=“0000”;--pogramcounter=0HACC<=“00000000”;--accumulator=0HRUN<=‘1’;--CPUrunprogramenablePState<=S0;--InitialcpupresentstateELSIFCP’EVENTANDCP=‘0’THEN--clocknegativeedageARCHITECTUREaOFSAP1IS84IFRUN=‘1’THEN--runprogrameanble?CASEPStateIS--checkcpupresentstateWHENS0=>--(addressstate&fetchcycle-1)NState<=S1;--cpunextstateWHENS1=>--(incrementstate&fetchcycle-2)NState<=S2;--cpunextstateWHENS2=>--(memorystate&fetchcycle-3)NState<=S3;--cpunextstateWHENS3=>--STATES3(Executioncycle-1)NState<=S4;--cpunextstateWHENS4=>--STATES4(Executioncycle-2)NState<=S5;

温馨提示

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

评论

0/150

提交评论