您的当前位置:首页正文

计算机组成原理课程设计报告16位模型机的设计

2022-11-26 来源:帮我找美食网
 石家庄经济学院

华信学院

计算机组成原理课程设计报告

计算数据块中所有数据的累加和并存储到内存单元中

题 目 16位模型机的设计 姓 名 学 号 01 班 号 一 班 指导老师 成 绩

2014年1月

11

目 录

一、引言........................................................................................................................................... 3

设计目的 ................................................................................................................................... 3 设计任务 ................................................................................................................................... 3 二、 详细设计及实现 ..................................................................................................................... 4

拟定指令系统 ........................................................................................................................... 4 指令格式 ................................................................................................................................... 6 寻址方式 ................................................................................................................................... 6 三、16位CPU的模型 .................................................................................................................... 10

各功能部件的VHDL设计 ....................................................................................................... 12 16位模型机的设计与实现 .................................................................................................... 27 四、总结......................................................................................................................................... 32 五、参考文献: ............................................................................................................................. 32 六、 代码....................................................................................................................................... 33

22

一、引言

设计目的

为掌握并巩固本学期所学习的计算机组成原理知识,设计本次试验。运用整合所学的相关知识,一步步设计构造一台基本的模型计算机,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。

设计任务

本机功能:计算数据块中所有数据的累加和并存储到内存单元中。

汇编代码如下:

START: MOV SI, OFFSET SRC1 ;源操作数地址送SI

MOV DI,OFFSET DXT ;目的操作数地址送DI MOV BX,OFFSET SRC2 ;结束地址送BX MOV BL 0 ;设置BL中初值为0

NEXT: MOV AL,[SI] ;取数

ADD BL , AL ; 数据相加 MOV [DI],AL ;存数 CMP JE INC

SI, BX ;

START ;如果SI=BX,则转向START SI ;修改源地址

JMP NEXT ;转向NEXT

33

v1.0 可编辑可修改

二、 详细设计及实现

拟定指令系统

分析:

1) 依据汇编语言程序得出部件间的数据流的方向为

立即数→寄存器

寄存器↔内存 内存操作数采用寄存器间址寻址方式 源与目的寄存器内容比较,如果源等于目的转移,转向地址在指令中提供

寄存器加1指令

无条件转移指令,转向地址在指令中提供。 2) 指令类型 (指令中的立即数为一个字即16位)

立即数→寄存器

需要在指令中指出寄存器及立即数 如:LOADI R0,10H,此指令为双字指令 内存操作数→寄存器

需要在指令中指出间址寄存器及目的寄存器 如:LOAD R3,[R1]; 指令为单字指令 寄存器→内存

需要指令中指出源寄存器及间址寄存器 如:STORE [R2],R7; 指令为单字指令 寄存器内容比较产生转移的指令

需要指令中指出源、目的寄存器以及转向的地址 如:BRANCHEQI 0000H; 指令为单字指令

44

v1.0 可编辑可修改 寄存器加1指令 指令中指出寄存器

如: INC R1,指令为单字指令 无条件转移指令 指令中提供转向地址

如:BRANCHI 0008H; 指令为单字指令

55

v1.0 可编辑可修改 指令格式

1) 单字指令格式

单指令但操作数:INC BRANCHI

单指令双操作数:mov load store LOADI

2) 双字指令格式

双字三操作数: BRANCHEQI BRANCHGTI

操作码 00001 00010 00011 00100 00101 00110 指令 LOAD STORE MOV LOADI BRANCHI BRANCHEQI 功能 将寄存器间址的存储单元内容装载到寄存器 将寄存器的数据存入到寄存器间址的存储单元 将源寄存器内容传送到目的寄存器 将立即数装入到寄存器 无条件转移到由立即数指定的地址 如果源寄存器内容等于目的寄存器的内容,则转移到由立即数指定的地址 00111 01000 INC ADD 寄存器内容加1指令 数据相加 寻址方式

寻址方式 含义 66

立即数寻址 寄存器间址寻址方式 直接寻址 指令格式中源操作数为立即数 寄存器中操作数的地址 主存中为操作数 77

依据以上设计的指令系统,将主存中数据累加并存储到内存单元中的程序如下:

地址 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H 机器码 2001H 0010H 2002H 0030H 2006H 0016H 2007H 0000H 080BH LOAD R3,[R1] ADD R7, R3 STORE [R2],R7 BRANCHEQI 0000H 取数 相加 存数 如果R6内容等于R1的内容,则转向0000H INC R1 修改源地址 无条件转移到由立即数指定的地址 LOAD R7,0 R7内放入0初始化最小值 LOADI R6,0016H 结束地址送R6 LOADI R2,0030H 目的操作数地址送R2 指令 LOADI R1,0010H 功能说明 源操作数地址送R1 0009H 401FH 000AH 000BH 000CH 000DH 000EH 000FH

103AH 300EH 0000H 3031H 2800H 0008H BRANCHI 0008H 存储器初始化文件的内容:

88

v1.0 可编辑可修改

99

v1.0 可编辑可修改 三、16位CPU的模型

图1是采用单总线结构的16位CPU结构图,包含了基本的功能模块,由寄

存器阵列构成的8个16位寄存器Reg0----Reg7;工作寄存器OpReg;算术逻辑运算部件ALU;移位器Shifter;输出寄存器OutReg;比较器Comp;指令寄存器InstrReg;程序计数器ProgCnt;地址寄存器AddrReg。所有功能模块共用16位的三态数据总线进行信息的传送。

控制器模块由状态机实现,控制器依据指令、数据通路通过控制线向各功能模块发出控制命令。

由寄存器阵列构成的8个16位寄存器Reg0----Reg7的优点是节省资源、使用方便。它们共用一个三态开关,由控制器选择与数据总线的连接。

工作寄存器OpReg 可为ALU、比较器Comp 提供一个操作数,而ALU、比较器的另一操作数直接来自数据总线。

将ALU、移位器Shifter、输出寄存器OutReg 串接起来,由控制器统一控制来共同完成一些复杂的操作,由输出寄存器OutReg存储结果,输出寄存器OutReg 向总线的输出端含有三态开关。

比较器Comp 由控制器直接控制,比较的结果进入控制器。

1010

v1.0 可编辑可修改

地址寄存器AddrReg 提供要访问的主存单元的地址,本设计中将程序和数据放在同一存储器中。

程序计数器ProgCnt,不具备清零和+1的功能, 存放CPU要执行的下一条指令的地址。

指令寄存器InstrReg 存放CPU正在执行的指令。

工作寄存器OpReg,输出寄存器OutReg,指令寄存器InstrReg,程序计数器ProgCnt,地址寄存器AddrReg,均为最基本的寄存器。

为了验证CPU的功能,增加存储器,存储器中存入完成数据块传送所需的程序和数据。

系统中所有向数据总线输出数据的模块,其输出口必须使用三态控制器。

模型机的实际电路如图2所示:

图2 顶层实体模拟图

1111

各功能部件的VHDL设计

程序包:说明数据类型、运算器的功能、移位寄存器的操作、比较器的比较类型和用于CPU控制的状态类型。

运算器的设计

功能: Sel输入 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 说明:

a[15..0]来自于总线,b[15..0]来自于工作寄存器OpReg,c[15..0]输

操作 C= A C= A AND B C= A OR B C= NOT A C= A XOR B C= A + B C= A - B C= A + 1 C= A - 1 C= 0 说明 通过PASS 与 或 非 异或 加法 减法 加1 减1 清零 c[15..0]a[15..0]b[15..0]sel[3..0]instalu 1212

出送至移位器。sel[3..0]来自于控制器发出的控制信号aluSel[3..0],选择ALU的操作。

1313

v1.0 可编辑可修改 运算器功能仿真波形图如图3所示:

仿真结果说明:

当sel为0000时,进行直传的操作。通过pass,则c=a,为1000。 当sel为0001时,进行与的操作。a=1000,b=1234,与之后c为1000。 当sel为0010时,进行或的操作。a=1000,b=1234,c为1234。 当sel为0011时,进行非的操作。a=1000,a为EFFF。 当sel为0100时,进行异或的操作。a xor b,c为0234。 当sel为0101时,进行加法的操作。a=1000,c为2234。 当sel为0110时,进行减法的操作。a=1000,c为FDCC。 当sel为0111时,进行加1的操作。a=1000,c为1001。 当sel为1000时,进行减1的操作。a=1000,c为0FFF。 当sel为1001时,进行清0操作,全部置0. 当sel为1010时,为类型其他,全部输出0. 比较

图3 运算器功能仿真波形图

inst1sel[3..0]b[15..0]compouta[15..0]comp器的设计

1414

v1.0 可编辑可修改

功能:

t_comp 000 001 010 011 100 101 其他

比较器功能仿真波形图如图4所示:

比较类型 Eq(等于) Neq(不等于) Gt(大于) gte(大于等于) It(小于) Ite(小于等于) 操作说明 若a=b,compout=1 若a<>b,compout=1 若a>b,compout=1 若a>=b,compout=1 若a仿真结果说明:

sel为000时,进行比较是否相等的操作,1000不等于1234,compout=0 sel为001时,进行比较是否不等于的操作,1000不等于1234,compout=1

图 4 比较器功能仿真波形图

1515

v1.0 可编辑可修改 sel为010时,进行比较是否大于的操作,1000<1234,compout=0 sel为011时,进行比较是否大于等于的操作,1000<1234,compout=0 sel为100时,进行比较是否小于的操作,1000<1234,compout=1 sel为101时,进行比较是否小于等于的操作,1000<1234,compout=1 sel为其他时,compout输出0.

移位器的设计

y[15..0]shifta[15..0]sel[3..0] 功能:

t_shift 000 001 010 011 100 其他

移位器的功能仿真波形图如图5所示:

移位类型 直通 无符号数左移 无符号数右移 循环左移 循环右移 输出0 inst7

图5 移位器的功能仿真波形图

1616

v1.0 可编辑可修改

仿真结果说明:

当sel为000时,进行直传的操作,a和y相同

当sel为001时,进行无符号数左移的操作,1234变为2468 当sel为010时,进行无符号数右移的操作,1234变为091A 当sel为011时,进行循环左移的操作,1234变为2468 当sel为100时,进行循环右移的操作,1234变为091A 当 基本 功能:

功能说明:

在CPU中基本寄存器的角色是工作寄存器OpReg,输出寄存器OutReg,指令寄存器InstrReg,程序计数器ProgCnt,地址寄存器AddrReg。

基本寄存器功能仿真波形图如图6所示:

1717

sel为其他时,输出0

A 0 1 X q[15..0]CLK a[15..0]0 clkregQ 0 1 Q nn+1寄存器

inst12

仿真结果说明:

0ns到5ns,还没有遇到clk的上升沿,所以q端的输出是0000 5ns到20ns时,clk的上升沿到来,q端输出1000

20ns到25ns时,a发生变化,但clk上升沿没有到来,q端输出1000 25ns到30ns时,clk的上升沿到来,q端输出1234

寄存器组

功能:

regarrayq[15..0]data[15..0]sel[2..0]clkinst6图6 基本寄存器功能仿真波形图

Sel[2..0] 000 001 … 111 Reg R0 R1 … R7 说明:

clk的上升沿,将data[15..0]写入

功能

sel[2..0]指定的寄存器中,并在q[15..0]输出此寄存器新写入的内容。否则,q[15..0]输出sel[2..0]指定的寄存器原来的内容。如此设计的目的,便于观察写入指定寄存器中的内容。

1818

v1.0 可编辑可修改 寄存器组功能仿真波形图如图7所示:

图7 寄存器组功能仿真波形图

0 - 10ns,sel=000选中R0,当clk上升沿时,将data的数据0001写入R0,q=0001 10-20ns,sel=001选中R1,当clk上升沿时,将data的数据0002写入R1,q=0002 20-30ns,sel=010选中R2,当clk上升沿时,将data的数据0003写入R2,q=0003 30-40ns,sel=011选中R3,当clk上升沿时,将data的数据0004写入R3,q=0004 40-50ns,sel=100选中R4,当clk上升沿时,将data的数据0005写入R4,q=0005 50-60ns,sel=101选中R5,当clk上升沿时,将data的数据0006写入R5,q=0006 60-70ns,sel=110选中R6,当clk上升沿时,将data的数据0007写入R6,q=0007 70-80ns,sel=111选中R7,当clk上升沿时,将data的数据0008写入R7,q=0008

时序电路

shixut4stepclkclrinst8功能说明:

产生电位信号step和脉冲信号t4,每个step的上升沿状态机的状态发生改变,t4与寄存器的写信号相与作为寄存器的同步打入控制信号。

时序电路的功能仿真波形图如图8所示:

1919

v1.0 可编辑可修改

图8 时序电路的功能仿真波形图

仿真结果说明:

0-10ns,clr高电平,t4=0,step初始值为0;

10-15ns,clr低电平,clk为低电平,t4,step保持不变;

15-20ns,clr低电平,clk上升沿,x=000+1=001,t4 = x(1) and x(0)=0 and 0=0,step=x(1)=0;

20-25ns,clr低电平,clk为低电平,t4,step保持不变;

25-30ns,clr低电平,clk上升沿,x=001+1=010,t4 = x(1) and x(0)=0 and 0=0,step=x(1)=0;

30-35ns,clr低电平,clk为低电平,t4,step保持不变;

35-40ns,clr低电平,clk上升沿,x=010+1=011,t4 = x(1) and x(0)=1 and 0=0,step=x(1)=1;

40-45ns,clr低电平,clk为低电平,t4,step保持不变;

45-50ns,clr低电平,clk上升沿,x=011+1=100,t4 = x(1) and x(0)=1 and 1=1,step=x(1)=1;

50-55ns,clr低电平,clk为低电平,t4,step保持不变;

存储器的设计

LPM_RAM定制

首先,定制初始化数据文件,建立Memory Initialization File(.mif)文件,选择File→New命令,并在New窗口选择Other file选项,再选择Memory Initialization File选项。出现对话框,选择存储字的个数及字长,按下OK,出现如下界面,在最左列或最上行击鼠标右键,选择地址和内存操作数所使用的基值,选择Hexadecimal,存储器里存放数据块传送的指令和数据,CPU通过执行此程序进行功能验证。完成后,保存文件。

2020

v1.0 可编辑可修改

之后,定制LPM_RAM。设计步骤如下:

选择Tools→MegaWizard Plug-In Manager命令,打开MegaWizard Plug-In Manager 对话框,选中Create a new custom megafunction variation,单击Next,出现下面对话框,选择LPM_RAM_DQ,选择所用器件的类型以及所创建的输出文件的类型及名字。

选择NEXT,进入如下界面。选择数据线位数、主存容量大小(地址线位数)。

C:\\cpu_zj\\r

2121

v1.0 可编辑可修改

选择NEXT,进入下一步界面,取消q输出端的锁存。

2222

v1.0 可编辑可修改

选择NEXT,进入下一步,选择内存的初始化文件。

依据选项自动生成的代码,注意将.mif文件的路径改为相对路径,存储单元的个数为100个。

ramq[15..0]address[15..0]clockdata[15..0]wren

inst3

ram的功能仿真波形图如图9所示:

图9 ram仿真波形图

功能仿真说明:

0-10ns,wren是读信号,address地址寄存器选择的是地址0000单元,当遇到clk时,将ram里面的内容读出来是2001

controlprogCntrWrprogCntrRdaddrRegWroutRegWroutRegRdshiftSel[3..0]aluSel[3..0]compSel[3..0]opRegWrinstrWrregRdregWrrwvmaregSel[2..0]inst4stepresetcompoutinstrReg[15..0]10-20ns,wren是读信号,address地址寄存器选择的是地址0001单元,当遇到clk时,将ram里面的内容读出来是0030

40-50ns,wren是写信号,address地址寄存器选择的是地址0031单元,当遇到clk时,将ram里面的内容写进去是5550

控制器

2323

功能说明:

采用状态机实现,其中control的输入有step,reset,compout,instrReg,这些输入的组合可用于识别指令,并输出相关控制信号。具体信号的相关功能见部件说明。在译码阶段,具体来说,在一定的节拍下,contorl首先将接收的指令的前5位和后6位分开,用于分离操作数和操作码,然后将操作数的前3位和后3位分开,用于区分源操作数和目的操作数,然后根据具体的指令输出相关控制信号。

依据指令的格式、数据通路给出指令系统中所有指令的指令流程:

2424

v1.0 可编辑可修改

2525

v1.0 可编辑可修改

2626

v1.0 可编辑可修改 16位模型机的设计与实现

创建顶层实体图

工程所在的文件夹中包含文件如下所示。依次在功能部件所对应的VHD文件上击右键,选择 Create Symbol Files for Current File,创建所有功能部件的图符。

功能说明:

整个CPU系统以控制器为中心,负责指令的译码及发出各种相关控制信号。节拍发生器控制着整个系统的时钟信号,系统的相关部件在统一的节拍控制下发挥自己的作

用。IR为指令寄存器,负责存储即将执行的下一条指令,addr为地址寄存器,存放被访问存储单元的地址。PC为程序计数器,存放现行指令的地址,具有计数功能。ALU负责处理相关数据运算操作。寄存器组负责存放相关操作数和中间临时变量。多路数据选择器在相关控制信号的作用下将相关数据输入ALU处理。总线分数据总线和地址总线,负责ram和相关寄存器之间的数据交换。RAM为存储器,存放相关数据和程序。

2727

v1.0 可编辑可修改 连接所有的功能部件形成模型机。

2828

v1.0 可编辑可修改 仿真结果说明

指令 LOADI R1,0020H; 执行过程中寄存器的变化情况:

state 微操作 addr alu data2 instr pc ram regsel regn outget Reset1 0000 0000 ZZZZ 0000 0000 0000 000 0000 0000 OutReg→ProgCnt 0000 0000 0000 2001 0000 0000 2001 2001 0000 0001 0000 0000 2001 2001 2001 2001 0000 0000 0000 0001 2001 2001 2001 2001 2001 2001 000 000 000 0000 0000 0000 0000 0000 0001 0001 0001 0001 0001 0001 0001 0010 0002 0010 2001 0001 0001 0010 0010 001 000 0010 0000 0001 0002 000129 29 2001 v1.0 可编辑可修改 仿真结果说明:

指令 LOAD R3,[R1] 取数 执行过程中寄存器的变化情况:

仿真结果说明:

ADD R7 , R3 相加 执行过程中寄存器的变化情况

3030

v1.0 可编辑可修改

仿真结果说明:

指令STORE [R2],R7 ;存数 执行过程中寄存器的变化情况:

仿真结果说明:

BRANCHEQI 0000H 如果R1等于R6,则转向地址0000H 执行过程中寄存器的变化情况:

3131

v1.0 可编辑可修改

四、总结

经过本次试验,我明白到了做计算机组成原理的实验首先一定要注意线路的连接,有些要对应的要一一对应,我一开始因为没注意.弄得数据不正确,还有要注意操作方法等等。 总之,通过这次对指令系统的设计,让我对整个计算机基本原理和系统结构都有了很深的体会和认识,也强迫自己在以前不足的地方去学习了一些新的知识,最重要的是,真正让自己认识到了自己现在所学过的知识还太少太少,根本不足以完成一个哪怕是最简单的计算机项目,自己以前只满足于将课本知识学会的想法也有很大的问题,需要好好反省,在接下来的时间里,自己一定要好好把握,既要加强基础知识的学习,也要锻炼自己的实验能力,努力让自己的专业素质有很大的提高。

五、参考文献:

白中英.计算机组成原理(第五版).北京:科学出版社,2005

3232

六、代码

add

LIBRARY IEEE; USE add is

port(a:in bit16;clk:in std_logic;q:out bit16); end add;

architecture rt1 of add is begin process begin

wait until clk'event and clk='1'; q<=a+\"1010\"; end process; end rt1; addout

LIBRARY IEEE; USE addout is

port(a:in t_reg;b:in bit16;reset:in std_logic; q:out bit16); end addout;

architecture rt1 of addout is signal temp:bit16; begin

3333

process(a,b) begin

if reset='1' then temp<=\"0000000000000000\"; end if;

if a=\"111\" and b>temp then q<=b;temp<=b;

end if;

end process; end rt1; alu

LIBRARY IEEE; USE alu is

port(a,b:in bit16;sel:in t_alu;c:out bit16); end alu;

architecture rt1 of alu is begin

process(a,b,sel)

begin case sel is

when alupass=> c<=a ; when andOp=> c<=a and b ; when orOp=> c<=a or b ; when xorOp=> c<=a xor b ; when notOp=> c<= not a ; when plus=> c<=a + b ; when alusub=> c<=a - b ;

3434

when inc => c<=a +\"0000000000000001\" ; when dec => c<=a -\"0000000000000001\" ; when zero => c<=\"0000000000000000\" ; when others => c<=\"0000000000000000\" ; end case; end process; end rt1; comp

LIBRARY IEEE; USE comp is

port (a,b:in bit16;sel:in t_comp;compout:out bit); end comp;

architecture rt1 of comp is begin

process(a,b,sel) begin case sel is

when eq => if a=b then compout <='1';

else compout<='0' ;

end if;

when neq => if a/=b then compout <='1' ;

else compout<='0' ;

end if;

when gt => if a>b then compout <='1' ;

else compout<='0' ;

3535

end if;

when gte => if a>=b then compout <='1' ;

else compout<='0' ;

end if;

when lt => if aelse compout<='0' ;

end if;

when lte => if a<=b then compout <='1' ;

else compout<='0' ;

end if;

when others=> compout<='0' ; end case; end process; end rt1; control

library IEEE; use control is

port( step,reset,compout:in std_logic; instrReg:in bit16;

progCntrWr,progCntrRd,addrRegWr,outRegWr,outRegRd:out std_logic; shiftSel:out t_shift; aluSel:out t_alu; compSel:out t_comp; opRegRd,opRegWr,instrWr,regRd,regWr,rw,vma:out std_logic; regSel:out t_reg );

end control;

architecture rtl of control is

signal current_state, next_state : state;

3636

eq;

begin

process( current_state, instrReg, compout)

begin

progCntrWr <= '0'; progCntrRd <= '0'; addrRegWr <= '0';outRegWr <= '0'; outRegRd <= '0'; shiftSel <= shftpass; aluSel <= alupass; compSel <=

opRegRd <= '0'; opRegWr <= '0'; instrWr <= '0'; regSel <= \"000\"; regRd <= '0'; regWr <= '0'; rw <= '0'; vma <= '0'; case current_state is

when reset1 => aluSel<=zero; shiftSel<=shftpass; outRegWr<='1';

next_state<=common1;

when

common1

=>

outRegRd<='1';

progCntrWr<='1';

next_state<=common2;

when common2=> progcntrRd <= '1'; addrRegWr <= '1'; next_state

<=common3;

when

common3

=>

rw<='0';vma<='1';

instrWr<='1';

next_state<=execute;

when execute => case instrReg(15 downto 11) is

when \"00000\" => next_state <= incPc ;-- nop when \"00001\" => next_state<=load2; --load

ri,[rj]

when \"00010\" => next_state<=store2;-- store

[ri],rj

when \"00011\" => next_state<=move2;----mov

ri,rj

when

\"00100\"

=>

3737

next_state<=loadI2;-----loadi ri,n n

when

\"00110\"

=>

when \"00101\" => next_state<=braI2;-- branchi

next_state<=beqI2;--BranchEQi n; rs = rd then branchi n else inpc11

when \"00111\" => next_state<=inc2; --inc rd when \"01000\" => next_state<=add1;--add when others =>next_state <= incPc;

end case;

when load2 => regSel <= instrReg(5 downto 3); regRd <= '1';addrregWr

<= '1'; next_state <= load3;

when load3 => rw <= '0'; vma <= '1';regSel <= instrReg(2 downto

0);regWr <= '1'; next_state <= incPc;

when store2 => regSel <= instrReg(2 downto 0); regRd <=

'1';addrregWr <= '1'; next_state <= store3;

when store3=> regSel <= instrReg(5 downto 3); regRd <= '1'; rw <=

'1'; next_state <= incPc;

when move2 => regSel <= instrReg(5 downto 3); regRd <= '1';aluSel

<=alupass;shiftsel <= shftpass; outRegWr <= '1'; next_state <= move3;

when move3 =>outRegRd <= '1';regSel <= instrReg(2 downto 0); regWr

<= '1'; next_state <= incPc;

when loadI2 => progcntrRd <= '1'; alusel <= inc; shiftsel <=

shftpass;outregWr <= '1'; next_state <= loadI3;

when

loadI3

=>

outregRd

<=

'1';

progcntrWr<='1';

addrregWr<='1';next_state<=loadI4;

when loadI4 => rw <= '0';vma <= '1';regSel <= instrReg(2 downto

0);regWr <= '1'; next_state <= incPc;

3838

when braI2 => progcntrRd <= '1'; alusel <= inc; shiftsel <=

shftpass;outregWr <= '1'; next_state <= braI3;

when braI3 => outregRd<='1'; addrregWr<='1';next_state<=braI4; when braI4 => rw <= '0';vma <= '1';progcntrWr <= '1'; next_state

<= common2;

when beqI2 => regSel <= instrReg(5 downto 3); regRd <= '1';opRegWr

<= '1'; next_state <= beqI3;

when beqI3 => opRegRd <= '1' ;regSel <= instrReg(2 downto 0); regRd

<= '1'; compsel <= eq;

if compout = '1' then next_state <= beqI4; else next_state <= incPc11; end if;

when beqI4 => progcntrRd <= '1'; alusel <= inc; shiftsel <=

shftpass;outregWr <= '1'; next_state <= beqI5;

when beqI5 =>outregRd <= '1'; addrregWr <= '1'; next_state <= beqI6; when beqI6 => rw <= '0';vma <= '1'; progcntrWr <= '1'; next_state

<= common2;

when inc2 => regSel <= instrReg(2 downto 0); regRd <= '1'; alusel

<= inc;shiftsel <= shftpass; outregWr <= '1'; next_state <= inc3;

when inc3 => outregRd <= '1'; regsel <= instrReg(2 downto 0);regWr

<= '1'; next_state <= incPc;

3939

when incPc11 => progcntrRd <= '1'; alusel <= inc; shiftsel <=

shftpass;outregWr <= '1'; next_state <= incPc12;

when

incPc12

=>

outregRd<='1';

progcntrWr<='1';

next_state<=incPc;

when add1=> regSel <= instrReg(5 downto 3); regRd<= '1'; opRegWr

<= '1'; next_state <=add2;

when add2=> regSel <= instrReg(2 downto 0); regRd<= '1'; alusel <=

plus;shiftsel <= shftpass;outregWr <= '1'; next_state <= add3;

when add3=> outregRd <= '1';regSel <= instrReg(2 downto 0); regWr

<= '1';next_state <= incPc;

when incPc => progcntrRd <= '1'; alusel <= inc; shiftsel <=

shftpass;outregWr <= '1'; next_state <= common1;

when others => next_state <= incPc;

end case;

end process; process(step, reset)

begin

if reset = '1' then current_state <= reset1 ; elsif step'event and step= '1'

then current_state <= next_state after 1 ns;

end if;

end process; end rtl;

4040

cpu_lib

LIBRARY IEEE; USE cpu_lib is

subtype bit16 is std_logic_vector(15 downto 0); subtype t_reg is std_logic_vector(2 downto 0);

subtype t_shift is unsigned (3 downto 0); constant shftpass :t_shift:=\"0000\"; constant sftl :t_shift:=\"0001\"; constant sftr:t_shift:=\"0010\"; constant rotl :t_shift:=\"0011\"; constant rotr :t_shift:=\"0100\";

subtype t_alu is unsigned(3 downto 0); constant alupass :t_alu:=\"0000\"; constant andOp :t_alu:=\"0001\"; constant orOp:t_alu:=\"0010\"; constant notOp :t_alu:=\"0011\"; constant xorOp :t_alu:=\"0100\"; constant plus :t_alu:=\"0101\"; constant alusub :t_alu:=\"0110\"; constant inc :t_alu:=\"0111\"; constant dec :t_alu:=\"1000\"; constant zero:t_alu:=\"1001\";

subtype t_comp is unsigned (3 downto 0); constant eq :t_comp:=\"0000\";

4141

constant neq :t_comp:=\"0001\"; constant gt:t_comp:=\"0010\"; constant gte :t_comp:=\"0011\"; constant lt :t_comp:=\"0100\"; constant lte :t_comp:=\"0101\";

type state is (reset1,common1,common2,common3,execute, load2,load3,store2,store3,store4,move2,move3,incPc11,incPc12, incPc,incPc2,incPc3,loadIr,loadIr2,

beqI2,beqI3,beqI4,beqI5,beqI6,braI2,braI3,braI4, loadI2,loadI3,loadI4,inc2,inc3, add1,add2,add3);

end cpu_lib; loadreg

--AddrReg ProgCnt OpReg

LIBRARY IEEE; USE loadreg is

port(a:in bit16;rst,clk,load:in std_logic;q:out bit16); end loadreg;

architecture rt1 of loadreg is begin

process (rst,clk) begin

4242

if rst='1' then q<=(OTHERS=>'0');

elsif rising_edge(clk) then if load='1' then

q<=a ;

end if;

end if;

end process; end rt1; ram

-- megafunction wizard: %LPM_RAM_DQ% -- GENERATION: STANDARD -- VERSION:

-- MODULE: altsyncram

-- ============================================================ -- File Name:

-- Megafunction Name(s): --

altsyncram

-- ============================================================ -- ************************************************************ -- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! --

-- Build 176 10/26/2005 SJ Full Version

-- ************************************************************

4343

--Copyright (C) 1991-2005 Altera Corporation

--Your use of Altera Corporation's design tools, logic functions --and other software and tools, and its AMPP partner logic --functions, and any output files any of the foregoing --(including device programming or simulation files), and any --associated documentation or information are expressly subject --to the terms and conditions of the Altera Program License --Subscription Agreement, Altera MegaCore Function License --Agreement, or other applicable license agreement, including, --without limitation, that your use is for the sole purpose of --programming logic devices manufactured by Altera and sold by --Altera or its authorized distributors. Please refer to the --applicable agreement for further details.

LIBRARY ieee; USE altera_mf; USE ram IS

PORT ( );

address clock data wren q

: IN STD_LOGIC_VECTOR (15 DOWNTO 0); : IN STD_LOGIC ;

: IN STD_LOGIC_VECTOR (15 DOWNTO 0); : IN STD_LOGIC ;

: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)

END ram;

4444

ARCHITECTURE SYN OF ram IS

SIGNAL sub_wire0 : STD_LOGIC_VECTOR (15 DOWNTO 0);

COMPONENT altsyncram GENERIC ( ); PORT (

wren_a : IN STD_LOGIC ; clock0 : IN STD_LOGIC ;

address_a : IN STD_LOGIC_VECTOR (15 DOWNTO 0);

4545

address_aclr_a indata_aclr_a init_file

: STRING; : STRING;

: STRING;

: STRING;

intended_device_family lpm_hint lpm_type

: STRING; : STRING; : NATURAL;

numwords_a

operation_mode outdata_aclr_a outdata_reg_a

: STRING; : STRING; : STRING;

: STRING;

power_up_uninitialized widthad_a width_a

: NATURAL;

: NATURAL;

: NATURAL;

: STRING

width_byteena_a wrcontrol_aclr_a

);

q_a : OUT STD_LOGIC_VECTOR (15 DOWNTO 0); data_a : IN STD_LOGIC_VECTOR (15 DOWNTO 0)

END COMPONENT;

BEGIN

altsyncram_component : altsyncram GENERIC MAP ( )

PORT MAP (

address_aclr_a => \"NONE\ indata_aclr_a => \"NONE\ init_file => \"\

intended_device_family => \"Cyclone\ lpm_hint => \"ENABLE_RUNTIME_MOD=NO\ lpm_type => \"altsyncram\ numwords_a => 100,

operation_mode => \"SINGLE_PORT\ outdata_aclr_a => \"NONE\ outdata_reg_a => \"UNREGISTERED\ power_up_uninitialized => \"FALSE\ widthad_a => 16, width_a => 16, width_byteena_a => 1, wrcontrol_aclr_a => \"NONE\" q <= sub_wire0(15 DOWNTO 0);

4646

);

wren_a => wren, clock0 => clock, address_a => address, data_a => data, q_a => sub_wire0

END SYN;

-- ============================================================ -- CNX file retrieval info

-- ============================================================ -- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrAddr NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrByte NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrData NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrOutput NUMERIC \"0\" -- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC \"0\" -- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC \"8\" -- Retrieval info: PRIVATE: BlankMemory NUMERIC \"0\"

-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC \"0\" -- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC \"0\" -- Retrieval info: PRIVATE: Clken NUMERIC \"0\"

-- Retrieval info: PRIVATE: DataBusSeparated NUMERIC \"1\" -- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC \"0\" -- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING \"PORT_A\"

4747

-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC \"0\"

-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING \"Cyclone\" -- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC \"0\" -- Retrieval info: PRIVATE: JTAG_ID STRING \"NONE\" -- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC \"0\" -- Retrieval info: PRIVATE: MIFfilename STRING \"\" -- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC \"65536\" -- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC \"0\" -- Retrieval info: PRIVATE: RegAddr NUMERIC \"1\" -- Retrieval info: PRIVATE: RegData NUMERIC \"1\" -- Retrieval info: PRIVATE: RegOutput NUMERIC \"0\" -- Retrieval info: PRIVATE: SingleClock NUMERIC \"1\" -- Retrieval info: PRIVATE: UseDQRAM NUMERIC \"1\" -- Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC \"0\" -- Retrieval info: PRIVATE: WidthAddr NUMERIC \"16\" -- Retrieval info: PRIVATE: WidthData NUMERIC \"16\" -- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING \"NONE\" -- Retrieval info: CONSTANT: INDATA_ACLR_A STRING \"NONE\" -- Retrieval info: CONSTANT: INIT_FILE STRING \"\"

-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING \"Cyclone\" -- Retrieval info: CONSTANT: LPM_HINT STRING \"ENABLE_RUNTIME_MOD=NO\" -- Retrieval info: CONSTANT: LPM_TYPE STRING \"altsyncram\" -- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC \"65536\"

-- Retrieval info: CONSTANT: OPERATION_MODE STRING \"SINGLE_PORT\" -- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING \"NONE\" -- Retrieval info: CONSTANT: OUTDATA_REG_A STRING \"UNREGISTERED\" -- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING \"FALSE\"

4848

-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC \"16\" -- Retrieval info: CONSTANT: WIDTH_A NUMERIC \"16\" -- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC \"1\" -- Retrieval info: CONSTANT: WRCONTROL_ACLR_A STRING \"NONE\"

-- Retrieval info: USED_PORT: address 0 0 16 0 INPUT NODEFVAL address[15..0] -- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock -- Retrieval info: USED_PORT: data 0 0 16 0 INPUT NODEFVAL data[15..0] -- Retrieval info: USED_PORT: q 0 0 16 0 OUTPUT NODEFVAL q[15..0] -- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL wren -- Retrieval info: CONNECT: @address_a 0 0 16 0 address 0 0 16 0 -- Retrieval info: CONNECT: q 0 0 16 0 @q_a 0 0 16 0 -- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 -- Retrieval info: CONNECT: @data_a 0 0 16 0 data 0 0 16 0 -- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0

-- Retrieval info: LIBRARY: altera_mf Retrieval info: GEN_FILE: TYPE_NORMAL TRUE-- Retrieval info: GEN_FILE: TYPE_NORMAL FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL FALSE reg

LIBRARY IEEE; USE reg is

port(a:in bit16;clk:in std_logic;q:out bit16); end reg;

architecture rt1 of reg is

4949

begin process begin

wait until clk'event and clk='1'; q<=a ; end process; end rt1; regarray

LIBRARY IEEE; USE regarray is

port(data:in bit16;sel:in t_reg;clk:in std_logic;q:out bit16); end regarray;

architecture rt1 of regarray is type t_ram is array (0 to 7) of bit16; signal ramdata:t_ram; signal temp_data:bit16; begin

process(clk,sel)

begin

if clk'event and clk='1' then ramdata(conv_integer(sel))<=data; end if;

end process;

process(sel) begin

5050

temp_data<=ramdata(conv_integer(sel)) ;

end process;

q<=temp_data ;

end rt1; shift

LIBRARY IEEE; USE shift is

port(a:in bit16;sel:in t_shift;y:out bit16); end shift;

architecture rt1 of shift is begin

process(a,sel) begin case sel is

when shftpass => y<=a ;

when sftl=> y<=a(14 downto 0) &'0'; when sftr=> y<='0'& a(15 downto 1) ; when rotl=> y<=a(14 downto 0) & a(15) ; when rotr=> y<= a(0) & a(15 downto 1) ; when others=> y<=\"0000000000000000\" ;

end case; end process; end rt1;

5151

shixu

LIBRARY ieee; USE shixu IS

PORT ( );

clk, clr

: IN

STD_LOGIC;

t4,step : OUT STD_LOGIC

END shixu;

ARCHITECTURE a OF shixu IS

SIGNAL x : STD_LOGIC_VECTOR(2 DOWNTO 0);

BEGIN

process(clk,clr) begin

if (clr='1') then

t4<='0';x<=\"000\";

elsif(clk'event and clk='1') then

x<=x+1;

t4<= x(1)and x(0); step<=x(1);

end if;

end process;

5252

END a; trireg

LIBRARY IEEE; use trireg is

port(a:in bit16;en,clk:in std_logic;q:out bit16); end trireg;

architecture rt1 of trireg is signal val:bit16; begin process

begin

wait until clk'event and clk='1';

val<=a;

end process; process(en,val) begin

if en='1' then q<=val ;

else q<=\"ZZZZZZZZZZZZZZZZ\" ;

end if;

end process; end rt1;

5353

因篇幅问题不能全部显示,请点此查看更多更全内容