数字电路实现简单CPU
一、设计目的
贯彻以CPU设计为核心,以层次化、模块化设计方法为抓手的组织思路,培养学生设计与实现数字系统的能力。本设计要求在进行了多个单元实验后,综合利用所学的理论知识,并结合在单元实验中所积累的成果(包括已经设计好的功能部件和调试方法),设计出一个简易计算机系统。
二、设计内容
按给定的数据格式和指令系统,使用EDA工具设计一台用硬连线逻辑控制的简易计算机系统;要求灵活运用各方面知识,使得所设计的计算机系统具有较佳的性能;对所做设计的性能指标进行分析,整理出设计报告。
1、数据格式
数据字采用8位二进制定点补码表示,其中最高位(第7位)为符号位,小数点可视为最左或最右,其数值表示范围分别为:-1≤X<1或-128≤X<127。
2、寻址方式
指令的高4位为操作码,低4 位分别用2位表示目的寄存器和源寄存器的编号,或表示寻址方式。本机有2种寻址方式。
(1) 寄存器直接寻址
当R1和R2均不是“11”时,R1和R2分别表示两个操作数所在的寄存器地址,R1为目标寄存器地址,R2为源寄存器。
地址R1或R2的值 | 指定的寄存器 |
---|---|
00 | A寄存器 |
01 | B寄存器 |
10 | C寄存器 |
(2) 寄存器间接寻址
当R1或R2中有一个为“11”时,表示相应操作数的地址在C寄存器中,操作数在RAM
3.数据通路
4.指令系统
三、 详细设计
3.1设计的整体架构
3.2各模块的具体实现
1.8位PC计数器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PC_8 is
port(CLK:in std_logic;
IN_PC:in std_logic;
LD_PC:in std_logic;
PC_DATA:in std_logic_vector(7 downto 0);
OUT_PC:out std_logic_vector(7 downto 0));
end PC_8;
architecture test of PC_8 is
signal temp:std_logic_vector(7 downto 0);
begin
process(PC_DATA,CLK,IN_PC,LD_PC)
begin
if((CLK'event and CLK='1')and(IN_PC='1')and(LD_PC='0')) then
temp<=temp+"00000001";
elsif((CLK'event and CLK='1')and(IN_PC='0')and(LD_PC='1')) then
temp<=PC_DATA;
end if;
end process;
OUT_PC<=temp;
end test;
本模块用于对指令进行计数,并用于自增递进与赋地址给RAM。PC_DATA用于接受外部输入地址,IN_PC用于自增,LD_PC表接受外部输入,在上升沿进行操作
2.srg_3_8寄存器组
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity srg_3_8 is
port(CLK,WE:in std_logic;
RAA1,RAA2,RWBA1,RWBA2:in std_logic;
I:in std_logic_vector(7 downto 0);
AO,BO:out std_logic_vector(7 downto 0));
end srg_3_8;
architecture test of srg_3_8 is
signal A:std_logic_vector(7 downto 0):="00000001";
signal B:std_logic_vector(7 downto 0):="00000010";
signal C:std_logic_vector(7 downto 0):="00000100";
begin
process(A,B,C,RAA1,RAA2,RWBA1,RWBA2)
begin
if(WE='1') then
if(RAA1='0' and RAA2='0') then
AO<=A;
elsif(RAA1='0' and RAA2='1') then
AO<=B;
elsif(RAA1='1' and RAA2='0') then
AO<=C;
end if;
if(RWBA1='0' and RWBA2='0') then
BO<=A;
elsif(RWBA1='0' and RWBA2='1') then
BO<=B;
elsif(RWBA1='1') then--if rwba=0,ALU,else MOVc
BO<=C;
end if;
elsif(WE='0' and (CLK'event and CLK='0')) then
if(RWBA1&#