精简8位cpu实验设计报告实验介绍:实验分为两个部分,第一部分为16*8 ROM 设计与仿真第二部分为SAP-1 设计与仿真实验流程:①16*8 ROM 的设计与仿真Rom16_8.VHDLLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ROM16_8 isPORT(DATAOUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --Data OutputADDR :IN STD_LOGIC_VECTOR(3 DOWNTO 0); --ADDRESSCE :IN STD_LOGIC --Chip Enable);END ROM16_8;ARCHITECTURE a OF ROM 16_8 ISBEGINDATA<=“00001001”WHEN ADDR=“0000”AND CE=‘0’--LDA 9H “00011010”WHEN ADDR=“0001”AND CE=‘0’ELSE --ADD AH“00011011”WHEN ADDR=“0010”AND CE=‘0’ELSE --ADD BH“00101100”WHEN ADDR=“0011”AND CE=‘0’ELSE --SUB CH“11100000”WHEN ADDR=“0100”AND CE=‘0’ELSE --OUT“11110000”WHEN ADDR=“0101”AND CE=‘0’ELSE --HLT“00010000”WHEN ADDR=“1001”AND CE=‘0’ELSE“00010100”WHEN ADDR=“1010”AND CE=‘0’ELSE“00011000”WHEN ADDR=“1011”AND CE=‘0’ELSE“00100000”WHEN ADDR=“1100”AND CE=‘0’ELSE“00000000”;END a;程序说明:rom的使能CE,只有为0时,才接受读数据的命令。
②SAP-1 CPU设计与仿真工作任务:1.取指令周期(Fetch Cycle)(1)状态S0:(寻址状态, Address State)这个状态下,“程序计数器”负责将所要执行的指令地址值传递至MAR 存放。
(2)状态S2:(增加状态,Increment State)这个状态下,“程序计数器”的值加1,代表计数器将指针指向下一个要执行的指令地址值。
(3)状态S2:(记忆状态,Memory State)这个状态下,将把记录在“MAR”里的指令地址值,送入“RAM”里后,由“RAM”读出该地址的指令码,再将该指令放入“指令寄存器”。
指令执行周期:(1)LDA指令状态S3:这个状态下,上述的09H数据传入MAR,以便下个状态能取出该数值所代表的地址里的值,比如20H。
状态S4:这个状态是将存放在“MAR”里的09数据,通过RAM读出09H地址的数据,比如是数值20H数值至“累加器”。
状态S5:这个状态下的LDA指令并没有作用。
(2)ADD指令状态S3:这个状态下,上述的AH数据将传入MAR,以便下个状态取出该数值所代表地址里的内容值,比如是数值14H。
状态S4:这个状态是将存放“MAR”里的AH数据,通过RAM读出AH地址内的数据,放到B寄存器中。
状态S5:这个状态是将存在“累加器”和“B 寄存器”的数值内容存放入“加减法器”相加后,再将相加结果放回“累加器”。
(3)SUB指令状态S3:这个状态下,上述的BH数据传入MAR,以便下个状态能取出该数值所代表地址里的值。
状态S4:这个状态是将存放在“MAR”的BH数据,通过RAM读出BH地址内的数据,并放到B寄存器中。
状态S5:这个状态是将存放在“累加器”和“B寄存器”的数值放入“加减法器”相减后,再将相减后结果放回“累加器”。
(4)OUT指令状态S3:这个状态下,累加器的内容将经Wbus传至“输出寄存器”,然后显示在二进制显示装置。
状态S4:这个状态OUT指令没有作用。
状态S5:这个状态OUT指令没有作用。
(5)HLT指令状态S3:这个状态下“控制器/序列发生器”将停止送出脉冲信号CLK,这时SAP-1 CPU会停止执行工作。
状态S4:这个状态HLT指令没有作用。
状态S5:这个状态HLT指令没有作用。
③SAP-1 CPU 设计1.使用Process与Case When命令架构出6个脉冲的指令周期。
ARCHITECTURE a OF SAP1 IS……TYPE STATE IS (S0,S1,S2,S3,S4,S5); --state type declareSIGNAL PState :STATE; --present stateSIGNAL NState :STATE; --next state……BEGINChangeStateMode:PROCESS(CR,RST) --state s0~s5BEGINIF RST=‘1’THEN --reset cpuPC <=“0000”; --pogram counter=0HACC<=”0000000”; --accumulator=0HRUN<=‘1’; --CPU run program enablePState<=S0; --Initial cpu present state ELSIF CP’EVENT AND CP =‘0’THEN --clock negative edageIF RUN =‘1’THEN --run program eanble?CASE PState IS --check cpu present stateWHEN S0=> --(address state & fetch cycle-1)NState<=S1; --cpu next stateWHEN S1=> --(increment state & fetch cycle-2)NState<=S2; --cpu next stateWHEN S2=> --(memory state & fetch cycle-3)NState<=S3; --cpu next stateWHEN S3=> --STATE S3 (Execution cycle -1)NState<=S4; --cpu next stateWHEN S4=> --STATE S4 (Execution cycle-2)NState<=S5; --cpu next stateWHEN S5=> --STATE S5 (Execution cycle-3)NState<=S0; --cpu next stateEND CASE;PState<=NState; --切换状态END IF;END IF;END PROCESS ChangeStateMode;END a;2.编写“指令捕捉周期(fetch cycle)即状态S0~S2的命令Changestatemode:process(cp,rst) --state s0~s5variable flag,f1:boolean;beginif rst =‘1’then……Pstate<=s0;flag:=ture; ---PC指针允许加1标志打开elsif cp’event and cp=‘0’thenif run=‘1’thencase pstate iswhen so =>nstate<=s1;mar<=std_logic_vector(pc);when s1=>nstate <=s2;if flag=ture thenpc <=pc+1;flag:=false;end if;when s2=>nstate <=s3;flag :ture;Ir<=databus;when s3=>……end case;……3.编写”指令执行周期(fetch cycle)”,即状态S3~S5的命令(IR)截取高4位指令至TMP里……Elsif cp’event and cp=‘0’then……when s2=>……When s3=>nstate<=s4;temp<=ir(7 downto 4);when s4=>……changestatemode : process(cp,rst)variable flag, F1:boolean;BeginIf rst =‘1’then……Elsif cp’event and cp=‘0’thenIf run=‘1’thencase pstate iswhen s0=>nstate<=s1;……end case;pstate<=nstate;End if;If pstate =s3 thenIf(tmp=“0000”)or(tmp=“0001”)or(tmp=“0010”)then Mar<=ir(3 downto 0);elsif tmp =“1110”thenoutreg<=acc;elsif tmp =“1111”thenrun<=‘0’;End ifElsif pstate=s4 thenif tmp=“0000”thenacc<=databus;elsif tmp=“0001”thenbreg<=databus;elsif tmp=“0010”thenbreg<=databus;end if;Elsif pstate=s5 thenif tmp =“0001”and f1=ture thenNum <=unsigned(acc)+unsigend(breg);Acc <=std_logic_vector(num);F1:=false;Elsif tmp=“0010”and f1 =true thennum <=unsigned(acc)-unsigned(breg);Acc<=std_logic_vector(num);F1:false;End if;End if;End if;End process changestatemode;④编译、功能仿真。