计算机设计与实践 CPU 代码(含19条指令)

合集下载

CPU 指令大全

CPU 指令大全

IntelSSE:SSE是指令集的简称,它包括70条指令,其中包含单指令多数据浮点计算、以及额外的SIMD整数和高速缓存控制指令。

其优势包括:更高分辨率的图像浏览和处理、高质量音频、MPEG2视频、同时MPEG2加解密;语音识别占用更少CPU资源;更高精度和更快响应速度。

SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是MMX的超集。

AMD后来在Athlon XP中加入了对这个指令集的支持。

这个指令集增加了对8个128位寄存器XMM0-XMM7的支持,每个寄存器可以存储4个单精度浮点数。

使用这些寄存器的程序必须使用FXSAVE和FXRSTR指令来保持和恢复状态。

但是在Pentium III对SSE的实现中,浮点数寄存器又一次被新的指令集占用了,但是这一次切换运算模式不是必要的了,只是SSE和浮点数指令不能同时进入CPU的处理线而已。

SSE2是Intel在P4的最初版本中引入的,但是AMD后来在Opteron 和Athlon 64中也加入了对它的支持。

这个指令集添加了对64位双精度浮点数的支持,以及对整型数据的支持,也就是说这个指令集中所有的MMX指令都是多余的了,同时也避免了占用浮点数寄存器。

这个指令集还增加了对CPU的缓存的控制指令。

AMD对它的扩展增加了8个XMM寄存器,但是需要切换到64位模式(AMD64)才可以使用这些寄存器。

Intel后来在其EM64T架构中也增加了对AMD64的支持。

SSE3是Intel在P4的Prescott版中引入的指令集,AMD在Athlon 64的第五个版本中也添加了对它的支持。

这个指令集扩展的指令包含寄存器的局部位之间的运算,例如高位和低位之间的加减运算;浮点数到整数的转换,以及对超线程技术的支持。

SSE4指令集将给英特尔下一代平台带来“相当大的视频性能提升”。

电脑指令代码大全

电脑指令代码大全

电脑指令代码大全电脑指令代码是计算机程序设计中的重要组成部分,它是计算机能够理解和执行的命令集合。

在计算机编程中,了解和掌握各种指令代码是非常重要的,它可以帮助程序员更好地编写程序,实现各种功能。

本文将为大家介绍一些常见的电脑指令代码,希望能够帮助大家更好地理解和应用这些指令代码。

1. 数据处理指令代码。

数据处理指令代码是用来对数据进行处理和计算的指令。

比如,加法指令、减法指令、乘法指令、除法指令等,它们可以帮助程序员对数据进行各种运算操作。

在编写程序时,程序员可以根据实际需求选择合适的数据处理指令代码,从而实现各种复杂的计算。

2. 逻辑控制指令代码。

逻辑控制指令代码用于控制程序的执行流程。

比如,条件判断指令、循环指令、跳转指令等,它们可以帮助程序员实现程序的分支和循环执行。

在实际编程中,逻辑控制指令代码可以帮助程序员编写出更加灵活和高效的程序。

3. 存储访问指令代码。

存储访问指令代码用于对内存和外部存储器进行读写操作。

比如,读取指令、写入指令、加载指令、存储指令等,它们可以帮助程序员实现对数据的读取和存储。

在程序设计中,存储访问指令代码是非常重要的,它直接影响到程序对数据的操作和存储。

4. 输入输出指令代码。

输入输出指令代码用于实现程序与外部设备的交互。

比如,输入指令、输出指令、中断指令等,它们可以帮助程序员实现程序与键盘、鼠标、显示器、打印机等设备的交互。

在实际应用中,输入输出指令代码是非常重要的,它直接影响到程序与用户和外部设备的交互。

5. 系统调用指令代码。

系统调用指令代码用于程序与操作系统进行交互。

比如,系统调用指令、中断指令等,它们可以帮助程序员实现对操作系统的调用和利用。

在实际编程中,系统调用指令代码是非常重要的,它可以帮助程序员实现对操作系统各种功能的调用和利用。

总结。

电脑指令代码是计算机程序设计中的重要组成部分,它直接影响到程序的执行和功能实现。

了解和掌握各种指令代码对于程序员来说是非常重要的,它可以帮助程序员编写出更加灵活和高效的程序。

CPU指令集详细介绍

CPU指令集详细介绍

CPU指令集详细介绍所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的*,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。

而指令集的先进与否,也关系到CPU的*能发挥,它也是CPU*能体现的一个重要标志。

SSE指令集由于MMX指令并没有带来3D游戏*能的显著提升,1999年Intel 公司在PentiumIIICPU产品中推出了数据流单指令序列扩展指令(SSE)。

SSE兼容MMX指令,它可以通过SIMD(单指令多数据技术)和单时钟周期并行处理多个浮点来有效地提高浮点运算速度。

SSE2指令集在Pentium4CPU中,Intel公司开发了新指令集SSE2。

这一次新开发的SSE2指令一共144条,包括浮点SIMD指令、整形SIMD指令、SIMD浮点和整形数据之间转换、数据在MMX寄存器中转换等几大部分。

SSE3指令集相对于SSE2,SSE3又新增加了13条新指令,此前它们被统称为pni(prescottnewinstructions)。

13条指令中,一条用于视频解码,两条用于线程同步,其余用于复杂的数学运算、浮点到整数转换和SIMD浮点运算。

SSE4指令集SSE4又增加了50条新的增加*能的指令,这些指令有助于编译、媒体、字符/文本处理和程序指向加速。

3DNow!扩展指令集3DNow!指令集是AMD公司1998年开发的多媒体扩展指令集,共有21条指令。

针对MMX指令集没有加强浮点处理能力的弱点,重点提高了AMD公司K6系列CPU对3D图形的处理能力。

X86指令集要知道什么是指令集还要从当今的X86架构的CPU说起。

X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,以后就将X86指令集和X87指令集统称为X86指令集。

CPU常用操作指令

CPU常用操作指令

CPU常用操作指令CPU常用操作指令是指在汇编语言中使用的一些常见的指令,用于完成各种任务和操作。

这些指令可以用于数据传输、算术运算、逻辑运算、条件分支等各种操作。

下面我将列举一些常见的CPU操作指令,并介绍它们的用途和示例。

1.MOV指令:用于将数据从一个地方移动到另一个地方。

例如,将一个寄存器中的值移动到另一个寄存器中,或将一个内存单元中的值移动到一个寄存器中。

示例:MOVAX,BX;将BX中的值移动到AX中MOV[BX],10;将值10存储到BX所指向的内存单元中2.ADD指令:用于执行整数的加法操作。

可以将两个寄存器中的值相加,或将一个寄存器中的值与一个立即数相加。

示例:ADDAX,BX;将AX和BX中的值相加,并将结果存储到AX中ADDAX,10;将AX中的值与10相加,并将结果存储到AX中3.SUB指令:用于执行整数的减法操作。

可以将两个寄存器中的值相减,或将一个寄存器中的值与一个立即数相减。

示例:SUBAX,BX;将AX和BX中的值相减,并将结果存储到AX中SUBAX,10;将AX中的值减去10,并将结果存储到AX中4.MUL指令:用于执行无符号整数的乘法操作。

可以将一个寄存器中的值与另一个寄存器中的值相乘,并将结果存储到两个乘积寄存器中。

示例:MOVAX,10;将值10存储到AX中MOVBX,5;将值5存储到BX中MULBX;将AX中的值与BX中的值相乘,并将结果存储到AX和DX中5.DIV指令:用于执行无符号整数的除法操作。

可以将一个寄存器中的值与另一个寄存器中的值相除,并将商存储到一个寄存器中,余数存储到另一个寄存器中。

示例:MOVAX,20;将值20存储到AX中MOVBX,5;将值5存储到BX中DIVBX;将AX中的值除以BX中的值,并将商存储到AX中,余数存储到DX中6.AND指令:用于执行逻辑与操作。

可以将一个寄存器中的值与另一个寄存器中的值进行逻辑与运算,并将结果存储到一个寄存器中。

c语言指令大全表解释

c语言指令大全表解释

c语言指令大全表解释C语言指令是计算机科学领域中的基础知识,掌握好它们意味着能够进行高效的编码工作。

正因如此,这篇文章将会针对C语言指令大全表进行解释性阐述。

首先,我们需要了解表中不同的分类,包括:控制流、数据类型、函数库、编译指令和预处理指令。

这些分类代表了不同的操作方式和目的,我们需要根据需求选择不同的指令来使用。

接下来,让我们详细介绍一下C语言指令分类的不同之处和应用场景。

控制流指令:包括条件和循环等语句,它们是一些用来控制代码执行流程的代码片段。

例如:· if语句:用于条件判断,如果满足条件,则执行特定代码块。

· while循环语句:重复执行某一段代码,直到满足条件才退出。

· for循环语句:用于迭代一些操作,通常会有一个计数器来控制循环次数。

数据类型指令:C语言支持多种数据类型,我们需要根据实际需求来选择不同的数据类型。

例如:· int类型:用于表示整数值。

· float类型:用于表示浮点数值。

· char类型:用于表示单个字符。

· double类型:用于表示双精度浮点数。

函数库指令:函数库是预先编写好的一些代码片段,方便我们在程序中调用。

例如:· printf()函数:用于输出文字。

· scanf()函数:用于输入数据。

· pow()函数:用于数学运算,求一个数的n次方。

编译指令:用于告诉程序如何编译代码,之后我们可以在程序中使用它们。

例如:· #include指令:用于载入头文件。

· #define指令:用于定义宏。

预处理指令:是在编译代码之前执行的一系列操作。

例如:· #if指令:用于条件编译,根据条件判断是否编译。

· #ifdef指令:用于检查是否定义了某个宏。

在学习和理解这些指令的过程中,我们不仅需要了解每个指令的具体语法和用法,更要深入思考其潜在的含义和应用场景,学会如何灵活选择和使用它们。

cpu指令由什么组成

cpu指令由什么组成

cpu指令由什么组成中央处理器称为CPU(Control Processing Unit),它主要由控制器和运算器组成,是计算机的核心部件。

下面是店铺给大家整理的一些有关cpu指令的组成,希望对大家有帮助!cpu指令的组成简单介绍CPU指令集:MMX SSE SSE2 SSE3 3DNow! AMD64 EM64TMMX:MMX(Multi Media eXtension 多媒体扩展指令)指令集是Intel公司在1996年为旗下的Pentium系列处理器所开发的一项多媒体指令增强技术。

MMX指令集中包括了57条多媒体指令,通过这些指令可以一次性处理多个数据,在处理结果超过实际处理能力的时候仍能够进行正常处理,如果在软件的配合下,可以得到更强的处理性能。

使用MMX指令集的好处就是当时所使用的操作系统可以在不做任何改变的情况下执行MMX指令。

但是,MMX指令集的问题也是比较明显的,MMX指令集不能与X86的浮点运算指令同时执行,必须做密集式的交错切换才可以正常执行,但是这样一来,就会造成整个系统运行速度的下降。

SSE:SSE是Streaming SIMD Extension(SIMD扩展指令集)的缩写,而其中SIMD的为含意为Single Istruction Multiple Data(单指令多数据),所以SSE指令集也叫单指令多数据流扩展。

该指令集最先运用于Intel的Pentium III系列处理器,其实在Pentium III推出之前,Intel方面就已经泄漏过关于KNI(Katmai New Instruction)指令集的消息。

这个KNI指令集也就是SSE指令集的前身,当时也有不少的媒体将该指令集称之为MMX2指令集,但是Intel方面却从没有发布有关MMX2指令集的消息。

最后在Intel推出Pentium III处理器的时候,SSE指令集也终于水落石出。

SSE指令集是为提高处理器浮点性能而开发的扩展指令集,它共有70条指令,其中包含提高3D图形运算效率的50条SIMD浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中的连续数据块传输指令。

电脑指令代码大全

电脑指令代码大全

电脑指令代码大全在计算机编程领域,指令代码是一种用于控制计算机硬件执行特定操作的命令集合。

它可以用于实现各种功能,从简单的数学运算到复杂的图形处理。

本文将为大家介绍一些常见的电脑指令代码,帮助大家更好地理解和应用这些代码。

首先,我们来介绍一些常见的数学运算指令代码。

在计算机编程中,我们经常需要对数字进行加减乘除等运算。

比如,加法运算可以使用“add”指令,减法运算可以使用“sub”指令,乘法运算可以使用“mul”指令,除法运算可以使用“div”指令。

这些指令可以帮助我们实现各种复杂的数学运算,从而完成各种计算任务。

除了数学运算,我们还经常需要对数据进行逻辑操作。

比如,我们可能需要对数据进行比较、逻辑与或非运算。

这时,我们可以使用一些逻辑操作指令代码来实现。

比如,比较操作可以使用“cmp”指令,逻辑与操作可以使用“and”指令,逻辑或操作可以使用“or”指令,逻辑非操作可以使用“not”指令。

这些指令可以帮助我们实现各种复杂的逻辑操作,从而完成各种逻辑判断和控制任务。

此外,我们还需要对内存进行读写操作。

在计算机编程中,我们经常需要从内存中读取数据,或者将数据写入内存。

这时,我们可以使用一些内存操作指令代码来实现。

比如,读操作可以使用“load”指令,写操作可以使用“store”指令。

这些指令可以帮助我们实现对内存的读写操作,从而完成各种数据存取任务。

除了上述常见的指令代码,还有一些其他类型的指令代码,比如跳转指令、函数调用指令、IO操作指令等。

这些指令代码可以帮助我们实现各种复杂的控制和交互操作,从而完成各种实际的应用任务。

总的来说,电脑指令代码是计算机编程中非常重要的一部分,它可以帮助我们实现各种复杂的功能和任务。

通过学习和掌握各种指令代码,我们可以更好地理解和应用计算机编程,从而提高自己的编程能力,实现更加丰富和复杂的应用。

希望本文介绍的一些常见的指令代码对大家有所帮助,也希望大家能够进一步深入学习和掌握更多的指令代码,从而在编程领域取得更大的成就。

处理器编号

处理器编号

看编号识CPU:教你识别处理器编号CPU上面的编号代表了该CPU的主要性能指标。

如产品系列、主频、缓存容量、使用电压、封装方式、产地、生产日期,通过识别CPU编号,你可以初步认定CPU的工作频率、外频、属于何系列的,防止一些非法商家用超频的CPU冒充高频率产品。

PIII Confidential编号格式:xxxEBkkkMMM2.0VS1 abcde abcdefgh-0123Xxx: :代表CPU工作频率EB :E=采用0.18微米制造工艺;B=133MHZ FSB前端总线Kkk :代表二级缓存的容量MMM:代表CPU的外部频2.0V :代表核心电压S1 :代表CPU的架构,S1=Slot 1Abcde:规格号abcdefgh-0123 :序列号,其中第一位代表产地.0=Costa Rica(哥斯达黎加),1=Philippines(菲律宾),9=Malaysia(马来西亚),Y=Ireland(爱尔兰))接下来两位是代表第多少周生产。

PIII Coppermine的编号格式:RaaaaaHZmmmkkkEC abcde abcdefgh-0123R :R=Socket 370架构Aaaaa :代表采用的核心。

80525=Katmai核心,80526=Coppermine核心HZ :代表CPU的外频Mmm :代表CPU的工作频率HzKkk :代表CPU二级缓存容量EC :代表ECC纠错Abcde:规格号abcdefgh-0123 :同PIII ConfidentialCeleron编号格式:FV524RX mmmkkk ABCDE XXXXX L01234567-1234FV524RX:保留Mmm :代表CPU工作频率Kkk :代表二级缓存的容量ABCDE :规格号XXXXX:产地,MALAY=马来西亚,COSTA RICA=哥斯达黎加L01234567-1234 :其中第一个L代表产地(0=Costa Rica(哥斯达黎加),1和9= Malaysia(马来西亚));接下来的123代表第多少周生产Celeron II编号的识别方法与PIII Coppermine相同Intel PII编号格式:W8065xhzmmmkkkEC ABCDE abcdefgh-0123W :代表出售对象,x=零售商,空项=OEM厂商8065 :保留x :代表采用的核心,2=Klamath核心即0.35微米制造工艺,3= Deschutes核心即0.25微米制造工艺hz :代表采用的外频mmm:表处理器的工作频率kkk :代表二级缓存的容量EC :代表ECC纠错ABCDE :规格号abcdefgh-0123 :其中第一位代表产地,0=Costa Rica(哥斯达黎加),1=Philippines(菲律宾),9=Malaysia(马来西亚),Y=Ireland(爱尔兰));接下来的两位代表第多少周生产。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时钟管理模块entity clk_ctrl isport(Clk:in std_logic;Rst:in std_logic;k:out std_logic_vector(3 downto 0));end clk_ctrl;architecture Behavioral of clk_ctrl issignal tmp:std_logic_vector(3 downto 0);beginprocess(Clk,Rst,tmp)beginif Rst ='1' then --rst=1复位;--k<="0000";tmp<="0001";elsif Clk='1' and Clk'event thentmp(0)<=tmp(3);tmp(3 downto 1)<=tmp(2 downto 0);end if;end process; k<=tmp;end Behavioral;取指模块entity irget isPort (Rst : in STD_LOGIC;--复位;Pcback : in STD_LOGIC_VECTOR (15 downto 0);--PC回写;Pcbacka : in STD_LOGIC;--PC回写允许;k1 : in STD_LOGIC;--时钟控制;Order : in STD_LOGIC_VECTOR (15 downto 0);--指令Pcout : out STD_LOGIC_VECTOR (15 downto 0);--PC输出;Orderout : out STD_LOGIC_VECTOR (15 downto 0);--指令输出;AddrFlag : out STD_LOGIC);--访址标志end irget;architecture Behavioral of irget issignal tmpPC: std_logic_vector (15 downto 0); --指令地址;signal IR:std_logic_vector(15 downto 0);--指令寄存器;beginprocess(Rst,Pcback,Pcbacka,k1,order,tmpPc)beginif Rst='1' thentmpPc<="0000000000000000";elsif k1='1' thenPcout<=tmpPc;AddrFlag<='1';--第一个节拍高电平取指;elsif Pcbacka='1' thentmpPc<=Pcback;--pc回写允许---end if;--AddrFlag<='0';else AddrFlag<='0';end if ;Orderout<=Order;--指令存入指令寄存器;end process;--Orderout<=IR;--得到指令,准备送往后面的模块;end Behavioral;运算模块entity CPU_operation isPort ( k2 : in STD_LOGIC;--时钟控制;k3 : in STD_LOGIC;--时钟控制;第三个时钟高电平改变标志寄存器的值;order : in STD_LOGIC_VECTOR (15 downto 0);--命令输入;Pcin:in STD_LOGIC_VECTOR(15 downto 0);--pc输入;Rst:in STD_LOGIC;--复??;Rwb : in STD_LOGIC_VECTOR (7 downto 0);--回写数据;Rwba : in STD_LOGIC;--回?丛市???高电平有效Aluout : out STD_LOGIC_VECTOR (15 downto 0);--计算结果输出;addr : out STD_LOGIC_VECTOR (15 downto 0)--内存?刂??);end CPU_operation;architecture Behavioral of CPU_operation istype reg is array(0 to 7) of std_logic_vector(7 downto 0);signal sreg:reg;signal F9:std_logic_vector(8 downto 0);--判断结果是否进位、是否为零;signal sregflag:std_logic_vector(1 downto 0);--标志寄存器;beginprocess(Rwb,Rwba,k2,order,sreg,Pcin,sregflag,F9)beginif Rwba='1' thensreg(conv_integer(order(10 downto 8)))<=Rwb;--回写end if;if Rst='1' thensreg(7)<="00000000";sreg(6)<="00000000";F9(8)<='0';end if;if k2='1' thencase order(15 downto 11) iswhen "00000"=>--mov Ri,ImAluout(7 downto 0)<=order(7 downto 0);Aluout(15 downto 8)<="11111111";when "00001"=>--LDA Ri,Xaddr(15 downto 8)<=sreg(7);addr(7 downto 0)<= order(7 downto 0);Aluout(15 downto 8)<="11111111";when "00010"=>--STA Ri,XAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8)));Aluout(15 downto 8)<="11111111";addr(7 downto 0)<=order(7 downto 0);addr(15 downto 8)<=sreg(7);when "00011"=>--mov Ri,RjAluout(7 downto 0)<=sreg(conv_integer(order(2 downto 0)));Aluout(15 downto 8)<="11111111";when "00100"=>--mov Ri,(Rj)addr(7 downto 0)<=sreg(conv_integer(order(2 downto 0)));addr(15 downto 8)<=sreg(7);when "00101"=>--mov Ri,[R7//R6+x]addr<= sreg(7)&sreg(6)+order(7 downto 0);when "00110"=>--Adc,Ri,ImAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8)))+order(7 downto 0)+sregflag(1);F9<=('0'&sreg(conv_integer(order(10 downto 8))))+('0'&order(7 downto 0));Aluout(15 downto 8)<="11111111";when "00111"=>--Adc,Ri,Rj,Ri+Rj+Cy->RiAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8)))+sreg(conv_integer(order(2 downto 0)))+sregflag(1);F9<=('0'&sreg(conv_integer(order(10 downto 8))))+('0'&order(7 downto 0));Aluout(15 downto 8)<="11111111";when "01000"=>--SBB Ri,ImAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8)))-order(7 downto 0)-sregflag(1);F9<=('0'&sreg(conv_integer(order(10 downto 8))))-('0'&order(7 downto 0));Aluout(15 downto 8)<="11111111";when "01001"=>--SBB Ri,Rj,Ri-Rj-Cy->RiAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8)))-sreg(conv_integer(order(2 downto 0)))-sregflag(1);F9<=('0'&sreg(conv_integer(order(10 downto 8))))-('0'& order(7 downto 0));Aluout(15 downto 8)<="11111111";when "01010"=>--AND Ri,ImAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8))) and order(7 downto 0);F9(7 downto 0)<=(sreg(conv_integer(order(10 downto 8))))and(order(7 downto 0));Aluout(15 downto 8)<="11111111";when "01011"=>--AND Ri,RjAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8))) and sreg(conv_integer(order(2 downto 0)));F9(7 downto 0)<=sreg(conv_integer(order(10 downto 8))) and order(7 downto 0);Aluout(15 downto 8)<="11111111";when "01100"=>--OR Ri,ImAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8))) or order(7 downto 0);F9(7 downto 0)<=(sreg(conv_integer(order(10 downto 8)))) or (order(7 downto 0));Aluout(15 downto 8)<="11111111";when "01101"=>--OR Ri,RjAluout(7 downto 0)<=sreg(conv_integer(order(10 downto 8))) or sreg(conv_integer(order(2 downto 0)));F9(7 downto 0)<=(sreg(conv_integer(order(10 downto 8)))) or (order(7 downto 0));Aluout(15 downto 8)<="11111111";when "10000"=>--JMP AddrAluout<=sreg(7)&order(7 downto 0);when "10001"=>--JZ signif sregflag(0)='1' thenif order(7)='0' then Aluout<= Pcin+("00000000"&order(7 downto 0));else Aluout <= Pcin+("11111111" & order(7 downto 0));end if;elseAluout <= Pcin;end if;when "10010"=>--JC signif sregflag(1) = '1' thenif order(7)='0' then Aluout<= Pcin+("00000000"&order(7 downto 0));else Aluout <= Pcin+("11111111" & order(7 downto 0));end if;elseAluout <= Pcin;end if;when others=>NULL;end case;end if;end process;process(k3,F9,order)beginif rst = '1' thensregflag(0)<='0';sregflag(1)<='0';elsif k3 = '1' thencase order(15 downto 12) iswhen "0011" | "0101" | "0100" | "0110" =>sregflag(1) <= F9(8);if F9(7 downto 0) = "00000000" thensregflag(0) <= '1';else sregflag(0)<='0';end if;when "0111"=>sregflag(0) <= order(11);when others => null;end case;end if;end process;end Behavioral;存储管理模块entity CPU_Momery isPort (k3 : in STD_LOGIC;--时钟控制;order : in STD_LOGIC_VECTOR (15 downto 0);--命令输入;alu : in STD_LOGIC_VECTOR (15 downto 0);--计算结果输??;datain : in STD_LOGIC_VECTOR (7 downto 0);--从内存读入的??;dataout: out STD_LOGIC_VECTOR (7 downto 0);--存入内存的数;Rtmp:out STD_LOGIC_VECTOR (15 downto 0);--数据输出;送向回写模块;sta : out STD_LOGIC;--存数控制;高电平有效;lda : out STD_LOGIC);--取数控制;高电平有效??end CPU_Momery;architecture Behavioral of CPU_Momery isbeginprocess(k3,alu,order,datain)beginif k3='1' then --高电平操作;case order(15 downto 11) iswhen "00001"=>--取数;lda<='1';Rtmp(7 downto 0)<=datain;when "00100"=>--取数;lda<='1';Rtmp(7 downto 0)<=datain;when "00101"=>--取数;lda<='1';Rtmp(7 downto 0)<=datain;when "00010"=>--存数;sta<='1';dataout<=alu(7 downto 0);when others=>Rtmp<=alu;--不访存;运算结果直接送下一个模块;lda<='0';sta<='0';end case;elselda<='0';sta<='0';end if;end process;end Behavioral;访存模块entity CPU_ToMomery isPort (sta : in STD_LOGIC;--存数指令;lda : in STD_LOGIC;--取数指令;Addr: in STD_LOGIC_VECTOR(15 downto 0);--内存地址;flag: in STD_LOGIC;--取指标志;PCaddr: in STD_LOGIC_VECTOR(15 downto 0);--指令地址输入;orderout:out STD_LOGIC_VECTOR(15 downto 0);--指令输出;dataout : out STD_LOGIC_VECTOR (7 downto 0);--从内存中取出的数;datain : in STD_LOGIC_VECTOR (7 downto 0);--需要存入内存的数;ABUS : out STD_LOGIC_VECTOR(15 downto 0);--地址总线??DBUS : inout STD_LOGIC_VECTOR(15 downto 0);--数据总线;CS: out STD_LOGIC;--片选信号;低电平有效;RD: out STD_LOGIC;--读信号;低电平有效;WR: OUT STD_LOGIC; --写信号;低电平有????nBHE:out std_logic;nBLE:out std_logic);end CPU_ToMomery;architecture Behavioral of CPU_ToMomery is beginprocess(sta,lda,datain,DBUS,flag)beginif flag='1' then --取指令;CS<='0';RD<='0';WR<='1';nBHE<='0';nBLE<='0';ABUS<=PCaddr;orderout<=DBUS;DBUS<="ZZZZZZZZZZZZZZZZ";elsif sta='1' then --存数访存;CS<='0';RD<='1';WR<='0';nBHE<='0';nBLE<='0';ABUS<=Addr;DBUS(7 downto 0)<=datain;DBUS(15 downto 8)<="11111111";elsif lda='1' then --取数访存;CS<='0';RD<='0';WR<='1';nBHE<='0';nBLE<='0';ABUS<=Addr;dataout<=DBUS(7 downto 0);DBUS<="ZZZZZZZZZZZZZZZZ";elseCS<='1';RD<='1';WR<='1';nBHE<='1';nBLE<='1';DBUS<="ZZZZZZZZZZZZZZZZ";end if;end process;end Behavioral;回写模块entity WriteBack isport(k4: in std_logic;--时钟控制;order:in std_logic_vector(15 downto 0);--指令输入;Pcin:in std_logic_vector(15 downto 0);--pc输入;datain:in std_logic_vector(15 downto 0);--需要回写的数据,包括跳转指令的PC??Pcback:out std_logic_vector(15 downto 0);--pc回写;Pcbacka: out std_logic;--pc回写允许;dataout:out std_logic_vector(7 downto 0);--回写数据输出;dataA:out std_logic);--回写允许;end WriteBack;architecture Behavioral of WriteBack isbeginprocess(k4,order,Pcin,datain)beginif k4='1' thencase order(15 downto 11) iswhen "00000" =>--mov Ri,ImPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "00001" =>--LDAPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "00010"=>--STAPcbacka<='1';Pcback<=Pcin+1;dataA<='0';when "00011"=>--mov Ri,RjPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "00100"=>--mov Ri,(Rj)Pcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "00101"=>--mov Ri,[R7//R6+x] Pcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "00110"=>--Adc Ri,ImPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "00111"=>--Adc,Ri,RjPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01000"=>--Sbb,Ri,RjPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01001"=>--Sbb RI,ImPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01010"=>--AND Ri,ImPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01011"=>--And Ri,RjPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01100"=>--Or Ri,ImPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01101"=>--Or,Ri,RjPcbacka<='1';Pcback<=Pcin+1;dataA<='1';dataout<=datain(7 downto 0);when "01110"=>--ClcPcbacka<='1';Pcback<=Pcin+1;dataA<='0';when "01111"=>--STCPcbacka<='1';Pcback<=Pcin+1;dataA<='0';when "10000"=>--Jmp AddrPcbacka<='1';Pcback<=datain+1;dataA<='0';when "10001"=>--Jz signPcbacka<='1';Pcback<=datain+1;dataA<='0';when "10010"=>--Jc signPcbacka<='1';Pcback<=datain+1;dataA<='0';when others=>NULL;end case;elsePcbacka<='0';dataA<='0';end if;end process;end Behavioral;元件例化entity CPU_main isport(RST:in std_logic;CLK:in std_logic;ABUS:out std_logic_vector(15 downto 0);DBUS:inout std_logic_vector(15 downto 0);nMREQ:out std_logic;nRD:out std_logic;nWR:out std_logic;nBHE:out std_logic;nBLE:out std_logic;nABUS:out std_logic_vector(15 downto 0);nDBUS:out std_logic_vector(15 downto 0);IR:out std_logic_vector(15 downto 0);Ti:out std_logic_vector(3 downto 0);CS:OUT STD_LOGIC;WR:OUT STD_LOGIC;RD:OUT STD_LOGIC;BH:OUT STD_LOGIC;BL:OUT STD_LOGIC);end CPU_main;architecture Behavioral of CPU_main iscomponent CPU_Momery isport(k3 : in STD_LOGIC;--时钟控制;order : in STD_LOGIC_VECTOR (15 downto 0);--命令输入;alu : in STD_LOGIC_VECTOR (15 downto 0);--计算结果输??;datain : in STD_LOGIC_VECTOR (7 downto 0);--从内存读入的??;dataout: out STD_LOGIC_VECTOR (7 downto 0);--存入内存的数;Rtmp:out STD_LOGIC_VECTOR (15 downto 0);--数据输出;送向回写模块;sta : out STD_LOGIC;--存数控制;高电平有效;lda : out STD_LOGIC);--取数控制;高电平有效??end component;component CPU_ToMomer y isport(sta : in STD_LOGIC;--存数指令;lda : in STD_LOGIC;--取数指令;Addr: in STD_LOGIC_VECTOR(15 downto 0);--内存地址;flag: in STD_LOGIC;--取指标志;PCaddr: in STD_LOGIC_VECTOR(15 downto 0);--指令地址输入;orderout:out STD_LOGIC_VECTOR(15 downto 0);--指令输出;dataout : out STD_LOGIC_VECTOR (7 downto 0);--从内存中取出的数;datain : in STD_LOGIC_VECTOR (7 downto 0);--需要存入内存的数;ABUS : out STD_LOGIC_VECTOR(15 downto 0);--地址总线??DBUS : inout STD_LOGIC_VECTOR(15 downto 0);--数据总线;CS: out STD_LOGIC;--片选信号;低电平有效;RD: out STD_LOGIC;--读信号;低电平有效;WR: OUT STD_LOGIC; --写信号;低电平有????nBHE:out std_logic;nBLE:out std_logic);end component;component CPU_operation isport(k2 : in STD_LOGIC;--时钟控制;k3 : in STD_LOGIC;--时钟控制;第三个时钟高电平改变标志寄存器的值;order : in STD_LOGIC_VECTOR (15 downto 0);--命令输入;Pcin:in STD_LOGIC_VECTOR(15 downto 0);--pc输入;Rst:in STD_LOGIC;--复??;Rwb : in STD_LOGIC_VECTOR (7 downto 0);--回写数据;Rwba : in STD_LOGIC;--回?丛市???高电平有效Aluout : out STD_LOGIC_VECTOR (15 downto 0);--计算结果输出;addr : out STD_LOGIC_VECTOR (15 downto 0)--内存?刂???);end component;component WriteBack isport(k4: in std_logic;--时钟控制;order:in std_logic_vector(15 downto 0);--指令输入;Pcin:in std_logic_vector(15 downto 0);--pc输入;datain:in std_logic_vector(15 downto 0);--需要回写的数据,包括跳转指令的PC??Pcback:out std_logic_vector(15 downto 0);--pc回写;Pcbacka: out std_logic;--pc回写允许;dataout:out std_logic_vector(7 downto 0);--回写数据输出;dataA:out std_logic--回写允许;);end component;component irget isport(Rst : in STD_LOGIC;--复位;Pcback : in STD_LOGIC_VECTOR (15 downto 0);--PC回写;Pcbacka : in STD_LOGIC;--PC回写允许;k1 : in STD_LOGIC;--时钟控制;Order : in STD_LOGIC_VECTOR (15 downto 0);--指令Pcout : out STD_LOGIC_VECTOR (15 downto 0);--PC输出;Orderout : out STD_LOGIC_VECTOR (15 downto 0);--指令输出;AddrFlag : out STD_LOGIC--访址标志);end component;component clk_ctrl isport(Clk:in std_logic;Rst:in std_logic;k:out std_logic_vector(3 downto 0));end component;signal a,b,c,d,e:std_logic;signal t:std_logic_vector(3 downto 0);signal data7,data8,data9:std_logic_vector(7 downto 0);signal data1,data2,data3,data4,data5,data6,data10,data11,data12:std_logic_vector(15 downto 0); signal u,v,w,x,y:std_logic;begin--irget:--data1:回写的pc;--data2:指令输入;--data3: pc输出;--data4:指令输出??--a:PC回写允许;--b:访??标志;--operation:--data9:回写数据;--data5:Aluout--data6:Addr输出;--memory:--data7:从内存读入的数;--data8:存入内存??;--data10:送往回写模块的数;--c:存数控制--d:取数控制,送? 么???块--ToMemory:--ABUS,DBUS--CS RD WR;--writeback:--e回写数据允许;--a回写pc允许;u1: clk_ctrl port map(CLK, RST, t);u2: irget port map(RST, data1, a, t(0), data2, data3, data4, b);u3: CPU_operation port map(t(1),t(2),data4,data3,Rst,data9,e,data5,data6);u4: CPU_Momery port map(t(2),data4,data5,data7,data8,data10,c,d);u5: CPU_ToMomery port map(c,d,data6,b,data3,data2,data7,data8,data11,DBUS,u,v,w,x,y);u6: WriteBack port map(t(3),data4,data3,data10,data1,a,data9,e);IR<=data2;Ti<=t;nMREQ<=u;CS<=u;nRD<=v;RD<=v;WR<=w;nWR<=w;BH<=x;nBHE<=x;BL<=y;nBLE<=y;ABUS<=data11; nABUS<=data11;nDBUS<=DBUS;end Behavioral;。

相关文档
最新文档