数字电路与逻辑设计——大设计

数字电路与逻辑设计——模型机

代码仅供参考:
链接:pan.baidu.com/s/1VekND1K50yclOKdkSI-otw
up1k

一、设计目的

  1. 本课程力图以“培养学生现代数字系统设计能力”为目标,贯彻以CPU 设计为核
    心,以层次化、模块化设计方法为抓手的组织思路,培养学生设计与实现数字系统
    的能力。
  2. 本设计要求在进行了多个单元实验后,综合利用所学的理论知识,并结合在单元实
    验中所积累的成果(包括已经设计好的功能部件和调试方法),设计出一个简易计
    算机系统。

二、设计内容

  1. 按给定的数据格式和指令系统,使用EDA 工具设计一台用硬连线逻辑控制的简易
    计算机系统;
  2. 要求灵活运用各方面知识,使得所设计的计算机系统具有较佳的性能;
  3. 对所做设计的性能指标进行分析,整理出设计报告。

三、详细设计

1. 设计的整体架构

(1) 数据格式

数据字采用8 位二进制定点补码表示,其中最高位(第7 位)为符号位,小数点可视为
最左或最右,其数值表示范围分别为:-1≤X<1 或-128≤X<127。

(2)寻址方式

指令的高4 位为操作码,低4 位分别用2 位表示目的寄存器和源寄存器的编号或表示寻
址方式。
①寄存器直接寻址
在这里插入图片描述
当R1 和R2 均不是“11”时,R1 和R2 分别表示两个操作数所在的寄存器地址,R1 为目标寄存器地址,R2 为源寄存器。
在这里插入图片描述

例 MOV C,B
指令的机器码为1111 10 01
如指令执行前C=34H,B=12H,
执行完后C=12H

②寄存器间接寻址
操 作 码 R1/11 R2/11
当R1 或R2 中有一个为“11”时,表示相应操作数的地址在C 寄存器中。

例指令的机器码为1111 11 01
如指令执行前C=34H, B=26H
执行完后(34h)=26H

(3)指令系统

指令系统有16 条指令,具体格式见指令系统表。应该指出的是,各条指令的编码形式可以多种多样。为了叙述方便,下面采用汇编符号对指令进行描述,其中R1 和R2 分别表示“目标”和“源”寄存器,M 表示地址在寄存器C 中的存贮单元。
在这里插入图片描述

(4)控制信号

指令寄存器IR 接收到一条机器指令后,这条指令就被译码执行。指令通过译码产生出的各种控制信号在时钟信号的配合下控制着指令执行的全过程。为此,需要将执行每条指令所需的全部基本微操作的控制信号罗列出来,进行综合分析、化简,并落实到不同的周期、节拍之中,然后用各种逻辑门电路实现。以下是所用基本控制信号列表。
在这里插入图片描述

(5)指令周期与工作脉冲设置

指令同期与数据通路结构、指令执行方式有关。指令可以串行执行,也可以并行执行。本设计采用串行工作方式,即“读取—执行—再读取—再执行……”。串行工作方式虽然工作速度和主机效率都要差一些,但它的控制简单。因此,本机指令周期可以确定为:
在这里插入图片描述
读取指令的时间随所使用的RAM 的性能而异。执行一条指令所需工作脉冲的个数与宽度要依据控制流和数据流所经过的路径与各级门的最大延迟而定。例如,本机中写入RAM 和寄存器组的操作显然不能发生在“执行阶段”的任意时刻,它必须是在运算结果已经产生, 并被传送到总线的适当时刻才能“写”,这就需要工作脉冲来控制时序。

(6)数据通路

计算机的工作过程可以看作是许多不同的数据流和控制流在机器各部分之间的流动,数据流所经过的路径称作机器的数据通路。数据通路不同,指令执行所经过的操作过程就不同,机器的结构也就不一样。如何设计一个好的数据通路已经超出了本课程的范围,
在此我们不予讨论。我们假设所设计的计算机的数据通路如图所示。
在这里插入图片描述

(7)部件之间联系和指令执行的一般流程

  • 取指令:
    1、首先通过时钟信号对PC 发出指令,将PC 中的地址通过选择器传递到RAM。
    2、RAM 根据PC 传来的地址,读出存储在RAM 中的指令,将指令输入到总线。
    3、总线上的指令寄存器IR 在控制信号的控制下读入RAM 传来的指令。
    4、指令寄存器IR 将指令发送到指令译码器,指令译码器输出所有控制信号。

  • 执行指令:
    A. 数据传送类指令的执行过程:

    a. MOV R1,R2

    由R2 的编码通过RAA1、RAA0 从通用寄存器组A 口读出R2 的内容,在S3~S0和M 的控制下,经ALU 送入总线BUS;由/WE 控制和R1 的编码选择RWBA1、RWBA0,将BUS 上的数据写入通用寄存器R1。

    如指令MOV A,B 二进制编码:11110001
    执行过程为:
    ①R2 编码01(RAA1、RAA0 提供)对应寄存器B 数据(经A 口)读出
    ②经ALU( S3~S0 和M 的控制)->移位逻辑(FL->BUS, FR->BUS 控制)->BUS
    ③写入R1 编码00( RWBA1、RWBA0 提供)对应的寄存器A(/WE 控制)。

    b. MOV M,R2

    由M 的编码11 通过RWBA1、RWBA0 从通用寄存器B 口读出C 寄存器中的地址,在MADD=2 的控制下,地址通过选择器到达存储器RAM 的地址输入端;由R2 的编码通过RAA1、RAA0 从通用寄存器组A 口读出R2 的内容,在S3~S0 和M 的控制下,经ALU 送入总线BUS,并在/CS 和XL 控制下将BUS 上的数据写入存储器RAM。

    如指令MOV M,B 二进制编码: 1111 11 01
    如指令执行前C=34H, B=26H,
    执行过程为:
    ①R2 编码01(RAA1、RAA0 提供)对应寄存器B 数据26H(经A 口)读出
    ②经ALU( S3~S0 和M 的控制)->移位逻辑(FL->BUS, FR->BUS 控制)->BUS
    ③写入C( RWBA1、RWBA0 为11)间接寻址的存储器单元(34H)。

    c. MOV R1,M
    要求完成的操作为((C))→R1;
    由M 的编码11 通过RAA1、RAA0 从通用寄存器A 口读出C 寄存器中的地址,在MADD=1 的控制下,地址通过选择器到达存储器RAM 的地址输入端,/CS 和DL 使数据出现在BUS 上;由/WE 控制和R1 的编码选择RWBA1RWBA0,将BUS 上的数据写入通用寄存器R1。

    如指令MOV A,M 二进制编码:11110011
    指令执行前C=34H, A=26H,(34H)=12H
    执行过程为:
    ①读出C( RA1、RA0 为11)间接寻址的存储器单元(34H)的数据12H
    ②写入R1 编码00( RWBA1、RWBA0 为00)对应的寄存器A(/WE 控制)。

    B. 算术逻辑运算类指令的执行过程
    ADD R1,R2
    SUB R1,R2
    OR R1,R2
    这类指令的执行过程为:由R2 的编码通过RAA1、RAA0 从通用寄存器组A 口读出R2 的内容,由R1 的编码通过RWBA1、RWBA0 从通用寄存器组B 口读出R1 的内容,在S3~S0 和M 的控制下,经ALU 送入总线BUS;由/WE 控制和R1 的编码选择RWBA1、RWBA0,将BUS 上的数据入通用寄存器R1。其中ADD 和SUB 指令影响状态位Cf 和Zf。

  • a. ADD R1,R2
    如指令的二进制编码:10010001
    指令的执行过程为:
    ①将R2 的编码(01)送至RAA1、RAA0 从通用寄存器组A 口读出寄存器B 的内容;
    ②将R1 的编码(00)传送RWBA1、RWBA0 从通用寄存器B 口读出寄存器A 的内容;
    ③在S3-S0 和M 的控制下,在ALU 中求和后经移位逻辑送入总线BUS;
    ④由/WE(0)控制和R1 的编码选择RWBA1、RWBA0(00),将BUS 上的数据写入寄存器A 中;

  • b. NOT R1
    如指令NOT B 的二进制编码:01010100
    指令的执行过程为:
    ①将R1 的编码(00)传送至RWBA1、RWBA0,从通用寄存器B 口读出寄存器A 的内容;
    ②在S3-S0 和M 的控制下,在ALU 中求反后经移位逻辑送入总线BUS;
    ③由/WE(0)控制和R1 的编码选择RWBA1、RWBA0(00),将BUS 上的数据写入寄存器A 中。

    C. 转移类指令执行过程
    JMP add
    JZ add
    JC add
    这类指令为双字节指令,第一字节为指令码,第二字节为转移目标地址。这类指令的执行过程为:
    在MADD 的控制下,程序计数器PC 中的地址通过选择器到达存储器RAM 的地址输入端,在/CS 和DL 控制下转移地址从RAM 中读出并送入BUS,在LD PC 允许下将
    BUS 上的地址写入PC。

    D. 位移指令的执行过程
    RSR R1
    RSL R1
    这类指令的执行过程为:
    由R1 的编码通过RWBA1、RWBA0 从通用寄存器组B 口读出R1 的内容,在S3~S0 和M 的控制下通过ALU,经移位逻辑循环右移或循环左移后送入总线BUS;再由/WE控制和R1 的编码选择RWBA1、RWBA0,将BUS 上的数据写入通用寄存器R1。

(8)总体逻辑图

在这里插入图片描述
总RTL 视图:
在这里插入图片描述

2. 各模块的具体实现

(此部分必须有模块的接口设计,功能实现,功能的仿真验证等内容。)

(1) 部件目录

1、指令计数器PC
2、选择器
3、RAM
4、指令译码器
5、指令寄存器IR
6、通用寄存器组
7、函数发生器ALU
8、移位逻辑
9、控制信号及其产生逻辑
10、SM

(2) 部件具体实现

1)指令计数器PC

接口设计:
① LD_PC、IN_PC 两个信号输入,代表控制计数器自加一和数据输出以及读入的信号。
② CLK 时钟信号,接受外部时序控制执行操作。
③ BUS_IN[7…0]和OUT0[8…0],前者代表数据读入,后者代表输出。
原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 语言描述
在这里插入图片描述
波形仿真验证
在这里插入图片描述
设计需求:时钟的上升沿到来,LDPC 为1 且INPC 为0 时允许BUS 总线上的数据传入PC,LDPC 为0 且INPC 为1 时PC 自加1。波形图符合设计需求。
功能分析:
在这里插入图片描述

2) 选择器

接口设计:
(1)MADD[1…0]是2 位控制信号,用于选择地址来源。
(2)A0,A1,A2 是三个地址来源,对应PC、寄存器A 口和寄存器B 口。

原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
仿真波形:
在这里插入图片描述
功能分析:
在这里插入图片描述

3) RAM

LPM_WIDTH 是dio(输入输出端口)的宽度,LPM_WIDTHAD 是address[]端口的宽度;
mif 文件-RAM 中预存的地址与对应的指令;
接口设计:
(1)使用address 输入和dio 输出,都是8 位,输入为地址,输出为指令,指令存储在RAM 中。
(2)有we,outenab 控制信号,代表读写有效。
(3)有时钟控制信号,对RAM 的读取写入进行流程控制。

原理图:
在这里插入图片描述
VHDL 代码:
调用LPM 库,略
仿真波形:(利用了三态门)
在这里插入图片描述
功能分析:
在这里插入图片描述
(1)RAM 是存储各种指令的地方,可以进行指令的读写。
(2)构造RAM 中的指令,需要在新建文件里面建立一个mif 文件,设定好参数(256 个,8 位)根据指令表构造指令存入即可。
(3)RAM 也有时钟信号,配合其他元件,用于控制RAM 何时进行读写操作。

4) 指令译码器

接口设计:
(1)输入的IR[7…0]是8 位的指令,SM 为时钟信号。
(2)输出对应的是各个指令所需要的操作,传输入控制台

原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
在这里插入图片描述
波形仿真:
在这里插入图片描述
在这里插入图片描述
功能分析:
在这里插入图片描述

5) 指令寄存器(IR)

接口设计:
(1)IN_IN 是8 位的输入,output 是8 位的输出。
(2)LD_IR 代表将BUS 总线上的数据传输入译码器,1 有效。
(3)CLK 时钟信号接口,这个部件也需要时序控制。

原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
仿真波形:
在这里插入图片描述
功能分析:
在这里插入图片描述

6) 通用寄存器组

接口设计:
(1)BUS_IN 是8 位的输入,A,B,AR,BR,CR 是8 位的输出。(AR、BR、CR 输出的分别是A 寄存器、B 寄存器和C 寄存器的值,A、B 代表A 口、B 口的输出,分别根据RA 和WA 的值决定)
(2)JCQ_WE 代表将BUS 总线上的数据传输入寄存器组,0 有效。
(3)CLK 时钟信号接口,这个部件也需要时序控制。

原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
波形仿真:
在这里插入图片描述
功能分析:
在这里插入图片描述

7) 函数发生器(ALU)

接口设计:
(1)使能端信号M,为0 直传,为1 计算。
(2)4 位控制信号S,代表ALU 执行的各种操作。
(3)A,B,T 三个8 位接口,代表通用寄存器A、B 口传来的数据和ALU 的运算结果。
(4)C 输出代表进位,Z 输出代表运算结果。结果为00000000 时输出1,否则为0,在跳转指令中起作用。

原理图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
在这里插入图片描述
RTL 视图:
在这里插入图片描述
波形仿真:
在这里插入图片描述
功能分析:
ALU 的功能主要是实现加、减、或等运算,由S 控制,另外ALU 作为数据通路,在特定的指令下,也执行直传操作,直传的数据来源可能有两个,A 口和B 口。我自定义了两个新的控制信号S,是“1100”和“0000”,前者表示直传B 口,后者表示直传A 口。
在这里插入图片描述

8) 移位逻辑

接口设计:
(1)a 和w 是8 位的输出和输出。
(2)三个控制信号:FBUS 为1 则直传,FR 为1 右移,FL 为1 左移。
(3)C 代表被移除的那一位,即左移时输出原最左一位,右移时输出原最右一位。
原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
波形仿真:
在这里插入图片描述
功能分析:
移位逻辑部件的功能一方面根据信号控制进行数据的处理,左移和右移,并将移除的位输出;另一方面作为数据通路,在特殊信号控制下进行直传。
在这里插入图片描述

9) 控制信号及其产生逻辑

接口设计:
包括输入的信号,以及所有指令译码器传过来的指令信号,由控制器具体发出控制信号。

原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
在这里插入图片描述
波形仿真:
在这里插入图片描述
在这里插入图片描述
功能分析:
在这里插入图片描述
注:我的CPU 没有使用/CS 信号,此外用M 信号进行ALU 是否进行操作进行区分,为1 进行操作,为0 直传(此时为直传时将S 信号定为A 口直传或B 口直传)。

10) SM

接口设计:
CLK 为时钟信号;
EN 为使能信号,接HALT 的反相,当HALT 为1 时EN 输入0;
z 为SM 输出信号;
原理图:
在这里插入图片描述
RTL 视图:
在这里插入图片描述
VHDL 代码:
在这里插入图片描述
波形仿真:
在这里插入图片描述
功能分析:

sm 是clk 的二分频,sm=0 为取指令周期,sm=1 为执行指令周期。
同时这个部件通过HALT 指令执行停机指令,EN 端接HALT 信号;
在这里插入图片描述

四、系统测试

4.1 测试环境

Quartus II 9.0 仿真类型:Functional
采用Cyclone 系列EP1C3T100C8 综合

4.2 测试代码

测试过程为:IN -> IN -> MOVA -> MOVB -> MOVC -> ADD ->JC -> JMP -> SUB -> OR-> NOT -> RSR -> RSL -> OUT -> NOP -> MOVA -> SUB -> JZ -> HALT
一共执行19 次指令,包括所有16 条要求实现指令,CPU 工作时间为0-380ns,之后因为停机指令停机。

※Mif 文件设置为:
在这里插入图片描述
到第六行第一列遇到停机指令,遇到停机指令前的格子中若为00000000 则是因为JMP、JZ、JC 指令跳过的。

仿真波形:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:我的CPU 工程中的mif 文件与vwf 文件都是设置好的,如有必要可以打开进行仿真。

4.3 测试结果

我将以上波形图进行汇总,得到以下表格(表格太宽,分成两个):
CPU 工程中同样含有包含下表的excel 文件,下面两个表不好看的话可以打开excel 看。
下表含有A、B、C 寄存器中的值、PC、C、Z
在这里插入图片描述
下表中含有IN、OUT、标注(时钟与上表一样)
在这里插入图片描述
在这里插入图片描述

4.4 模型机性能分析

根据我的测试,模型机可以实现实现全部16 条指令,功能满足条件;
成本开销:
采用Cyclone 系列EP1C3T100C8 综合
在这里插入图片描述
Totol logic elements: 310/2910(11%)

时序仿真(性能分析):
在这里插入图片描述
最短时钟周期:16.624ns

五、总结

这个学期第一次接触到硬件语言,刚开始学习的时候感觉非常的困难,尤其是当老师在小班讨论课上讲CPU 设计的时候,更是一头雾水。随着不断地加深学习,从简单的指令译码器到复杂的控制信号的产生逻辑,从明了的组合逻辑电路到繁杂的时序电路,四次实验真的是一个天梯,一步一步引领我学习VHDL 语言、让我在短期内初步掌握了qurturs 这个软件。
刚开始写CPU 的时候还只能连好线,一仿真发现功能完全无法实现,后来慢慢的纠错,才发现自己的取指令过程有问题,连指令都取不出来,于是我把HALT 信号从加在SM 上改成了加到了CLK 信号上,也算是可以实现停机指令吧,现在回过头来看看原来HALT 加在SM上也没有关系,另外在RAM 上加HALT 控制端也行,于是停机指令有好几种方式可以实现,我最后选了最简单的SM 使能控制。几天的时间里一个一个指令的验证,一个一个的修改,不会的就与寝室的同学的交流学习,都不会的就在网上查,终于初步完成了简易CPU 的设计,感慨良多。

仅供参考:
链接:pan.baidu.com/s/1VekND1K50yclOKdkSI-otw
up1k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值