EDA 第三章 原理图输入设计方法
3.1 原理图设计方法 原理图编辑流程 准备:安装max+plusII并进入该环境
STEP5: 启动编译 STEP7:功能仿 真和波形分析 STEP10:时序 仿真和延时分析 STEP1:建立工作库文件夹 原理图/VHDL文本代码 STEP3:存盘,注意 VHDL文件取名! STEP6:建立仿真波形文件 STEP5: 启动编译 STEP4:将设计项 目设置成Project STEP7:功能仿 真和波形分析 STEP9:引脚 锁定并编译 STEP8: 选择目标器件 STEP12: 硬件测试 STEP10:时序 仿真和延时分析 STEP11:编程 下载/配置
1.建立一个新的原理图文件 File > New 选择Graphic Editor file (gdf 格式文件)
2.输入元件 Max+plusII的内建函数 基本元件库——prim,常用基本元件库,如AND、OR、VCC、GND、INPUT、OUTPUT 中规模器件库——mf,数字电路中一些中规模器件库,如74系列逻辑器件。 较大规模器件库——mega_lpm,一些比较大的并可做参数设置的元件,使用中需要对其参数进行设置,称为参数可设置兆功能库.
调出符号 双击空白处 单击右键->enter symbol
可以直接输入符号名,如input,and2,7474等 符号库,第一行是用户的工作库(Work Library)路径。点击任一个库的路径,都会在Symbol Files下显示所有的符号文件名。 最后点击“ok”
元件的编辑 移动 旋转 右键菜单 Edit菜单 删除 复制 简单的方法,“ctrl+移动”
连线 简单的方法: 将两个元件的引脚处对齐,拖动一个元件,自动形成连线 用鼠标画 两个引脚的连线不能重叠 连线不能进入元件的虚线框内部 按下橡皮筋按钮
引脚的命名 双击引脚名 注意 第一个字符必须为英文,以后可用下划线、数字等组合 下划线前后要有字母或数字 “/”“-”“%”都是非法的 大小写的意义一样
总线 先画一条线->单击右键-> Line style->粗线 引脚名或总线名的规则为****[m..n]或者[n..m],其中m>n≥0,最多可以代表256个引脚名。一般采用[n-1..0]。
选中一条细线,当有小■闪烁时,表示可以进行命名 节点 引脚间的连线(细线)可以称为节点,节点是可以命名的,命名规则与引脚相同。 如果不想连线太多,可以对本质上相连的节点取一致的名称 选中一条细线,当有小■闪烁时,表示可以进行命名
3.保存文件 注意最上面的标题栏: 有可能不是 Untitled1 这里是指示环境的当前设计项目 注意此时的文件名 “Untitled1”
注意 为了方便同一个项目下的文件查找方便,最好事先特别建立一个目录为该项目的专用目录,目录下存放所有相关的文件 文件的路径不能包含汉字,不能用空格 保存的文件名不要和库文件名相同,如and2、7402等等
4.将当前设计设置为工程文件 将当前设计设置为工程文件 新建一个Project
5.编译Compile 按下 若有错误->双击Message栏中的红字
注意:此时菜单栏中出现了Processing选项 正确 注意:此时菜单栏中出现了Processing选项 编译器网表cnf 适配 rpt 装配 逻辑综合 数据库建库 时序仿真网表文件snf 逻辑分割
时序仿真与功能仿真
编译器网表cnf 功能仿真网表文件snf 数据库建库
6.建立仿真文件 创建仿真波形文件
注意,波形文件(scf)的名称一定要与对应的原理图文件的名称(gdf)相同
1 3 2 4
对单个输入端子设置波形 波形为低电平 波形为高电平 波形为不确定态 波形为高阻态 波形反相 为波形赋时钟值 为波形赋计数器值
对成组输入端子设置波形 为群组信号赋值 怎样合组?
7.启动仿真 按下仿真按钮
设置仿真栅格单位的意义 仿真栅格单位Grid Size: 规定每个栅格的最小时间单位 ,时间值显示在每个栅格竖线的上方。 仿真栅格单位是设置时钟周期的最小单位,即时钟周期最小等于栅格单位,最大等于栅格单位的倍数。P46(思考题:如何设置Grid Size?时钟信号周期如何设置?)
Grid Size Options-> Grid size 输入网格值,默认100ns
设置仿真终止时间的意义 仿真终止时间End Time:规定何时终止施加输入向量。系统默认为1us,对简单逻辑电路足够了,但复杂电路需要仿真的时间远远超过1us,要人工重新设置。 (如何设置End Time?)
End Time File-> End Time 输入仿真截止时间,默认1us
设置观察时间范围的意义 观察时间范围Time Range:规定仿真波形的可观察范围,要求Time Range<= End Time。(如何设置Time Range ?)
Time Range View-> Time Range 输入可见的时间范围
8.选择器件
再次编译!
9.引线端子适配 按下
分配引脚 方法一:鼠标拖动
方法二:锁定方法 Assign->Pin/Location/Chip
注意 分配引线端子后一定要重新编译 同理,对原理图做任何修改后,也一定要重新编译
10.时序仿真和延时分析
11.器件编程(下载)
12.器件测试 GW48系列实验开发系统
创建自己的元件 首先先检查自己的元件有无错误 Save & Check
半加器 全加器 3.2 1位全加器设计 1位加法器的功能:实现两个1位二进制数相加 只考虑本位两个一位二进制数A和B相加,而不考虑低位进位 3.2 1位全加器设计 1位加法器的功能:实现两个1位二进制数相加 半加器 全加器 只考虑本位两个一位二进制数A和B相加,而不考虑低位进位 既有本位两个一位二进制数A和B相加,又有低位进位Ci
1位半加器的真值表 表中的A和B分别表示两个相加的一位二进制数,S是本位和,Co是进位位。 A B S Co 1
S=AB+AB=A+B Co=AB
全加:将本位两个1位二进制数和来自低位的进位位相加 1位全加器的定义 全加:将本位两个1位二进制数和来自低位的进位位相加 令A和B分别为两个相加的1位二进制数,Ci是来自低位的进位位;S是本位和;Co是进位位。
全加器的真值表 Ci A B S Co 1
S的卡诺图
Co的卡诺图
原理图底层电路设计 原理图由若干个元件组合而成,当有些元件是多个简单元件的组合电路时,为了精确仿真组合元件的特性,必须单独设计组合元件的原理图设计,这种设计称为底层电路设计。
原理图顶层电路设计 当所有的底层元件多设计完毕并生成包装好的单一元件后,再设计一个总原理图,把所有的底层元件调出来,进行导线连接、仿真、编程下载,这种设计称为顶层电路设计。
分层设计的好处 增强设计的可读性,避免在设计中出现大量复杂的组合逻辑影响检查和测试效率 有利于进行模块复制,需要复制的电路模块可以先封装成底层元件,再在顶层设计中重复调用
分层设计的要点 在底层文件设计完成后执行File|Create Default Symbol 命令并编译 在顶层文件中,调用底层设计时
分层设计的要点 在底层文件设计完成后执行File|Create Default Symbol 命令并编译 在顶层文件中,调用底层设计时 顶层文件不能与底层文件名字相同
仿真的要求:所有输入情况都要考虑到,即按照真值表设置仿真波形
技巧:选中合组的引脚,单击右键,选择Enter Group
Ci A B S Co 1
3.3 数字电子钟设计 3.3.1 60进制计数器设计 1、六进制计数器设计 (1)数据选择器设计 3.3.1 60进制计数器设计 1、六进制计数器设计 (1)数据选择器设计 2选1的数据选择器的输入输出引脚如下:控制线1条定义为s;数据输入线2条定义为d0,d1;数据输出线1条定义为y;其真值表如表3-2所示: 表3-2 2选1数据选择器真值表 控制线 输出线 s y d0 1 d1
设计电路图如图3-28所示: 图3-28 2选1数据选择器电路图
(2)六进制计数器的真值表 上周期输出 控制线 输入值 输出 q2 q1 q0 clk clrn load en d2 d1 d0 ⅹ ⅹ ⅹ ⅹ 0 0 0 ↑ 1 a b c 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1
(3)6进制计数器设计 利用数字电路设计方法可设计出各触发器的D输入端的驱动方程分别为:
根据以上驱动方程可设计出图3-29所示的电路图。
(4)仿真6进制计数器 建立波形仿真文件,设置输入信号,如图3-30所示,可以看出,输出信号符合设计要求。
2. 六十进制计数器设计 (1)六十进制计数器的真值表 控制端 十位预置 个位预置 十位输出 个位输出 clk clrn ldn en db[2..0] da[3..0] qb[2..0] qa[3..0] ⅹ ↑ 1 b a q(不变) q=q+1(最高数到59)
(2)六十进制计数器设计
(3)仿真六十进制计数器
3.3.2 十二进制进制计数器设计 1、十二进制计数器真值表 控制端 十位预置 个位预置 十位输出 个位输出 clk clrn ldn en 3.3.2 十二进制进制计数器设计 1、十二进制计数器真值表 控制端 十位预置 个位预置 十位输出 个位输出 clk clrn ldn en db da[3..0] qb qa[3..0] ⅹ ↑ 1 b a q(不变) q=q+1
2.十二进制计数器设计 (1)2进制计数器的设计
(2)十二进制计数器设计 运用10进制计数器74160器件与2进制计数器可以完成12进制计数器的设计
3. 仿真12进制计数器
3.3.3 数字电子钟顶层电路设计 1.数字电子钟顶层电路设计 时针十位 时针个位 分针十位 分针个位 秒针十位 秒针个位 数据预置端 hb 3.3.3 数字电子钟顶层电路设计 1.数字电子钟顶层电路设计 时针十位 时针个位 分针十位 分针个位 秒针十位 秒针个位 数据预置端 hb ha[3..0] mb[2..0] ma[3..0] sb[2..0] sa[3..0] 时钟输出端 qhb qha[3..0] qmb[2..0] qma[3..0] qsb[2..0] qsa[3..0] 计数器进制 12进制计数器 60进制计数器 显示数字 00--11 00--59
2.仿真数字钟
3.4 利用LPM兆功能块的电路设计 3.4.1 常用LPM兆功能块 分类 宏单元 注释 门 单 元 函 数 Lpm_and 参数化与门 Lpm_bustri 参数化三态缓冲器 Lpm_clshift 参数化组合逻辑移位器 Lpm_constant 参数化常数产生器 Lpm_decode 参数化解码器 Lpm_inv 参数化反向器 Lpm_mux 参数化多路选择器 busmux 参数化总线选择器 mux 多路选择器 Lpm_or 参数化或门 Lpm_xor 参数化异或门
算 术 运 函 数 Lpm_abs 参数化绝对值运算 Lpm_add_sub 参数化加/减法器 Lpm_compare 参数化比较器 Lpm_counter 参数化计数器 Lpm_mult 参数化乘法器 存 储 Lpm_ff 参数化D触发器 Lpm_latch 参数化锁存器 Lpm_ram_dq 输入/输出分开的参数化RAM Lpm_ram_io 输入/输出复用的参数化RAM Lpm_rom 参数化ROM Lpm_shiftreg 参数化移位寄存器 用户 定制 函数 Csfifo 参数化先进先出队列 Csdpram 参数化双口RAM
3.4.2 基于LPM-COUNTER的数据分频器设计 data[]:置入计数器的并行数据输入。 clock:上升沿触发计数时钟输入。 clk_en:高电平使能所有同步操作输入信号。 cnt_en:计数使能控制,但不影响其他控制信号,如sload、sset、sclr等。 updown:计数器加减控制输入。 cin:最低进位输入 aclr:异步清零输入 aset:异步置位输入 sload:在clk的上升沿同步并行数据加载输入。 Q[]:计数输出。 cout:计数进位或借位输出。 LPM_WIDTH:计数器位宽。
3.4.3 制作一个兆功能模块
3.5 波形输入设计 3.5.1 创建波形设计新文件并指定工程名称
3.5.2 创建输入、输出和隐埋节点
Node Name Default Value I/O Type Node Type Secondary Inputs speed x Buried Machine Reset=reset Clock=clk Get_ticket Output Pin Registered
3.5.3 编辑隐埋状态机节点波形 (1)在菜单栏中选择Option/Grid Size命令,弹出Grid Size对话框,在其中输入“30.0ns”,即把网格尺寸设置为30ns。 (2)单击“Speed”节点的“Value”区,选中它的整个波形。 (3)在菜单栏中选择Edit/Overwrite/State Name命令,或是直接单击波形编辑器窗口左侧的按钮,这时会弹出Overwrite State Name对话框,如图3-46所示。
(4)在State Name文本框中输入“legal”,单击OK按钮,整个波形都被状态名“legal”覆盖。 (5)结合波形编辑器窗口左侧的按钮和窗口滚动条使波形300ns~540ns之间的区域显示出来。 (6)单击波形编辑器窗口左侧的波形编辑按钮,鼠标指针的形状也发生了相应变化。参考波形编辑器窗口内上方的“时间”区域,在“Speed”节点波形的300 ns处按下鼠标,拖动到540ns处松开,这之间的区域被选中,同时(Overwrite state Name)对话框自动弹出。 (7)在(state name)文本框中输入“warning ”,单击OK按钮确认,300ns-540ns之间的波形区域被状态名“warning”所覆盖。
全部波形区域,如图3-47所示。 (8)重复步骤(5)-(7),用状态名“ticket”覆盖540ns-660ns之间的波形区域。 (9)单击波形编辑器窗口左侧的 按钮,可以查看 全部波形区域,如图3-47所示。
3.5.4 编辑输入和输出节点波形 (1) 单击波形编辑器窗口左侧的波形编辑按钮后,用鼠标指针拖动选中“accel_in ”节点波形中270ns-330ns之间的区域,松开鼠标左健后这一段区域会自动变成高电平(与初始的低电平相对)。当状态机“speed”处于“legal ”状态时遇到“accel_in”的高电平,会转变成“warning ”状态,表示第1次超速。 (2) 重复步骤(1)中的操作,将“accel_in”节点波形中510ns-570ns之间的区域也变成高电平,当状态机“speed ”处于“warning” 状态时遇到“accel_in”的高电平,会转变成“ticket”状态,表示由于第2次超速而得到罚单
(3) 按下ESC 键,或是单击(波形编辑器)窗口左侧的按钮,使鼠标指针恢复选择状态,拖动鼠标选中“accel_in”节点波形国630ns-690ns之间的区域,选择菜单栏中的(Edit)/( overqrite)/(undefined(x))命令,或直接单击(波形编辑器)窗口左侧的按钮,使这一段变成不定状态。 (4)“reset”节点波形不用作任何修改,保持为低电平。 (5) 选中“clk”节点的整个波形,方法可以是单击“clk节点的“Name”、“Type”和“Value”中任何一个区域。选择菜单栏中的Edit/Overwrite/clock命令,或者直接单击波形编辑窗口左侧的按钮,这时将会弹出Overwrite Clock对话框如图3-48所示,在Multiplied By对话框中输入“2”,单击OK按钮确认。
(6) 编辑输出节点“get_ticket”的波形,使其540ns~660ns之间的区域变为高电平,它对应着状态机“Speed”的“ticket”状态,表示得到罚单,至此所有节点波形都已编辑完成,如图3-49所示。
(1) 在鼠标指针处于选择状态时,点击波形区域的0ns处,或者拖动参考柄,将指针移到波形的起点处。 3.5.5 查看波形情况 (1) 在鼠标指针处于选择状态时,点击波形区域的0ns处,或者拖动参考柄,将指针移到波形的起点处。 (2)按键盘的“ ”键,可使参考指针跳至下一个逻辑电平跳变沿处,也可通过选择菜单栏中的Utilities/Find Next Transition命令来实现本步操作。 (3) 重复移动参考指针到每个跳变沿处,跳变沿的逻辑电平值或状态名将显示在Value区。
3.5.6 保存文件并检查错误 在菜单栏中选择File/Project/Save & Check命令保存当前文件并检查语法错误,系统会自动启动编译器并给出检查报告。检查通过后关闭编译器,返回文本编辑器窗口。 3.5.7 创建默认的功能模块 在菜单栏中选择File/Create Default Symbol命令,将当前设计文件创建成同名的一个功能模块