-
Logisim
的简单入门
一,准备工作
参考:
罗老板的计算机结构与组成课程
/rjgcx/lzw/COD/
Machine Structures. Spring 2010, UC
Berkeley
/~cs61c/sp10/
软件环境:
Logisim
仿真软件(需要
JAVA
虚拟机)
/~burch/logisim/
QuartusII 8.1
/
硬件环境:
PC
机
with Windows
XP
DE2
开发板(
DE2
Development and Education Board User
Manual
)
参考书:
关于
QuartusII
的使用教程
先来以一个与门电路的实验,
来看一下基本的操作,
在
Logisim
中一个与门电路生成过程如
p>
下:
1.
按与门
的选择按钮
,添加一个与门到电路中。
2.
使用
按
钮添加一个输入引脚,用于设置输入电平。
3.
添加一个引脚,通过属性中设置
Pin
的属性为输出
:
这样得到一个输出引脚
。
4.
移动以上添加的元素,得到原理图
:
注意选中
按钮,此时可以拖拽连线,
那么我们把电路各部分连接如下
:
5.
接下来通过选中
按钮就可以鼠标
点击设定输入管脚上的电平为
1
或
0<
/p>
了,输出引脚
也会相应改变,输出结果。
当然通过左下方的属性设定,
还可以设定当前选择元件的朝向,
数据位数,
输入端口数等参
数。
6.
另外推荐大
家后面设计的时候使用一下
tunnel
这个工具,代替复杂的
连线,在后面
复杂设计的地方,让你从蜘蛛网一样的连线中解脱出来,例如上面的电路可
以这样表示:
< br>图中输入,
与门模块,
输出三部分结构分的很清晰,
p>
tunnel
的使用使我们的电路设计更加规
范,
类似
logisim
中的
tunnel
工具在其他原理图工具中类似的工具是经常见到的,
p>
虽然名字
会有不同,用途是一样的。
p>
7.
最后是子电路添加方法,选择
Proj
ect--->A
dd Circuit…
,如下图
“
:
子电路的绘制与上面基本相同,
注意的是输入输出引脚要连接
< br>Pin
引脚,
并设定好输入输出
属性。
右击子电路选择
Edit Circuit Appearan
ce
可以调整子电路的外观,通过拖拽将外观调整好,
后面加到
上层电路设计中的时候就不会显得布线拥挤了。
显然上面的要比下面的元件效果好一些。
以上描述的这些技巧与绘制规范整齐的原理图是关系密切的,
后面实际应用中设计复
杂电路
时会突出显现出来。
几个关键的地方:
1
,请尽量使用标准模块,如果需要建立自己的模块,请学习标准模块的设计风
格。
2
,请合理划分层次,清楚定义
输入输出端口,尽量使定义的风格和规范保持一致。
3
,请使用网络标识代替直接连线,会使你的原理图更加清晰易读。
<
/p>
4
,为每个模块设计测试用例,用于测试和说明其使用方法。
p>
5
,这里用的软件比罗老板课上用的版本
高一点,操作有细微差别。
打开
Qu
artusII
软件,程序主界面如下:
1
,
新建一个工程
点击
File
——
>New
Project Wizard
,打开创建新工程向导,这里你将完成工程的基本设定<
/p>
选项。
1
,
Project name and directory
——
工程的名称与目录
2
,
Name of the top-level design
entity
——
顶层设计实体的名称
3
,
Project files and
libraries
——
项目文件与库
4
,
Target device family and
device
——
目标设备的族类
5
,
EDA
tool settings
——
EDA
工具设定
这里一般设定好工程名称和目录,
顶层设计实体名称以及目标设备族类就可以了,
其他的暂
时直接使用默认项就可以了。
2
,
新建一个设计文件
通过点击
File
——
>New
打开新建文件选择框,由于我们这里使用原理图描述实现的,则文
件类型选择
Design Files
——
>Block
Diagram/Schematic File
,就新建了一个原理图文件,
将其保存起来,注意命名要跟前面设置的顶层设计实体名称相同。
3
,
编写设计文件
接下来开始在文件中绘
制原理图,这里首先完成与门的添加,点击左侧工具栏中的
Symbol
Tool
按钮,
打开
Sym
bol
选择框,
选择
primitiv
es
——
>logic
——
>and2
,
点击
OK<
/p>
后即可在
原理图中添加一个
2
输入的与门了。在同样通过
Symbol Tool
中的加入和
primitives
——
>pin
——
>output
加入输
入和输出引脚,
然后在原理图中把他们用
Orthogonal
Node Tool
即导线连接起来,双击输入输出引脚,为他
们设定好名字,
pinA
,
pinB<
/p>
,
pinC
,
就
完成了原理图中的设计。
4
,
编译(分析综合)
点击
Processing
——
>Start
——
>Start Analysis & Synthesis
,进行分析综合,就好像是对
程序进行编译,等待片刻,如果没有错误,
编译报告会输出出来。
5
,
配置管脚
接下来配置管脚,就是设定
刚才加入的输入输出管脚与实验板上
FPGA
芯片外部引脚之间
的对应关系,设定好这个,我们设计的与门电路才能通过
FPG
A
外部引脚与实验板上的其
他设备连接起来,我们才好观察到电
路的设计效果。点击
Assignment
——
>Pins
,打开
Pin
P
lanner
设定框,这里查看实验板的说明文件,我们使用两个拨动开关来连接输入引
脚,用
一个
led
灯来连接输出引脚,
对照说明中的表格,为
pinA
,
pi
nB
,
pinC
分配
< br>PIN_N25
,
PIN_N26
和
PIN_AE23
,
设定好后点击
Assignment
——
>Devi
ce
进入设定框,
点击
Device
and Pin
Options
按钮,
在
Device
and Pin Option
框中的
Unused
Pins
标签下将
Reserve all
unused pins
设定为
As
output drivingground
。因为我们的设计最终会以电路的表达形式
工
作,错误的设计极其容易导致实验板的损坏。
6
,
下载程序
当然我们实际设计中可能会
用到波形仿真工具进行验证,
进行时间分析验证,
甚至要设定布
局布线等工作,反复迭代修正,才能完成一个复杂电路的设计,不过这里这个与门的
p>
demo
很简单,完成以上设计工作后,可以开始编译了,点击
p>
Processing
——
>Start
Compilation
开始吧。如果没有错误,输出编译报告,就可以准备下载到实验
板上去了。点击
Tool
——
>Programmer
,打开下载工具。这里我们选择使用
JTAG
的下载方式,注意先给
实验板上电,点
击
Start
开始,等待片刻,走完下载进度条,下载完成。<
/p>
7
,
完成
现在你可以在实验板上通过
p>
SW0
和
SW1
来
设定与门的输入了,实验板上的
LEDR0
相应
的亮或者灭。
我们实现的与门在哪呢?就在你面前实验板的芯片中,
实际上实验板的芯片中
有很多电路单元,
通过我们
的编程选择我们需要的电路单元用连线连接起来,
在通过配置引
脚连接到
FPGA
芯片的外部引脚上,
FPGA
是焊接在
PCB
板上的,
p>
PCB
板上的铜线把
FPGA
引脚与外部设备比如开关,
发光二极管等连接起来,
我们的电路就真正的连接到了这个系统
当中了。他们之间的连接关系在图中表示出来。<
/p>
8
,总结
经过了这么多繁杂的步骤,
我们仅仅完成的是一个简单的与门电
路,
好在通过这个过程我们
只是了解一下
FPGA
设计的基本过程与简单操作,熟悉了这个流程,以上步骤还是很清楚
的,而且实现一个复杂的设计也基本是沿这个过程走的。后面我们用
FP
GA
实现一个
CPU
也可以这样下载到
FPGA
芯片当中,这可是一个真正的电路,真正工作的
CPU
,麻雀虽小
五脏俱全,不再是仅仅在电
脑上仿真了,你必然会满心欢喜。而且实际中,这样的设计(当
然还有一些其他的工作要
做),是能够送到工厂中去生产真正的
ASIC
专用电路,也就
是真
正的,我们能摸到能使用的
CPU
,会有这样的一天。
1
,
使用<
/p>
MegaWizard
添加一个
RAM<
/p>
模块。
RAM
模块属于原理图设计中一个较为复杂的模块,并非如一个简单的二输入与门那样直接
添加
就可以了,还有一些参数需要配置和设定。在
QuartusII
中添加一个类似
RAM
的复杂
模块需
要用到
MegaWizard
,通过使用
MegaWizard
添加一个
RAM
模块,可以了解如何用
MegaWizard
为库提供的模块
配置参数。
依然是使用
Symbol
tool
打开添加模块对话框,
MagaWizard
的模块多数在
megafunctions
目录
下,我们使用的是
megafunctions
——
>storage
——
>lpm_ram_dq<
/p>
,勾选上
Launch
MegaWizard Plug-In
,
OK
,
打开
MegaWizard
Plug-In Manager
,
选择为库文件生成的文件<
/p>
类型,
有
AHDL
语言,
VHDL
语言和
Verilo
g HDL
语言三种选择,
根据需要和自己对他们的
熟悉程度选择,
设定为其生成的目录文件,
建议生
成到工程所在目录下,
并在其名称基础上
加上些有意义的后缀。
接下来是关于模块具体参数的设定,
不同的模块会有所不同,<
/p>
这里请
先按照图中的配置方式选择,使用
8
位容量
32
个字的
< br>RAM
,不带有输出口寄存功能。
为了让
RAM
有一个初始值,
我们
要为其写个初始化数据文件,
下面选中
Yes, use
this file for
the memory content data
p>
,并设定好文件路径名称。下一步是生成文件的清单,最后
Fini
sh
将生成模块添加到设计文件中。
2
,添加总线与提取总线上一位数据
的方法。
以上是通过
MegaWizard
添加模块的方法,用相同的方法,我们可以添加
lpm_add_sub
模
块。
本例中涉及到的就是以上两种模块,通过联系和实践,可以测试试验一下其
他的模块。
接下来添加输入输出引脚,这个前面介绍过,这里
有点不同的是,输出引脚是
8
位的,这
个在命名的时候后面加上
[7..0]
就表示是个
8
位的输出,例如
fib_res[7..0]
p>
,如果要用到其中
一位就是名字加上下方括号跟标号,例如
fib_res[5]
。
3
,用手动按钮作为时钟信号测试。
实验板上的时钟太快了,
不利于我们观察,那就用仿真时学的办
法,加一个输入按钮,
模拟
时钟,按一下,时钟跳一下,于是加
了一个输入引脚,用于连接实验板上的按钮开关。输入
引脚后面要加一个非门,
因为实验板上松开按钮时候输入是高电平,
所以用一个非门也就是
反相器来取反向。
需要指出的是,
用手动按钮做时钟信号来测试是一个权宜的方法,
实际的设计中是不推荐
的,
包括组合电路的输出用做时钟信号都是不好的设计习惯,
因
为时序电路工作的时钟要求波形
稳定,
组合逻辑电路中产生波形
的毛刺对其工作影响较大,
造成错误的数据或不可预测的结
果。
4
,常量的加入。
< br>由于加入的
ram
模块至少含有
32
个字的存储,只需用到其中一个,地址线置零就可以了,
每
次时钟来临都进行写入操作,那么写入使能始终设为
Enable
。那么这些常量该怎么设定
呢?在原理图设计中,有
GND<
/p>
和
VCC
两个常量,分别代表逻辑
1
和逻辑
0
,将他们
引入
到电路中就可以了,
多位数据合并到一条总线上是将各位数
据用逗号隔开,
添加到总线命名
中。
5
,让你的电路更加清晰。
前面介绍到,
当电路规模愈加复杂时,
将各模块
直接连接到一起会严重影响其清晰美观,
那
么推荐的方式是采用
网络标识的形式,也可以为
GND
,
V
CC
添加一个网络标识,把他们改
名为
b1
和
b0
如图,那么内存地址我们可
以写为
b0 ,b0, b0,
b0,b0
。
再把上图整理一下,看看效果是否好一点了。
6
,初始化
RAM
中数据
7
,波形仿真工具
< br>这里在学习一下使用
QuartusII
自带的波形仿真
工具,新建一个
Vector Waveform
File
。
在图中位置右击,搜索添加
Node
和
Bus
,在
Insert Node or Bus
框中点击
Node F
inder
按
钮,
弹出
Node Finder
框,
点击
List
将所有输入输出节点列出,
添加到
Selected Nodes
中,
OK
。
选中
clk_button
,点击工具栏的
Overwri
te Clock
,在
Clock
框中
填好起始时间,结束时间,
时钟周期等参数,为其添加一个时钟输入。
< br>
在编译过整个工程后,如无错误,点击
Start Simul
ation
,片刻后,仿真波形输出出来,仿
真结果如图,由于
只是
8
位存储器,所以
233
后面的数结果会有问题,但是仿真结果与我
们设计的电路所应得到的输出
效果是一致的。
8
,
总结
这里我们学习了利用
MegaWizard
添加
megafuncti
ons
库中的复杂模块,学习了如何使用
Node
和
Bus
,以及如何使用节点标识取代直接连线,是
原理图层次划分更加清楚,另外还
有如何进行波形仿真,对设计进行有效验证,基本在<
/p>
Logisim
中可能用到的常用功能在
QuartusII
设计工具中都能找到。
会使用
Logisim
构建一个电路,
相应使用
QuartusII
工具的
原理图设计也不会有难
度了,
当然他们库中包含的模块还有些不同,
但一般常见的标准
模块
QuartusII
都有,而是是我们在实际设计中会用到
的标准接口标准功能的模块,要好好了解
熟悉他们的用法。
<
/p>
设计一个
7
段数码管的控制逻辑电路,用
于控制数码管显示,后面他将作为一个子模块添
加到我们的顶层设计中。
1
,
7
段数码管译码电路
Hex
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
0x9
0xA
0xB
0xC
Seg(binary)
11000000
11111001
10100100
10110000
10011001
10010010
10000010
11111000
10000000
10010000
10001000
10000011
11000110
0xD
0xE
0xF
10100001
10000110
10001110
共阳极数码管编码表
有的同学可能看
到真值表就开始画卡诺图了,
呵呵,
其实可以偷一点懒,
看看图中这种实现。
通过使用选择器实现的这种译码电路,
完成了一个真值表到电路的转换,
并且实现结构清晰,
可读性很好。
1
,
创建<
/p>
7
段数码管的子电路