logisim的设计是设计CPU的基础,在往后的CPU的代码书写的过程中必然时刻伴随着设计图纸的需求。
(如有转载,请注明出处,否则将追究)
(1)基本介绍
Logisim 允许用户使用图形用户接口设计并仿真数字电路,它自身包含一些库,库中已有诸如基础门电路,存储器、多路选择器、译码器等简单器件。在后续的实验中,你将使用这些器件搭建自己的 CPU。在本实验中,我们将在 logisim中完成异或电路以及加法器的构建。通过本实验,达到熟悉 logisim 软件环境的目的,同时完成 CPU 数据通路的若干基础性功能部件的设计。
(2)设计过程
<1>构建 1-bit 全加器 ,如图1所示。
<2>构建 4-bit 全加器
4-bit 全加器是简单的 4 个 1-bit 加法器的级联,将一个全加器的 carry-out 作为另一个全加器的 carry-in,如图2而所示.
<3>构建 8-bit 全加器
<4>使用寄存器及子电路构建电路方法实现循环累加器 .
状态方程和设计图思想如下。
那么logsim的设计实现如下图所示。
循环累加电路
(1)使用 logisim/Arithemetic 中的 Adder,构建自加 1 的无限累加器。
(2)创建新文件,点击 Project-->Add Circuit,并命名。
(3)加载 Arithmetic library, Project-->Load Library-->Built-in Library... and select "Arithmetic",从库中选择 adder 子电路 加载 Memory library,Project-->Load Library-->Built-in Library... and select "Memory",从库中选择 register。
(4)将 clock(位于 Wiring 文件夹)与 register 连接
(5) 依据 section2.2 的设计,将 register、adder 相连,此时会出现"Incompatible widths" error,这意味着连线试图将两个不同位宽的管脚相连,点击 register 将在资源管理器的下方看到 register 的属性列表,其中 "Data Bit Width"域控制 register 相加的位宽属性,将其更改为 8。
(6) 将 8-bit 常量 1(Wiring 库中)连线至 adder 的第二个输入
(7)向电路添加两个输出管脚,方便监控电路。
<5>电路测试
双击 circuit 浏览器中 main 子电路,回到 main 子电路
单击 AddMachine 以选择,并放置至 main 电路中
可以更改“Facing”属性以调整器件方向
将输出管脚与 AddMachine 子电路连接,输出管脚自上而下、自左而右 排列,放置鼠标至子电路输出位置可以看到相应的标签值
如果需要访问 AddMachine 子电路的内在状态,一种方式在子电路上右 键,选择"View AddMachine",另一种方式,使用 poke 工具,再双击子 电路。
将寄存器的值初始化为 1,通过使用 poke 工具点击 register
Simulate-->Go Out To State-->main,返回 main 子电路
Simulate-->Ticks Enabled,开始进行仿真
<6>设计ALU
1、 ALU模板定义
(1) 基本描述
ALU的主要功能是对输入到ALU的两个数进行加法、减法、按位或等操作。ALU内部包括32位加法器、减法器等部件。ALU除了以上操作外,还需要判断输入的两个值是否相等。
(2) 模板接口
信号名 |
方向 |
描述 |
inputA |
I |
参与ALU计算第一个值 |
inputB |
I |
参与ALU计算第二个值 |
ALLOp[1:0] |
I |
ALU功能的选择信号 00:ALU进行加法运算 01:ALU进行减法运算 10:ALU进行或运算 |
result |
O |
ALU计算的结果 |
zero |
O |
1:result为0 0:result不为0 |
(3) 功能定义
序号 |
功能名称 |
功能描述 |
1 |
加法运算 |
将inputA与inputB进行加法运算,result<-inputA+inputB |
2 |
减法运算 |
将inputA与inputB进行减法运算,result<-inputA+inputB |
3 |
或运算 |
将inputA与inputB进行按位或运算,result<-inputA|inputB |
<7>GPR的设计(GPR就是通常所说的CPU的寄存器堆)
GPR模板定义
(1) 基本描述
GPR以32个32位具有写使能的寄存器为基础,辅以多路选择器。其主要功能是对寄存器堆进行存值取值操作。GPR除了以上操作,还有清零操作。
(2) 模板接口
信号名 |
方向 |
描述 |
clk |
I |
时钟信号 |
reset |
I |
复位信号 1:复位 0:无效 |
WE |
I |
写使能信号 1:可向GPR写入数据 0:只可从GPR |
A1 |
I |
5位的地址输入,用于指定32个寄存器中的一个。在单周期CPU中为指令的[21:25]即rs字段 |
A2 |
I |
5位的地址输入,用于指定32个寄存器中的一个。在单周期CPU中 |
A3 |
I |
5位的地址输入,用于指定32个寄存器中的一个。在单周期CPU中,为指令[16:20]rt字段或[11:15]字段之一 |
WD |
I |
32位的数据输入,当写使能时,想寄存器中写入 |
RD1 |
O |
输出32位的A1指定的寄存器的数据 |
RD2 |
O |
输出32位的A2指定的寄存器的数据 |
(3) 功能定义
序号 |
功能名称 |
功能描述 |
1 |
复位 |
当复位信号有效时,32个寄存器的值被设置为’h0 |
2 |
读数据 |
根据5位地址输入确定寄存器,并将寄存器中的数据输出 |
3 |
写数据 |
当写使能时,根据5位地址输入确定寄存器,并将数据写入寄存器 |
附我个人的设计GPR和ALU的设计图纸,如有不足,请相互交流。
<1>ALU(附:以下器件(1)---(7)之间都有联系
(1)一位加法器
(2)四位加法器
(3)八位加法器
(4)三十二位加法器
(5)三十二位减法器
(6)三十二位或运算
(7)最终的ALU
<2>GPR