数字电路实现简单CPU

数字电路实现简单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&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值