您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > VHDL实现简单的8位CPU
VHDL实现简单的8位CPU设计者:E-MAIL:huyugv_830913@163.com61IC中国电子在线具有的功能:能完成一些简单的指令MOVAX,ADDRESS4--将address4中的内容赋给AX寄存器(在8086/8088汇编语言中称这种寻址方式为直接寻址方式)ADDAX,ADDRESS4--将address4中的内容加到AX寄存器中SUBAX,ADDRESS4--用address4中的内容减去AX寄存器中的内容OUT--输出AX寄存器中的内容HLT--CPU停止运行CPU工作的时序图:S0状态:程序计数器(PC)将值赋给MARS1状态:PC=PC+1注意:因为在设计状态机时引入了复位键(RST),为了避免一个信号有多个源,因而将时序进程(REG:PROCESS)和组合进程(COM:PROCESS)合二为一。但是产生了一个比较麻烦的事情--------------即一个状态占用了两个时钟周期。所以在设计PC=PC+1时,引入了标志寄存器(FLAG),以确保在S1状态PC只加一次S2状态:从只读存储器(ROM)中读取汇编指令,并且将赋给指令寄存器(IR)IR=DATABUS------------------------------------------------------------------------------------------------------------------------------------------------从S0-S2状态每条指令的执行都是相同的S3状态:取出指令寄存器的高4位(汇编的指令代码)进行译码if(temp=0000)or(temp=0001)or(temp=0010)thenmar=ir(3downto0);--将数据存储的地址赋给MARelsiftemp=1110thenoutput_data=ax;--outoverelsiftemp=1111thenrun='0';--Hltoverendif;有上面的程序可以看出,当指令是MOV、ADD、SUB中的一个时,取出地址当指令是OUT时将累加器中的值输出,该条指令做完当指令是HLT(1111)时,程序停止运行,该条指令做完S4状态:iftemp=0000then--MOVAX,dataoverax=dataBus;elsiftemp=0001then--ADDax,databx=databus;f1='1';elsiftemp=0010then--SUBax,bxbx=databus;f1='1';endif;读出RAM中的内容(在此设计中,用ROM代替了RAM)在此状态MOV指令结束S5状态:为计算状态iftemp=0001andf1='1'thenax=ax+bx;f1='0';elsiftemp=0010andf1='1'thenax=ax-bx;f1='0';endif;当指令是ADD(0001)时,AX=AX+BX当指令是SUB(0010)时,AX=AX-BX此图为Modelsimse6.0的功能仿真图(结果为62=(10+20+1)×2注:×2用SHL指令实现因为其目的寄存器为Ax所以实现方法同OUT、HLT请读者自己实现)源程序:ROM16_4.VHD--//////////////////////////////////////////////////////////--16*8ROM--CE=0时允许读--huyugui--2005,1,28--//////////////////////////////////////////////////////////libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityrom16_8isport(addr:instd_logic_vector(3downto0);ce:instd_logic;dataout:outstd_logic_vector(7downto0));endentityrom16_8;architecturebehaveofrom16_8isbegin--10+20+60-10=80hdataout=00001001whenaddr=0000andce='0'else--movax,9h00011010whenaddr=0001andce='0'else--addax,ah00011011whenaddr=0010andce='0'else--addax,bh00101100whenaddr=0011andce='0'else--subax,ch11100000whenaddr=0100andce='0'else--out11110000whenaddr=0101andce='0'else--hlt00000000whenaddr=0110andce='0'else00000000whenaddr=0111andce='0'else00000000whenaddr=1000andce='0'else00010000whenaddr=1001andce='0'else--10h00100000whenaddr=1010andce='0'else--20h01100000whenaddr=1011andce='0'else--60h00010000whenaddr=1100andce='0'else--10h00000000whenaddr=1101andce='0'else00000000whenaddr=1110andce='0'else00000000whenaddr=1111andce='0'else11111111;endarchitecturebehave;CPU_CONTROL.VHD--/////////////////////////////////////////////////////////////////////////////--8_CPU--movax,address/addax,address/subax,address/out/hlt--说明:address为4位的地址(9H-fH)--完善:每个状态为一个时钟周期,这样的话PC=PC+1在S1状态将只做一次,时钟将--得到很大的改善--设计者:胡玉贵--时间:2005,1,29A--/////////////////////////////////////////////////////////////////////////////libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitycpu_controlisport(clk:instd_logic;rst:instd_logic;output_data,databus_out:outstd_logic_vector(7downto0));endentitycpu_control;architecturebehaveofcpu_controliscomponentrom16_8isport(addr:instd_logic_vector(3downto0);ce:instd_logic;dataout:outstd_logic_vector(7downto0));endcomponentrom16_8;typestatesis(s0,s1,s2,s3,s4,s5);signalcurrent_state,next_state:states;signalflag:std_logic;signalpc,addrbus:std_logic_vector(3downto0);signalax,bx:std_logic_vector(7downto0);--Ax,Bxsignalcs:std_logic;signaldatabus:std_logic_vector(7downto0);signalrun:std_logic;signalmar:std_logic_vector(3downto0);signalir:std_logic_vector(7downto0);signalf1:std_logic;beginreg:processvariabletemp:std_logic_vector(3downto0);beginifrst='1'then--系统复位pc=0000;ax=00000000;bx=00000000;run='1';flag='1';--PC可以加1f1='1';current_state=s0;--databus=00000000;elsifrising_edge(clk)thenifrun='1'thencasecurrent_stateiswhens0=next_state=s1;--AddressState&Fetchmar=pc;--将PC的值赋给MAR,在S2状态时从ROM中读出指令(IR=databus)whens1=next_state=s2;ifflag='1'thenpc=pc+1;--地址加1flag='0';endif;whens2=next_state=s3;flag='1';ir=databus;--将ROM中的指令赋给IR(指令寄存器)whens3=next_state=s4;temp:=ir(7downto4);--取指令寄存器的高4位(指令代码MOV0000,ADD0001,SUB0010)--MovAddSubif(temp=0000)or(temp=0001)or(temp=0010)thenmar=ir(3downto0);--将数据存储的地址赋给MARelsiftemp=1110thenoutput_data=ax;--outoverelsiftemp=1111thenrun='0';--Hltoverendif;whens4=next_state=s5;--在S4状态,将从数据总线上读取数据iftemp=0000then--MOVAX,dataoverax=dataBus;elsiftemp=0001then--ADDax,databx=databus;f1='1';elsiftemp=0010then--SUBax,bxbx=databus;f1='1';endif;whens5=next_state=s0;iftemp=0001andf1='1'thenax=ax+bx;f1='0';elsiftemp=0010andf1='1'thenax=ax-bx;f1='0';endif;endcase;current_state=next_state;--此设计使每个状态为两个时钟周期(Attention!!!!)endif;endif;endprocessreg;u1:rom16_8portmap(addrbus,cs,databus);addrbus=marwhen(current_state=s2)or(current_state=s4)else0000;cs='0'when(current_state=s2)or(current_state=s4)else'1';databus_out=databus;endarchitecturebehave;参考书目:微机原理及应用第3章:清华大学出版社VHDL和数字电路设计:科学出版社VHDL实用教程:电子科技大出版社
本文标题:VHDL实现简单的8位CPU
链接地址:https://www.777doc.com/doc-1871292 .html