简单微处理器设计实验报告.docx
《简单微处理器设计实验报告.docx》由会员分享,可在线阅读,更多相关《简单微处理器设计实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
简单微处理器设计实验报告
表目录
表1ALU8模块I/O接口
表2通用寄存器堆模块I/O接口
表3alupart输入输出I/O口列表
表4控制器模块I/O接口
表5IRRAM模块I/O接口
表6Control-part结构整体I/O接口
表7CPU整体模块I/O接口
表8ALU指令集
表9添加的JUMP指令
图目录
图1ALU8模块框图
图2通用寄存器RAM模块框图
图3ALUpart模块框图
图4控制器模块框图
图5IRRAM模块框图
图6Control-part结构框图
图7CPU结构框图
图8ALUpart状态转移图
图9controlpart状态转移图
图10CPU计算5!
的全图
图11controllpart执行一条指令的波形图
图12control执行非跳转指令的状态机波形
图13control执行跳转指令的状态机波形
图14ALUpart执行一条指令的波形图
图15ALUpart执行指令状态机的波形
图16综合的Timingreport
图17综合的Areareport
图18门级仿真5!
的波形结果
图19门级仿真产生的延时
1文档说明(Introduction)
本文档描述了简单微处理器的总体设计,如功能、模块结构、关键时序等等。
本设计参照了课程设计文档的系统原理框图和功能列表,根据需求作了一些改动,将累加器A合并到ALU单元中,将寄存器Rn合并到通用寄存器RAM(8*8)中;将程序计数器和指令寄存器合并到控制模块controller中等。
指令方面,添加了Acc非零时跳转指令JNZ。
2描述习惯(Conventions)
在文档写作中黑色字体表明已经确定的内容,尚未完全确定的内容以蓝色字体表示,有疑问或需要醒目标示的内容则以红色字体表示。
代码方面,使能信号习惯采用低电平有效。
3微处理器各功能模块
3.1概述
8位微处理器的硬件系统主要包括运算器ALU、控制器CON、指令存储器IRRAM(64*8)、通用寄存器堆RAM(8*8)等逻辑部件。
能够通过控制器读取指令集,对8位数据进行运算和操作。
本次设计有独立的控制模块和运算模块,通用寄存器堆合并到ALU模块中,IRRAM合并到CON控制模块中。
仿真周期采用10ns。
微处理器的指令系统通过指令码实现,根据其格式的不同,可分为算术、逻辑、数据转移、跳转指令等。
在功能列表部分将做详细介绍。
本次课程设计实现了阶乘5!
以验证处理器的运算类指令。
已成功实现RTL级设计、功能仿真、综合、门及仿真。
3.2结构框图
3.2.1ALUpart
图1ALU8模块框图
ALU模块是运算模块,有3个状态,从controller中读取数据和使能信号等,根据选通信号op判断当前要进行的指令操作。
先读取Rn_rd和reg_add,状态并不跳转,等待直到data_le低有效,读取到立即数data时,状态跳转到运算状态,再通过case语句进行相应运算操作。
表1ALU8模块I/O接口
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
Rn_rd
1
I
读Rn使能信号,低有效
Reg_add
3
I
Rn在RAM中的地址
Rn
8
I
寄存器,暂存中间运算数据
Rn_wr
1
O
写使能信号,低有效
op
4
I
运算功能选择信号
data
8
I
立即数
data_le
1
I
读立即数使能信号,低有效
busy
1
O
ALU8忙,低有效
carry
1
O
进位信号,carry=1时JCaddr
Acc
8
O
运算器结果
通用寄存器堆RAM(8*8),储存中间数据Rn,结构框图:
图2通用寄存器RAM模块框图
下表为输入输出接口:
表2通用寄存器堆模块I/O接口
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
Rn_rd
1
I
读Rn使能信号,低有效
Reg_add
3
I
要操作的操作数Rn在RAM中的地址
Rn
8
O
寄存器,暂存中间运算数据
Rn_wr
1
I
写使能信号,低有效
Acc
8
I
运算器运算结果
图3ALUpart模块框图
Alu8和RAMn_array两个模块组成ALUpart部分。
两个模块通过Rn_wr信号,Rn和A进行交互。
当需要进行读操作时,在外部(相对于alupart模块)使能信号Rn_rd下,alu通过地址Rn_addr读取出需要的Rn;当需要进行写操作时,alu8使信号Rn_wr低有效,再经过一个周期,将当前中间运算结果A写入到地址Rn_addr对应的Rn中去。
ALU8模块中包含了16种运算(不包含跳转),也包含了累加功能块A,从controlpart读取选通信号op和数据data,从RAMn_array读取Rn。
RAM(8*8)中存放Rn,通过control的使能Rn_rd,经地址Rn_addr[2..0]将数据读到ALU8中去,利用ALU8给的Rn_wr信号将A写到RAM(8*8)中去。
表3alupart输入输出I/O口列表
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
Rn_rd
1
I
读Rn使能信号,低有效
Reg_add
3
I
Rn在RAM中的地址
op
4
I
运算功能选择信号
data
8
I
立即数
data_le
1
I
读立即数使能信号,低有效
busy
1
O
ALU8忙,低有效
carry
1
O
进位信号,carry=1时JCaddr
Acc
8
O
运算器结果
3.2.2controlpart
控制器controller结构框图:
图4控制器模块框图
控制器是整个设计中关键的模块,本课程设计中控制器包含了用信号形式表示的IR寄存器和程序计数器。
控制器从ALU模块中读取Acc用于判断零跳转JZ和非零跳转JNZ,读取carry用于判断进位跳转JC,读取busy即alu_free用于判断alu正处于空闲状态,握手信号使时序正确。
同时,控制器给ALUpart提供data,data_le,reg_add(Rn_add),reg_add_le(Rn_le),op等信号。
控制器与指令寄存器通过IR_le,IR,IRRAM_add进行交互。
用程序计数器counter来计量IRRAM_add,当IR_le低有效时,用IRR暂存读取的IRRAM_add地址上的指令IR,不同时刻IR代表指令op、Rn_reg或者数据data。
表4控制器模块I/O接口
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
IR
8
I
程序输入
IR_le
1
I
读入指令使能
IRRAM_add
6
O
指令寄存器IRRAM地址
Rn_rd
1
O
读Rn使能信号,低有效
Reg_add
3
O
Rn在RAM中的地址
op
4
O
运算功能选择信号
data
8
O
立即数
data_le
1
O
读立即数使能信号,低有效
alu_free
1
I
ALU单元空闲,低有效
carry
1
I
进位信号,carry=1时JCaddr
Acc
8
I
运算器结果
指令存储器IRRAM(64*8)结构框图:
图5IRRAM模块框图
在本课程设计中,IRRAM预先存储着要操作的指令代码,也包括数据。
将在典型代码分析中详细说明。
表5IRRAM模块I/O接口
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
IR
8
O
程序输入
le(IR_le)
1
O
读指令使能
add(IRRAM_add)
6
I
指令寄存器IRRAM地址
图6Control-part结构框图
表6Control-part结构整体I/O接口
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
Rn_rd
1
O
读Rn使能信号,低有效
Reg_add
3
O
Rn在RAM中的地址
op
4
O
运算功能选择信号
data
8
O
立即数
data_le
1
O
读立即数使能信号,低有效
alu_free
1
I
ALU单元空闲,低有效
carry
1
I
进位信号,carry=1时JCaddr
Acc
8
I
运算器结果
3.2.3CPU
CPU整体结构框图:
图7CPU结构框图
表7CPU整体模块I/O接口
SIGNAL
BITS
I/O
SIGNALDESCRIPTION
clk
1
I
时钟信号
rst
1
I
复位信号
Acc
8
O
输出结果
由于时间仓促,本次课设没有做汇编器和I/O界面输入,程序指令已预先存储到IRRAM中。
只需时钟clk和复位信号rst经仿真即可得到运算结果。
3.3功能列表
3.3.1ALUpart
表8ALU指令集
指令
op
功能描述
算术指令
ADDA,Rn
0001
把Rn的值加到A上
ADDA,#data
0010
把立即数的值加到A上
ADDCA,Rn
0011
连同进位一起把Rn的值加到A上
SUBBA,Rn
0100
连同借位一起从A中减去寄存器的值
SUBBA,#data
0101
连同借位一起从A中减去立即数的值
逻辑运算指令
ANLA,Rn
0110
Rn对A进行逻辑与运算
ANLA,#data
0111
立即数对A进行逻辑与运算
ORLA,Rn
1000
Rn对A进行逻辑或操作
ORLA,#data
1001
立即数对A进行逻辑或操作
XRLA,Rn
1010
Rn对A进行逻辑异或操作
XRLA,#data
1011
立即数对A进行逻辑异或操作
CLRA
1100
清空A的值
CPLA
1101
对A的值取反
数据传输指令
MOVA,Rn
1110
把Rn的值传输给A
MOVA,#data
1111
把立即数传输给A
MOVRn,A
0000
把A传输给Rn寄存器
指令操作中涉及到Rn的需要对RAMn_array进行读或者写操作,读操作需要提前写好Rn的值,写操作需要经过两个周期(Rn_wr置低到RAMn_array在Rn_wr使能下读入A进行写操作各需一个周期)的才能实现。
涉及data的可直接在本周期完成。
正常情况下指令的顺序是,控制器在第一个周期先给ALU模块op和Rn_addr,第二个周期等待ALU接受数据,第三个周期给出data和data_le,因此Rn有足够的时间提前准备好。
图8ALUpart状态转移图
Alu模块设定了3个状态:
空闲状态00,用于接收数据,当Rn_le低有效时读入Rn_add,不跳转,当data_le低有效时状态跳转到01。
状态01为运算状态,根据op判断将要进行的运算,从RAMn_array中读取数据,或者写入A,或者用输入的data对A进行操作。
状态01无条件跳转到状态10,因为01中的运算操作在一个周期内即可完成,10存在是给RAMn_array留一个周期进行写操作。
由于Acc结果需要即时改变,实现时用到一个中间信号A跟踪Acc。
与控制模块握手的busy信号在01状态即赋值为高,因为非阻塞赋值在下一时钟有效沿才实现,即10状态时busy为高,即alu不忙(可能忙的是RAMn_array),控制模块controller可以继续给alu操作信号。
3.3.2controlpart
3.3.2.1状态转移图
Con模块状态转移图如下,可见每个指令,控制部分最短只需4个周期。
状态000,为空闲状态,当IR_le='0'andAlu_free='0'时读入指令IR,在根据IR[7]来判断将要跳转的下一个状态。
当IR[7]='1'时,指令为jump类指令,状态由000跳转到001;当IR[7]='0'时,指令为数据操作类指令,状态由000跳转到010。
并且程序计数器加一,指令存储器中指针也指向下一条指令。
由于IRRAM中设定IR_le一直低有效,故跳转状态条件没有写出IR_le=’0’。
状态001和010纯是等待时间,没有操作。
这2个状态存在是在等待指令指向下一行,方便在下一个状态中读取指令中的数据或者跳转地址。
状态011是jumpstate,从IR中读取跳转地址,并让程序计数器指向下一条指令。
然后跳转到101等待进行下一条指令操作。
状态100是读数据data状态,000状态已将reg_add和op读取出来传给ALU,此时在100状态,将立即数data读出,传给ALU。
然后跳转到101等待ALU一个周期跳转到000,状态转到000后,若ALU尚未运算完毕(alu_free=’1’),则继续停留在idle状态。
图9controlpart状态转移图
下表为本课程设计中涉及到的jump指令,功能已将列出。
程序中用IR[7]来表征指令是否为跳转指令,1表示是跳转指令。
表9添加的JUMP指令
分支跳转指令
IR(7)&op
JMPaddr
10001
无条件跳转
JCaddr
10010
在进位carry=1的情况下跳转到地址
JZaddr
10011
在累加器ACC等于0的情况下跳转到地址
JNZaddr
10100
在累加器ACC不等于0的情况下跳转到地址
3.4工作环境介绍
3.4.1设计代码
/home/cas1098/CPUgate/controll.vhd
/home/cas1098/CPUgate/IRRAM.vhd
/home/cas1098/CPUgate/ControlPart.vhd
/home/cas1098/CPUgate/alu8.vhd
/home/cas1098/CPUgate/RAMn.vhd
/home/cas1098/CPUgate/alupart.vhd
/home/cas1098/CPUgate/CPU.vhd
3.4.2测试平台
/home/cas1098/CPUgate/tb.vhd--功能仿真与门级仿真的测试程序
测试CPU功能的n!
程序预先写进了IRRAM之内指令集程序如下
movedata=5toA
moveAtoR0
moveAtoR3
A=A-2
moveAtoR2
moveAtoR1
moveR3toA
A=A+R0;
moveAtoR3
moveR1toA
A=A-1
moveAtoR1
JNZto001100
moveR3toA
moveAtoR0
A=A-1
moveAtoR1
moveAtoR2
JNZto001100
moveR3toA
-jmp
机器指令如下
caseaddis
when"000000"=>IR<="01111000";--movedata=5toA
when"000001"=>IR<="00000101";
when"000010"=>IR<="00000000";--moveAtoR0
when"000011"=>IR<="00000000";
when"000100"=>IR<="00000011";--moveAtoR3
when"000101"=>IR<="00000000";
when"000110"=>IR<="00101000";--A=A-2
when"000111"=>IR<="00000010";
when"001000"=>IR<="00000010";--moveAtoR2
when"001001"=>IR<="00000000";
when"001010"=>IR<="00000001";--moveAtoR1
when"001011"=>IR<="00000000";
when"001100"=>IR<="01110011";--moveR3toA
when"001101"=>IR<="00000000";
when"001110"=>IR<="00011000";--A=A+R0;
when"001111"=>IR<="00000000";
when"010000"=>IR<="00000011";--moveAtoR3
when"010001"=>IR<="00000000";
when"010010"=>IR<="01110001";--moveR1toA
when"010011"=>IR<="00000000";
when"010100"=>IR<="00101000";--A=A-1
when"010101"=>IR<="00000001";
when"010110"=>IR<="00000001";--moveAtoR1
when"010111"=>IR<="00000000";
when"011000"=>IR<="10100000";--JNZto001100
when"011001"=>IR<="00110000";
when"011010"=>IR<="01110011";--moveR3toA
when"011011"=>IR<="00000000";
when"011100"=>IR<="00000000";--moveAtoR0
when"011101"=>IR<="00000000";
when"011110"=>IR<="01110010";--moveR2toA
when"011111"=>IR<="00000000";
when"100000"=>IR<="00101000";--A=A-1
when"100001"=>IR<="00000001";
when"100010"=>IR<="00000001";--moveAtoR1
when"100011"=>IR<="00000000";
when"100100"=>IR<="00000010";--moveAtoR2
when"100101"=>IR<="00000000";
when"100110"=>IR<="10100000";--JNZto001100
when"100111"=>IR<="00110000";
when"101000"=>IR<="01110011";--moveR3toA
when"101001"=>IR<="00000000";
when"101010"=>IR<="10001000";--jmptothisorderstable
when"101011"=>IR<="10101000";
whenothers=>IR<=x"ff";
endcase;
3.4.3电路综合环境
/home/ic/library/typical.db#综合需要的库文件
/home/cas1098/CPUgate/area.txt#综合出的面积报告
/home/cas1098/CPUgate/timing.txt#综合出的时间报告
/home/cas1098/CPUgate/cpugate.v#综合后产生的门级网表
/home/cas1098/CPUgate/cpupost.sdf#综合产生的sdf文件
/home/cas1098/CPUgate/CPU.db#综合产生的db文件
3.4.4后仿真环境
/home/cas1098/CPUgate/umc18/umc18.v#门级仿真需要的库文件
3.5功能验证结果
3.5.1前仿真结果
图10CPU计算5!
的全图
可以看到最后的输出的结果为ox78=120,正确的执行了5!
的指令。
完成了功能仿真。
图11controllpart执行一条指令的波形图
在controlpart模块执行指令时,在判断了ALU_free(即busy信号)变为低电平后,controlpart模块开始译码指令IR(实际是内部寄存器IRR),op信号从E改为了5,reg_add_le(即Rn_rd信号)拉低到低电平表示使能。
Reg_add(即Rn_addr信号)改变为0,空闲一周期后(等待指令计数器变化),通过IR,再读出data信号,将data_le拉低到低电平使能。
完成了译码工作。
图12control执行非跳转指令的状态机波形
状态机从0状态(ALU_free=’0’跳转)->2状态(必然跳转)->4状态(必然跳转)->5状态(必然跳转)->0状态,一条指令工作周期即机器周期一共是5个clk周期。
图13control执行跳转指令的状态机波形
状态机从0状态(ALU_free=’0’跳转)->1状态(必然跳转)->3状态(必然跳转)->5状态(必然跳转)->0状态,一条指令工作周期一共是4个clk周期,因为alu没有工作,不需要等待alu的alu_free。
图14ALUpart执行一条指令的波形图
出现Rn_rd信号,之后ALU的busy信号变为1,同时op和data信号先后到达到cpu(data信号比op信号晚2个周期),执行的指令时’f’,通过内部判断为“movedatatoA”指令,在data信号使能2个周期之后,A被改写为data的值。
赋值的同时,busy的信号变为0.表示ALU处于空闲。
图15ALUpart执行指令状态机的波形
状态机从0状态(data_le=’0’时跳转)->1状态(必然跳转)->2状态(必然跳转)->0状态,一个周期一共是5个clk周期。
因为alu执行的必然