EDA实验_简单微处理器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XXXX大学计算机科学学院
实验/上机报告
一、实验目的
1、通过简单微处理器的设计,理解可编程逻辑系统设计中的自顶向下设计思想;
2、进一步巩固利用状态机实现同步时序系统的知识;
二、实验环境
硬件:PC机、便携式EDA/SOPCDSP实验系统
软件:Quartus II 7.0 开发系统
三、实验内容
完成简单微处理器设计;
四、实验过程
设计思想:
分析CPU工作原理,可得如下运行流程:
程序计数器PC到数据总线,通过总线到地址寄存器MAR →MAR将PC传过来的数据信息送到只读内存ROM(在具体实验中用RAM、MDR表示)→ROM通过总线将地址送入指令寄存器IR →IR将操作码送入控制器,同时再将指令地址信息送入总线,通过数据总线将指令地址信息再次送入MAR →MAR再将信息送入ROM,ROM通过总线将地址信息送入寄存器A和B →A、B再送入逻辑运算元件,通过ALU运算后将结果通过总线送入寄存器A →A再将结果通过总线送入输出接口
因此,可将CPU模型分为ALU、CONC、MAR、RAM、MDR、IR、PC、ACC等八个模块,其中CONC为CPU模块核心,通过ASM图对CONC进行状态确定,如下所示:
根据ASM状态转换图,可确定状态S0、S1、S2、S3、S4、S5、S6、S7、S8等九个状态,对各部分模块进行具体设计。
实验步骤:
1、ALU设计:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
ENTITY alu IS
PORT ( clk,add,sub:in std_logic;
a:in std_logic_vector(7 downto 0);
b:in std_logic_vector(7 downto 0);
c:out std_logic_vector(7 downto 0)
);
END alu;
ARCHITECTURE behave OF alu IS
begin
process(clk)
begin
if rising_edge(clk) then
if(add='1')then c<=a+b;
elsif(sub='1')then c<=a-b;
end if;
end if;
end process;
end behave;
2、CONC设计:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
ENTITY conc IS
PORT ( clk,rst: IN std_logic;
op: IN std_logic_vector(1 downto 0);
pc_bus,load_pc,inc_pc,addr_bus:out std_logic;
load_ir,mdr_bus,load_mdr: out std_logic;
load_mar,cs,r_nw,alu_add,alu_sub,alu_acc,acc_bus,load_acc:out std_logic
);
END conc;
ARCHITECTURE behave OF conc IS
type states is (st0, st1, st2, st3, st4,st5,st6,st7,st8);
signal c_state, n_state: states;
begin
REG: process (clk)
begin
if rising_edge(clk) then c_state<=n_state;
end if;
end process REG;
COM: process(c_state,clk)
begin
if (rst='1')then
pc_bus<='0';load_pc<='0';inc_pc<='0';addr_bus<='0';load_ir<='0';md r_bus<='0';load_mdr<='0';
load_mar<='0';cs<='0';r_nw<='0';alu_add<='0';alu_sub<='0';alu_acc< ='0';acc_bus<='0';load_acc<='0';
else
case c_state is
when st0=>
pc_bus<='1';load_pc<='0';inc_pc<='1';addr_bus<='0';load_ir<='0';md r_bus<='0';load_mdr<='0';
load_mar<='1';cs<='0';r_nw<='0';alu_add<='0';alu_sub<='0';alu_acc< ='0';acc_bus<='0';load_acc<='0';
n_state<=st1;
when st1=>
pc_bus<='0';load_pc<='0';inc_pc<='0';addr_bus<='0';load_ir<='0';md r_bus<='0';load_mdr<='0';
load_mar<='0';cs<='1';r_nw<='1';alu_add<='0';alu_sub<='0';alu_acc< ='0';acc_bus<='0';load_acc<='0';
n_state<=st2;
when st2=>
pc_bus<='0';load_pc<='0';inc_pc<='0';addr_bus<='0';load_ir<='1';md r_bus<='1';load_mdr<='0';
load_mar<='0';cs<='0';r_nw<='0';alu_add<='0';alu_sub<='0';alu_acc< ='0';acc_bus<='0';load_acc<='0';
n_state<=st3;
when st3=>
pc_bus<='0';load_pc<='0';inc_pc<='0';addr_bus<='1';load_ir<='0';md