数字逻辑电路设计实验教案赵蕙
实验四 四位全加器
实验要求
使用EDA设计开发工具QuartusII,以VHD语言方式设计实现组合逻辑电路四位全加器。
实验原理
四位全加器可由一位全加器以串行方式连接而成,更为高效的方式是直接用VHDL语言实现。
实验步骤
1. 新建工程
参考实验二指导,,工程名和顶层模块名均设为fadder_4。
2. 设计输入
点击菜单项File-> new?,这次实验我们使用VHDL描述语言方式设计电路,所以选择新建一个“VHDL File”文件,点击“OK”按钮,打开代码编辑器,将下面的代码输入空白编辑区,输入完成后,保存文件,文件名与实体名相同(本例为:fadder_4.vhd)。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity fadder_4 is architecture behave of fadder_4 is begin result <= ('0' & a) + ('0' & b); end behave; generic ( ( DATA_WIDTH : natural := 4 ); a b : in unsigned ((DATA_WIDTH-1) downto 0); : in unsigned ((DATA_WIDTH-1) downto 0); port result : out unsigned (DATA_WIDTH downto 0) ); end entity; 3. 逻辑综合
参考实验二指导。
4. 布局布线
用四个开关(K1、K2、K3、K4)作为四位全加器的a输入,用四个开关(K5、K6、K7、K8)作为四位全加器的b输入,用五个发光管(D1、D2、D3、D4、D5)作为四位全加器的输出result。使用菜单项Assignment->Pins进行引脚分配,完成后引脚分配如下图。
第 21 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
引脚约束完成后,在QuartusII界面的工具栏中,点击
按钮,对设计进行全编译。
5. 编程 6. 验证
根据四位全加器真值表,拨动开关,观察发光管,验证在所有输入条件下的输出结果是否正确。
附:VHDL知识点
1. 库的引用
库一般是一些常用的VHDL代码的 集合,包括:数据类型的定义、函数的定义、子程序的定义、元件引用声明、常量的定义等一些可复用或是共享的VHDL代码。程序引用了库就可以使用该库中的VHDL代码。 library use 库名 ; 库名 . 库中程序包 . 程序包中的项 ; 2. 实体的声明 实体的声明用于实体与其它实体或是外部接口相关联的说明。实体名应该与文件名一致。 entity generic port end 实体名 is (参数名:数据类型 := 值 ) ; (端口名 : 端口模式 数据类型) ; 实体名 ; 3. 结构体的描述 VHDL程序的所有逻辑功能都在结构体中实现。 architecture 结构体名 of 实体名 is 结构体说明语句; begin 结构体描述语句; end 结构体名; 实验报告要求
1. 画出使用一位全加器以串行方式连接成四位全加器的原理图。
2. 在四位全加器电路的基础上,修改设计,使用VHDL 语言,设计BCD码加法器,说明设计方
案并写出设计代码。
第 22 页 共 37 页
数字逻辑电路设计实验教案赵蕙
实验五 序列检测器
实验要求
使用EDA设计开发工具QuartusII,以状态图方式设计实现时序逻辑电路“111”序列检测器。
实验原理
有限状态机(Finite State Machine)是一种时序逻辑,它源于人们将一个复杂的问题分割成多个简单的部分来处理的思想。状态机通过时钟驱动下的多个状态,以及状态之间的跳转规则来实现复杂的逻辑,一旦当前的状态确定,也就明确的相关的输入输出。
实验步骤
1. 新建工程
参考实验二指导,工程名和顶层模块名均设为sequencer。
2. 设计输入
点击菜单项File-> new?,这次实验我们使用状态图方式设计电路,所以选择新建一个“State Machine File”文件,点击“OK”按钮,打开状态图编辑器,使用工具栏完成状态l图的编辑。
下图工具栏上的按钮作用分别是“分离窗口切换”、“全屏幕切换”、“选择”、“放大缩小”、 “查找”、“状态工具”、“条件转换工具”、“状态表工具”、“状态机生成向导”、“插入输入端口”、“插入输出端口”、“条件转换等式显示”、“生成HDL文件工具”、“橡皮筋工具”。
完成后的序列检测状态图如下,保存文件,本例为sequencer.smf。。
状态图完成后,使用“生成HDL文件工具”
将状态图转换成HDL代码,在弹出的对话
框中可以选择生成Verilog HDL、VHDL或System Verilog,本例选择生成VHDL代码,一个sequencer.vhd文件会自动生成并保存在你的工程文件夹里。
第 23 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
3. 逻辑综合
参考实验二指导。
4. 功能仿真
参考实验二指导,创建仿真波形文件,根据生成的仿真波形图,分析结果是否正确。
5. 布局布线
用一个开关K1(引脚号:A12)作为序列检测器的switch输入, 用一个发光管D1(引脚号:A0)作为序列检测器的输出lamp,时钟信号可以使用开发平台的可调数字时钟模块CLK(引脚号:J4),但是因为实验平台上没有单拍时钟,所以本例把时钟信号到开关K2(引脚号:B12),通过拨动开关K2从0->1->0的变化,来模拟时钟。
详细引脚对应关系见附录。使用菜单项Assignment->Pins进行引脚分配,完成后点击对设计进行全编译。
按钮,
6. 编程
参考实验二指导。
7. 验证
实验报告要求
1. 有限状态机分为Moore状态机和Mealy状态机,简述两者的特点,分析本例的序列检测器状
态机应该属于哪一种?
2. 设计一个1010序列检测器,画出状态图。
第 24 页 共 37 页
数字逻辑电路设计实验教案赵蕙
实验六 计数器和分频器
实验要求
层次化设计方法,使用VHDL方式设计实现10进制加法计数器。要求计数器以1秒钟的频率计数,具有同步计数,异步清零,同步预置数功能,要求计数值同时在八个数码管上显示。主时钟选择1KHz的频率,同时作为数码管动态扫描时钟,1KHz主时钟分频后作为10进制加法器的计数时钟。
实验原理
计数器是最常见的时序逻辑电路,从微处理器的地址发生器到频率计都需要用到计数器。 分频器与计数器非常类似,时序电路设计中需要各种各样的分频器来获得不同频率的时钟,其中以整数分频器最为常见,整数分频可以简单地使用模n计数器实现,即随驱动时钟跳动n次后就输出一个进位脉冲,然后立即被清零或置位,再开始新一轮循环的计数器。
实验步骤
1. 新建工程
参考实验二指导,工程名和顶层模块名均设为counter_TOP。
2. 设计输入
1) 计数器
点击菜单项File-> new?,新建一个“VHDL File”文件,点击“OK”按钮,打开代码编辑器,将下面的代码输入空白编辑区,输入完成后,保存文件,文件名与实体名相同(本例为:counter.vhd)。 计数器模块采用参数化设计,从MIN_COUNT开始加1计数,计到MAX_COUNT后,重新回到MIN_COUNT开始计数。使用参数化设计的最大特点在于它可以被方便地修改,所以常用来建模一些需要调整的数据,以便在实例化模块时根据需要进行配置。
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity counter is generic ( MIN_COUNT : natural := 0; MAX_COUNT : natural := 9 ); port ( clk : in std_logic; reset : in std_logic; load : in std_logic; enable : in std_logic; d : in integer range MIN_COUNT to MAX_COUNT; q : out integer range MIN_COUNT to MAX_COUNT end entity; ); 第 25 页 共 37 页
数字逻辑电路设计实验教案赵蕙
实验一 半加器和全加器I
实验平台 实验要求
使用TTL小规模集成电路芯片74LS00搭建半加器电路和全加器电路,电路的输入接实验平台开关,电路输出接实验平台的发光管。希望同学们能够通过实验掌握使用基本门电路设计实现数字电路的方法。
实验原理
在数字电路中,门电路就是用来实现基本逻辑关系的电路,比如这个实验中的半加器和全加器。最基本的门电路是与门、或门和非门,由这些门可以组合成其它的逻辑电路。门电路最初由分立元件组成,集成电路出现后,我们现在使用的门电路都是集成门电路。
半加器:完成两个一位二进制数的相加而求得“和”及“进位”。
全加器:当多位二进制数相加时,高位的相加运算除了要将本位的加数和被加数相加以外,还要考虑低位是否有向该位的进位。全加器完成将两个一位的二进制数相加,并考虑低位来的进位,相当于三个一位二进制数相加的电路。
实验步骤
1. 设计
根据半加器和全加器列出真值表,写出输出函数,因为实验要求使用“与非门”实现,将输出函数转换为“与非门”形式,画出使用与非门实现半加器和全加器的电路图。
& Ai Bi & & 1 CH SH & & & & SHi & A B & Ci & Ci-1 & & & Si
半加器与非门电路 全加器与非门电路
2. 连线
请特别注意VCC和GND的连接,不要接错,以免芯片烧毁! 所用芯片的Vcc连起来接+5V;所用芯片的GND连起来接地(GND)。 电路的输入接实验平台开关,电路的输出接实验平台的发光管。
实验提供的74LS00芯片逻辑与引脚图如下。每块芯片中有四组 2 输入端与非门(正逻辑),根据步骤1设计的电路图,搭建半加器电路需要5个与非门( 可使用2块74LS00芯片),搭建全
第 1 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
加器电路需要9个与非门(可使用3块74LS00芯片)。
双列直插封装74LS00芯片逻辑图和引脚图
3. 验证
开关向上拨为“1”,向下拨为“0”;发光管为“1”时点亮, 为“0”时熄灭。
根据真值表,检验你所搭建的半加器和全加器电路,是否满足设计要求。
教你一招:实验平台上可能有个别开关、发光管故障,可以将导线一端接开关,一端接发光管,如果开关向上拨时,发光管点亮;开关向下拨时,发光管熄灭, 说明开关、发光管、导线都是好的。完成连线后的电路可能有误,在没有万用表的情况下,此法也可帮你检查电路故障。 实验报告要求
1. 填妥姓名、班级外,必须填写完成报告的日期(年月日),以后的实验报告要求里不再冗述。 2. 写出使用TTL小规模集成电路芯片74LS00完成半加器的设计和实现的完整过程(根据功能要
求列真值表->写输出函数->将输出函数变换成“与非门”形式->画出电路图->根据芯片引脚连线->验证结果)
3. 结合实验中接触和使用的小规模集成电路,请说说什么是集成电路?常用的中小规模集成电路
产品有哪些?
4. 实验过程中你遇到了哪些问题?实验刚开始时,你觉得计算机硬件课程的实验最难理解的地方
在哪里?
5. 实验一和实验二使用两种不同的方式(小规模集成电路,可编程器件)实现全加器电路,就两
种方式谈谈你实验的体会。
第 2 页 共 37 页
数字逻辑电路设计实验教案赵蕙
实验二 FPGA设计流程 ——全加器II
实验平台
EDA/SOPC实验开发平台,实验二以后的所有实验都使用此开发平台。
实验要求
根据实验平台提供的Altera公司可编程器件FPGA(现场可编程门阵列),使用Altera公司的EDA设计开发工具QuartusII,用原理图方式设计实现全加器电路,电路的输入接实验平台开关,电路输出接实验平台的发光管。希望同学们能够通过实验掌握使用可编程器件设计实现数字电路的方法。
实验原理
使用可编程器件进行数字电路设计,将传统的“设计?硬件搭试?焊接”过程变为“设计?编译?下载”的过程,其主要工作都在计算机内完成,先将设计输入计算机,再由开发系统将其转换成编程文件下载到可编程器件中。 全加器电路图的设计同实验一。
实验步骤
1. 新建工程
实验室机器安装的设计环境为:Quartus II Version 9.0。 双击桌面
图标,运行Quartus II软件。用New Project Wizard工具选项创建此设计的工程,
并设计相关信息。
点击菜单项File-> new project wizard?,出现introduction对话框,如图 1。
图 1
单击next,进入Directory,name,Top-Level Entity设置对话框,选择工程存放路径(请在E
第 3 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
盘或F盘新建一个工程相文件夹,实验室的C盘、D盘及桌面被保护)、工程名称和顶层模块名称(本例工程名和顶层模块名均设为fadder。)注意:所有的名称和路径均不能包含空格和汉字。如图 2。
图 2
跳过图 3所示Add Files对话框,该对话框设置用来将已存在的设计文件加入到工程中。
图 3
点击next,进入Family & devices settings对话框,指定FPGA器件为Cyclone系列的EP1C12F324C8,如图 4。Cyclone 系 列FPGA是Altera公司最初(2002年)的低成本FPGA。2004
第 4 页 共 37 页
数字逻辑电路设计实验教案赵蕙
年和2006年,Altera公司又推出了更新的,密度更高的Cyclone II和Cyclone III系列 FPGA,进一步巩固它在大批量、低成本应用解决方案中的地位。
图 4
图 5
图 5对话框用来设置第三方EDA工具,包括综合工具,仿真工具和时序分析工具,这里我们点击Next跳过。
第 5 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
图 6
标题栏 菜单栏 工具栏 资源管理区 工程工作区 编译状态区 信息显示区
图 7
最后,新建工程向导会根据你之前一步一步的设置,给出一个工程设置概述页如图 6,单击finish完成工程创建。完成后,QuartusII界面如图 7所示。 所有在新建工程向导中进行的设置,在工程建立完成后,都可以通过QuartusII菜单项进行修改。 第 6 页 共 37 页
数字逻辑电路设计实验教案赵蕙
2. 设计输入
点击菜单项File-> new?,出现新建源文件对话框如图 8,数字电路的设计文件总的来说有两种方式,原理图方式和硬件描述语言方式,这次实验我们使用原理图方式设计电路,所以选择新建一个“Block Diagram/Schematic File”文件,图 8,点击“OK”按钮,打开原理图编辑器。
图 8
原理图编辑器的工具栏如图 10所示,工具栏上的按钮作用依次分别是“分离窗口切换”、“选择”,“添加文字”、“符号工具”、“块工具”、“正交结点工具”、“正交总线工具”、“正交管道工具”、“橡皮筋工具”、“部分线选择工具”、“放大缩小工具”、“全屏”、“查找工具”、“水平翻转”、“垂直翻转”、“逆时针90度翻转”、“矩形工具”、“椭圆工具”、“直线工具”、“弧线工具”。
图 9
QuartusII提供了许多基本库元件给用户使用,根据实验一全加器的设计,共需要9个“2输
打开Symbol对话
入与非门电路”模块。在原理图编辑区的空白处双击鼠标,或点击符号工具
框如图 9。
在Symbol对话框中,设计全加器电路需要的“与非门”可以通过选择 “Primitives->logic”基本原件库中的“nand2”模块,点击“OK”,将该模块加入原理图中。 重复该过程,或在原理图编辑区选中已经添加好的nand2模块,使用Ctrl+C和Ctrl+V继续添加。 全加器电路的输出端口和输入端口,在Symbol对话框中,使用“ Primitives->pin”库中的“input”模块和“output”模块,添加到原理图中。添加完成后,可以在原理图中双击各个输入输出模块,为它们改名,尽量让端口名称具有可读性,本例可改为Ai、Bi、Ci-1、SHi、Si、Ci如图 11。
与非门、输入端口、输出端口之间的连接使用“正交结点工具”完成后的原理图如图 11。
完成。
第 7 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
图 10
图 11
设计输入完成后,保存文件,将模块名命名为顶层模块名,即新建工程时指定的顶层模块名,本例为:fadder.bdf。新建的文件默认情况下会自动加入到工程中。
3. 逻辑综合
为工程添加好设计文件以后,下一步就是对工程设计进行综合,本例使用QuartusII软件内嵌
第 8 页 共 37 页
数字逻辑电路设计实验教案赵蕙
的分析综合工具Analysis & Synthesis进行。点击工具栏中按钮,对设计进行综合。Analysis &
Synthesis将检查工程的逻辑完整性和一致性。
设计如果综合通过,编译状态显示区中Analysis & Synthesis步骤前面会显示绿色的勾,如果设计有错误,会显示红色的叉,如图 12,出错行号及错误原因会显示在信息显示区中,如图 13。
图 12
图 13
根据错误原因提示修改设计,完成修改后,重新综合,直到综合通过,资源管理区中可以点击顶层模块名称前的+号,显示模块间的树形结构,编译状态显示区的Analysis & Synthesis步骤前显示绿色的勾,如图 14。
图 14
初学者往往不习惯阅读错误信息。实际上学会读懂错误信息是很有用的! 4. 功能仿真
在综合通过以后,只能够说明设计符合语法规范,但并不能保证设计满足功能要求,需要通过功能仿真,来验证电路功能是否符合设计要求,功能仿真的考察是的电路在理想环境下的行为,
第 9 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
不考虑电路门延迟与线延迟。这里使用QuartusII自带的波形图仿真工具进行。
1) 新建仿真波形图文件
要使用QuartusII自带的波形图仿真工具进行仿真,首先要新建一个波形图文件。在File菜单中选择New,出现如图 8中所示对话框,在Verification/Debugging Files页中选择Vector Waveform File,点击OK按钮,出现一个空的波形图文件,如图 15。
图 15
2) 添加观察信号结点
用菜单Edit->Insert->Insert Node or Bus…,打开如图 16所示对话框。可以直接在Name文本框中直接输入信号名称,也可以通过点击按钮Node Finder…,打开结点查询对话框来如图 17,来添加需要观察的信号。
图 16
本例在Node Finder对话框的Filter选项下拉菜单中选择Pins:all,然后点击List按钮,在Nodes Found列表中,选中Ai、Bi、Ci-1、SHi、Si、Ci信号,双击或使用信号中。最后点击“OK”按钮,完成观察信号的添加。
按钮,将它们添加到观察
第 10 页 共 37 页
数字逻辑电路设计实验教案赵蕙
图 17
3) 编辑输入波形
在Name栏中选中输入信号的名称,这组输入信号所在的行将被高亮,如图 18。通过菜单Edit->Value,或者直接使用工具栏按钮对输入信号的波形进行设定。
图 18
如图 19工具栏上的按钮作用分别是“分离窗口切换”、“选择”,“添加文字”、“编辑波形”、“放大缩小”、“全屏幕切换”、“查找”、“替换”、“设置为Unknown”、“置0”、“置1”、“设置为高阻”、“设置为Weak Unknown”、“设置为Weak Low”、“设置为Weak High”、“设置为Don’t Care”、“设置为取反”、“设置计数值”、“设置时钟”、“设置为任意值”、“设置随机值”、“贴齐网格线”、“排序”。
图 19
信号添加完成并且编辑好波形后,保存文件,本例为fadder.vwf。
4) 在QuartusII中指定仿真文件
用菜单Assignment->Setting…在Simulator Settings中,设置Simulation mode为“Functional”,设置fadder.vwf为仿真输入文件,仿真结束的条件可以根据需要在Simulation Period项中选择,如图 20选择仿真运行80ns结束。点击“OK”按钮完成设置 。
第 11 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
图 20
5) 生成功能仿真网表
用菜单Processing->Generate Functional Simulation Netlist。如果缺少这一步,在仿真运行时,QuartusII产生出错提示:“Error: Run Generate Functional Simulation Netlist (quartus_map seven_seg
--generate_functional_sim_netlist) to generate functional simulation netlist for top level entity \the Simulator (quartus_sim)”,无法完成仿真。
6) 运行仿真
通过工具栏按钮启动仿真。
7) 观察分析仿真结果
仿真完成后,根据生成的仿真波形图,对比全加器真值表,分析结果是否正确。本例结果如图 21。
第 12 页 共 37 页
数字逻辑电路设计实验教案赵蕙
图 21
5. 布局布线
1) 约束引脚
FPGA电路板与实验平台上各个资源模块(如本实验的LED Switches & Buttons模块)之间的连接是固定的,应该根据它们之间的连接关系对FPGA的引脚进行引脚约束。约束引脚是将顶层设计文件的输入输出端口指定到FPGA器件的实际引脚。引脚对应关系见附表。
使用菜单项Assignment->Pins进入引脚分配编辑窗口,完成后的分配图 22。
图 22
不要忘记引脚约束! 在以后的设计中,如果忘记了导入引脚约束文件,编译也不会报错,此时由软件自动分配未约束的引脚,但是和实际连接关系就不一致了。后果是不能通过在实验仪上的验证。
第 13 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
2) 布局布线、生成编程文件
引脚约束完成后,在QuartusII界面的工具栏中,点击
按钮,对设计进行全编译。
此外,也可以使用菜单项Processing->Compiler Tool打开编译工具对话框,如图 23,点击Fitter区域中的
按钮和Assembler区域中的
按钮来执行布局布线和生成编程文件,也可以直接点
击Start按钮来完成全编译过程。
图 23
如果设计文件或引脚约束有改动,一定要重新进行全编译。
6. 时序仿真(附加题,有兴趣的同学选择完成)
功能仿真不考虑传输延迟,主要目的是检查逻辑功能有没有错误,是否符合设计要求。时序仿真包含了延时信息,它能较好地反映芯片的工作情况。
用菜单Assignment->Setting…在Simulator Settings中,更改设置Simulation mode为“Timming”,设置完成后重新运行仿真,观察结果,本例如图 24。
图 24
与功能仿真时得到的波形图不同,在时序仿真得到的波形图没有那么完美,因为信号经过任何门电路和导线都存在一个时间延迟问题,,使得电路的输入到达稳定状态时,输出并不一定能立即达到稳定状态。观察电路延迟的情况。
第 14 页 共 37 页
数字逻辑电路设计实验教案赵蕙
7. 配置器件(或称编程、下载)
对可编程器件FPGA进行配置(编程),俗称下载,下载前打开实验平台电源。
点击工具栏按钮,或使用菜单项Tool->Programmer进入器件编程话框,如图 25。单击
按钮,可以选择编程电缆硬件设置,如图 26,因为实验设备使用的是
USB-Blaster下载电缆,所以本例中使用USB-Blaster作为硬件接口。
设置完编程硬件后,在编程界面,在Mode中选择编程模式,本例使用JTAG模式。勾选Program/Configure选项框,单击
按钮开始器件编程。在Process进度条中会显示编
程进度。完成后,在QuartusII的信息显示区中,会报告成功或出错信息;注意:信息显示在QuartusII的信息显示区中,不在编程窗口中。
编程界面左侧的其它按钮分别表示停止编程;自动检测编程硬件是否连接;删除编程文件;更改选中的编程文件;保存文件;添加用户自定义的器件;更改编程文件的顺序。
图 25
图 26
8. 测试验证
器件被成功配置后,就可以进行验证了。拨动连接全加器输入端口Ai,Bi,Ci的开关,观察连接全加器输出端口Si,Ci的发光管显示是否正确。
第 15 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
实验三 七人表决器
实验要求
使用EDA设计开发工具QuartusII,以原理图方式设计实现七人表决器电路,当表决器的七个输入中有4个以上(含4个)为“1”时,u表决器输出为“1”,否则为“0”。用七个开关作为表决器的七个输入,输入为逻辑“1”时表示表决者“赞成”,输入为“0”代表“不赞成””。用二个发光管作为表决器的输出,发光管点亮( 逻辑1)表示表决“通过”,发光管熄灭表示表决“不通过”。
实验原理
七人表决器的方案很多,这里给出一个使用多个一位全加器实现的电路参考,见“设计输入”,其中的一位全加器我们利用实验二的设计。
实验步骤
1. 实验准备
打开QuartusII环境,使用File->Open Project…打开上一次的全加器实验工程,双击顶层模块打fadder开原理图文件,然后使用File->Create/_Update->Create Symbol Files For Current File,将顶 层原理图方式设计的全加器模块转换为符号文件fadder.bsf。
在E盘或F盘新建一个文件夹(所有的名称和路径均不能包含空格和汉字),将实验二全加器工程中的全加器原理图文件fadder.bdf,以及刚才生成的全加器符号文件fadder.bsf,一起拷入新建的文件夹中。
2. 新建工程
参考实验二指导,在上一步新建的文件夹内创建QuartusII工程,工程名和顶层模块名均设为seven。
3. 设计输入
点击菜单项File-> new?,新建原理图Block Diagram/Schematic文件,在空白编辑区内双击鼠标左键,或使用符号工具
,打开symbol对话框。在Libraries中,除了QuartusIIa提
供的库元件外,由于在“实验准备”步骤中,往工程文件夹内中拷入了fadder.bsf符号文件, 所以在Project树下,可以看见当前工程路径下自己定义的元件fadder.bsf。
点击“OK”按钮,将fadder模块加入原理图中。 重复该过程,共添加4个一位全加器模块。 在Symbol对话框中,使用 “Primitives->pin”库中的“input”模块和“output”模块,为设计添加输入端口和输出端口。使用“Primitives->logic”库中的“not”模块,,输出端口pass取反后
第 16 页 共 37 页
数字逻辑电路设计实验教案赵蕙
送给 输出端口deny。
模块之间的连接使用“正交结点工具”
完成。完成后的原理图如下,保存文件(本例
为seven.bdf)。
4. 逻辑综合
参考实验二指导。
5. 布局布线
使用菜单项Assignment->Pins进行引脚分配,完成后引脚分配如下图。引脚约束完成后,在QuartusII界面的工具栏中,点击
按钮,对设计进行全编译。
6. 编程
参考实验二指导。
7. 验证
拨动开关,观察发光管,验证在所有输入条件下的输出结果是否正确。
第 17 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
实验报告要求
1. 完善设计:
在表决通过时,用实验平台上的扬声器报鸣提示;在原基础上使用数码管显示赞成票数,写出设计方法。(提示:票数就是几个一位全加器计算出来的最后的结果;想在数码管上显示,需要设计译码器电路。)
2. 使用VHDL 语言设计七人表决器电路。
附:数码管段码表
发光二极管组成的显示器是嵌入式应用产品中最常用的廉价输出设备。它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个或一笔画被点亮,控制不同组合的二极管导通,就能显示数字和少量字符。常用的七段显示器如下图。一位显示器由八个发光二极管组成,其中七个发光二极管a~g控制七个笔画(段)的亮或暗,另一个控制一个小数点的亮和暗。
实验平台上的七段数码管是共阴极的(发光二极管阳极连在一起称为共阳极显示器,阴极连在一起称为共阴极显示器),也就是输出为高电平的时候,二极管会导通。例如显示一个“0”,就是abcdef导通,gh截止。根据表可知,段码为3FH。
实验平台上有八个数码管,它们的abcdefgh都连接在一起,由用户控制,8个数码管的位选信号由一片74LS138译码器提供, 译码器的输入端(SEL0,SEL1,SEL2)由用户控制,例如SEL0,SEL1,SEL2若为为000, 就选中最右边的数码管,而其余数码管关闭。
表 七段数码管段码表
显示 16进制 3F 06 5B 4F 66 6D 7D 07 7F 6F 77 7C 39 5E 79 71 h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 g 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 f 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 e 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 d 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 c 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 b 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 a 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 2 3 4 5 6 7 8 9 A B C D E F 第 18 页 共 37 页
数字逻辑电路设计实验教案赵蕙
数码管译码显示设计参考
实验平台上的数码管显示模块的电路原理,以及数码管的输入与与FPGA的管脚连接关系如下面的图、表所示:
信号名称 7SEG-A 7SEG-B 7SEG-C 7SEG-D 7SEG-E 7SEG-F 7SEG-G 7SEG-DP 7SEG-SEL0 7SEG-SEL1 7SEG-SEL2 对应FPGA管脚名 H3 H4 K5 L5 K4 L3 L4 M3 G4 G3 F4 说明 七段码管A段输入信号 七段码管B段输入信号 七段码管C段输入信号 七段码管D段输入信号 七段码管E段输入信号 七段码管F段输入信号 七段码管G段输入信号 七段码管dp段输入信号 七段码管位选输入信号 七段码管位选输入信号 七段码管位选输入信号 如果只需要在数码管上显示16进制数据0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F,可以参考下面的代码设计一个4-7译码器。同学们知道1个16进制数据可以由四个二进制位表示,设计用四位的向量输入端口switch来表示四个二进制位;用7位的向量输出端口ledaq来表示数码管的七段(dp小数点段未考虑),根据七段数码管段码表,进行译码器描述。
向量输出端口sel用来选择点亮8个数码管中的哪一个,本例中sel[2:0]设置为为“000”, 点亮最右边的数码管,而其余数码管关闭,同学们也可根据自己的需要选择点亮其它数码管。 library ieee; use ieee.std_logic_1164.all; entity Decode4_7 is port( switch : in std_logic_vector(3 downto 0) ; --四位输入信号 ledag : out std_logic_vector(6 downto 0);--8个数码管的7段输出 sel : out std_logic_vector(2 downto 0) -- 8个数码管的位选输出 ); end Decode4_7; architecture behave of Decode4_7 is begin sel<=”000”; process(switch) begin case switch is when \第 19 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when others => null; end case; end process; end behave;
思考:1. 如果要求除了0~F之外,还要能够显示H,如何修改设计? 2. 如果希望8个数码管同时点亮,你觉得可以怎么做?
第 20 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
architecture behave of counter is begin process (clk,reset) variable cnt : integer range MIN_COUNT to MAX_COUNT; begin if reset = '1' then cnt := 0; elsif (rising_edge(clk)) then if load ='1' then cnt:= d; elsif cnt=MAX_COUNT then cnt:= MIN_COUNT; elsif enable = '1' then cnt := cnt + 1; end if; end if; q <= cnt; end process; end behave; 2) 分频器
QuartusII中含有大量的功能强大的LPM模块,LPM是Library of Parameterized Modules参数可设置模块库的缩写,LPM功能模块内容丰富,每一模块的功能、参数含义、使用方法、硬件描述语言模块参数设置及调用方法都可以在QuartusII中的Help中查阅到。本例使用LPM_counter模块来实现分频。
点击菜单项Tools-> MegaWizard Plug-In Manager?,在弹出的对话框中选择Create a new custom…定制一个新的模块(如果要修改一个已经编辑好的LPM模块,则选择Edit an exiting custom…项),点击“Next”按钮,在后续对话框中的左栏选择Arithmetic项下的LPM_COUNTER,在右边选择Cyclone器件和VHDL语言方式,最后输入定制的LPM_COUNTER存放的路径和文件名,本例文件名为divider.vhd,路径选择自己创建工程的路径。
点击“Next”,选择计数器的位宽为10bit,加1计数。
第 26 页 共 37 页
数字逻辑电路设计实验教案赵蕙
点击“Next”,设置为模1000计数,选择输出Carry-out信号,则计数器会从0计数到999,再回零计数,当计数到999时,会产生一个时钟的Carry-out信号。后面我们就用这个Carry-out信号来做10进制计数器的计数时钟。依图完成每个对话框的设置,最后点击“Finish”,完成LPM_COUNTER定制,硬件描述语言文件divider.vhd会自动保存在你设置的路径中。
3) 数码管译码电路及动态扫描
在“数码管译码显示设计参考”中,我们介绍了使用译码电路,控制实验平台中8个数码管的段码a-b-c-d-e-f-g,从而在数码管上显示16进制数据0~F,由设计中8个数码管的位选择信号SEL0、SEL1、SEL2来决定到底哪个数码管显示,例如SEL0、SEL1、SEL2为“000”时,最右边的数码管显示当前段码,即在一个时刻,只能有一个数码管被点亮。
如果希望8个数码管上分别显示希望的数据,就必须使得选通信号以较高的频率依次选通,同时在段码输入口加上希望在对应数据管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。
第 27 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
点击菜单项File-> new?,创建一个实现数码管动态扫描的VHDL文件,点击“OK”按钮,打开代码编辑器,将下面的代码输入空白编辑区,输入完成后,保存文件,文件名与实体名相同(本例为:Dynamic_Scan.vhd)。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Dynamic_Scan is port(clk : in std_logic; --定义动态扫描时钟信号 switch ledag sel ); end Dynamic_Scan; architecture behave of Dynamic_Scan is begin --三位计数器实现000~111计数,计数器的输出作为数码管的SEL选通信号。 process(clk) variable count : std_logic_vector(2 downto 0); begin if clk'event and clk='1' then--检测时钟上升沿 count:=count+1;--计数器count累加 end if; sel<=count; end process; --译码电路进程参考“数码管译码显示设计参考”,此处略。 end behave; : in std_logic_vector(3 downto 0); --四位输入信号 : out std_logic_vector(6 downto 0); --8个数码管的7段输出 : out std_logic_vector(2 downto 0) --8个数码管的位选输出 4) 顶层模块
点击菜单项File-> new?,创建一个顶层模块VHDL文件,保存,文件名与实体名相同(本例为counter_TOP.vhd)。 这个设计包含计数器、分频器、数码管动态扫描等多个模块,顶层模块的作用是把各个模块连起来,形成最后完整的数字电路,作用与同学们画原理图时从库里添加元件,以及在元件与元件之间连线类似。
library ieee; use ieee.std_logic_1164.all; --该程序包中定义了转换函数conv_std_loigc_vector(A,位长) use ieee.std_logic_ARITH.all; entity counter_TOP is generic ( MIN_COUNT : natural := 0; MAX_COUNT : natural := 9; 第 28 页 共 37 页
数字逻辑电路设计实验教案赵蕙
architecture behave of counter_TOP is component counter component divider component Dynamic_Scan port( clk : in std_logic; switch : in std_logic_vector(3 downto 0); : out std_logic_vector(6 downto 0); PORT ( ); clock cout q : IN STD_LOGIC ; : OUT STD_LOGIC ; generic ( ); port ( ); clk reset : in std_logic; : in std_logic; MIN_COUNT : natural := 0; MAX_COUNT : natural := 9 ); port ( ); clk reset : in std_logic; : in std_logic; DATAWIDTH : natural := 4 load : in std_logic; enable : in std_logic; d : in integer range MIN_COUNT to MAX_COUNT; q : buffer integer range MIN_COUNT to MAX_COUNT; : out std_logic_vector(6 downto 0); : out std_logic_vector(2 downto 0) ledag sel end entity; load : in std_logic; enable : in std_logic; d : in integer range MIN_COUNT to MAX_COUNT; q : out integer range MIN_COUNT to MAX_COUNT end component; : OUT STD_LOGIC_VECTOR (9 DOWNTO 0) end component; ledag 第 29 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
sel ); end component; signal cout_sig : std_logic; signal counter10_q : std_logic_vector(DATAWIDTH-1 downto 0); begin divider_inst : divider PORT MAP (clk,cout_sig); counter_inst : counter generic map (0,9) port map(cout_sig,reset,load,enable,d,q); counter10_q<= conv_std_logic_vector(q,DATAWIDTH); Dynamic_Scan_inst: Dynamic_Scan PORT MAP (clk,counter10_q,ledag,sel); --本设计八个数码管显示相同的10进制计数值,所以段码输入口始终来自10进制计数器的计数输出 end behave; : out std_logic_vector(2 downto 0) 3. 逻辑综合
当一个工程中有多个源文件时,必须告诉编译器到底哪一个才是工程的顶层,本例的顶层文件是counter_TOP,新建工程其实已经指定了工程的顶层文件,如果需要改动,方法一:使用菜单项Project-> Set as Top-Level Entitey可以将当前正打开的文件设置为顶层文件;方法二:使用菜单项Assignmengs->Settings…,在打开的设置对话框中,选择左边最上面的“General”,在右边的Top-Level entity编辑框中选择设计顶层。
4. 布局布线
参考附录FPGA引脚对应关系,自己完成引脚的选择和约束。
5. 编程 6. 验证
附:VHDL知识点
4. 元件(模块)声明
结构化模型中所使用的元件事先已经定义过,在使用之前必须首先声明。元件声明格式如下: COMPONENT 元件名 ; PORT(信号列表); END COMPONENT 5. 元件例化 元件例化语句是要对所适用的元件与当前设计实体中其他组件及端口信号的连接方法加以说明,元件例化的格式如下: 元件实例:元件名 generic map (参数) port map( 端口信号1=>信号名1,??) 这里使用的端口信号就是实体中port部分使用的端口名,而信号名则是加到当前元件的实际信号的名称。通过端口信号映像port map,指明了元件和外部端口信号、元件和元件中间的连接。
第 30 页 共 37 页
数字逻辑电路设计实验教案赵蕙
实验七 数字钟
实验要求
使用VHDL语言,利用层次化设计方法,设计实现具有时、分、秒计时的简易数字钟。
实验原理
分计时和秒计时可以设计60进制计数器实现,小时计时可以设计24进制计数器实现。秒计时器从0开始计数满59时,回零,此时分计时器计数一次;分计时计数器从0开始计数满59时,回零,此时小时计数器计数一次,从0计到23时,回零。将秒、分、时计数器的计数值,在数码管上显示出来。
实验步骤
1. 新建工程 2. 设计输入
1) 参数化方法设计任意进制计数器
参考实验六计数器修改设计,在计数到最大值时输出计数满标志。 2) 数码管动态扫描电路 参考实验六。 3) 顶层模块
计数器模块实例化6次,每次参数不同,实例成3个10进制计数器(时钟计数个位,分钟计数个位,秒钟计数个位),1个二进制计数器(时钟计数十位),2个6进制计数器(秒钟计数十位,分钟计数十位)。
秒钟个位计数器计满标志作为秒计十位计数器的计数使能(enable),秒钟十位计数器计满标志作为分钟个位计数器的计数使能(enable),分钟个位计数器计满标志作为分钟十位计数器的计数使能,分钟十位计数器计满标志作为时钟个位计数器的计数使能,时钟个位计数器的计满标志作为时钟十位计数器的计数使能。
01 library ieee; 02 use ieee.std_logic_1164.all; --该程序包中定义了转换函数conv_std_loigc_vector(A,位长) 03 use ieee.std_logic_ARITH.all; 04 entity counter_TOP is 05 generic 06 ( MIN_COUNT : natural := 0; MAX_COUNT : natural := 9 ; 07 DATAWIDTH : natural := 4 08 ); 09 port 10 ( 11 clk : in std_logic; 12 reset : in std_logic; 13 loadHOUR : in std_logic; 第 31 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
14 loadMIN : in std_logic; 15 loadSEC : in std_logic; 16 enable : in std_logic; 17 d : in integer range MIN_COUNT to MAX_COUNT; 18 ledag : out std_logic_vector(7 downto 0); 19 sel : out std_logic_vector(2 downto 0) 20 ); 21 end entity; 22 architecture behave of counter_TOP is 23 component counter 24 generic 25 ( MIN_COUNT : natural := 0; 26 MAX_COUNT : natural := 9 27 ); 28 port 29 ( clk : in std_logic; 30 reset : in std_logic; 31 load : in std_logic; 32 enable : in std_logic; 33 carry_out: out std_logic; 34 d : in integer range MIN_COUNT to MAX_COUNT; 35 q : out integer range MIN_COUNT to MAX_COUNT 36 ); 37 end component; 38 component divider 39 PORT 40 ( 41 clock : IN STD_LOGIC ; 42 cout : OUT STD_LOGIC ; 43 q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0) 44 ); 45 end component; 46 component Dynamic_Scan 47 port( clk : in std_logic; 48 HOUR10 : in std_logic_vector(3 downto 0); 49 HOUR1 : in std_logic_vector(3 downto 0); 50 MIN10 : in std_logic_vector(3 downto 0); 51 MIN1 : in std_logic_vector(3 downto 0); 52 SEC10 : in std_logic_vector(3 downto 0); 53 SEC1 : in std_logic_vector(3 downto 0); 54 ledag : out std_logic_vector(7 downto 0); 55 sel : out std_logic_vector(2 downto 0) 56 ); 57 end component; 第 32 页 共 37 页
数字逻辑电路设计实验教案赵蕙
58 signal clk_sig : std_logic; 59 signal carry_hour,carry_min,carry_sec :std_logic; 60 signal HOUR : integer range 0 to 23; 61 signal MIN : integer range 0 to 59; 62 signal SEC : integer range 0 to 59; 63 64 signal HOUR10 : std_logic_vector(DATAWIDTH-1 downto 0); 65 signal HOUR1 : std_logic_vector(DATAWIDTH-1 downto 0); 66 signal MIN10 : std_logic_vector(DATAWIDTH-1 downto 0); 67 signal MIN1 : std_logic_vector(DATAWIDTH-1 downto 0); 68 signal SEC10 : std_logic_vector(DATAWIDTH-1 downto 0); 69 signal SEC1 : std_logic_vector(DATAWIDTH-1 downto 0); 70 71 begin 72 divider_inst : divider PORT MAP (clk,clk_sig); 73 74 counter_HOUR : counter generic map (0,23) port map(clk_sig,reset,loadHOUR,carry_min,carry_hour,d,HOUR); 75 counter_MIN : counter generic map (0,59) port map(clk_sig,reset,loadMIN,carry_sec,carry_min,d,MIN); 76 counter_SEC : counter generic map (0,59) port map(clk_sig,reset,loadSEC,enable,carry_sec,d,SEC); 77 78 HOUR10<=conv_std_logic_vector(HOUR/10,DATAWIDTH); 79 HOUR1 <=conv_std_logic_vector(HOUR mod 10,DATAWIDTH); 80 MIN10 <=conv_std_logic_vector(MIN/10,DATAWIDTH); 81 MIN1 <=conv_std_logic_vector(MIN mod 10,DATAWIDTH); 82 SEC10 <=conv_std_logic_vector(SEC/10,DATAWIDTH); 83 SEC1 <=conv_std_logic_vector(SEC mod 10,DATAWIDTH); 84 85 Dynamic_Scan_inst: Dynamic_Scan PORT MAP (clk,HOUR10,HOUR1,MIN10,MIN1,SEC10,SEC1,ledag,sel); 86 end behave; 计数器模块较以往增加进位输出信号
01 library ieee; 02 use ieee.std_logic_1164.all; 03 use ieee.numeric_std.all; 04 entity counter is 05 generic 06 ( MIN_COUNT : natural := 0; 07 MAX_COUNT : natural := 9 ); 08 port 09 ( clk : in std_logic; 10 reset : in std_logic; 11 load : in std_logic; 12 enable : in std_logic; 13 carry_out: out std_logic; 14 d : in integer range MIN_COUNT to MAX_COUNT; 第 33 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
15 q : out integer range MIN_COUNT to MAX_COUNT ); 16 end entity; 17 architecture behave of counter is 18 begin 19 process (clk,reset) 20 variable cnt : integer range MIN_COUNT to MAX_COUNT; 21 begin 22 if reset = '1' then 23 cnt := 0; 24 carry_out<='0'; 25 elsif (rising_edge(clk)) then 26 if load ='1' then 27 cnt:= d; 28 carry_out<='0'; 29 elsif cnt=MAX_COUNT then 30 cnt:= MIN_COUNT; 31 carry_out<='1'; 32 elsif enable = '1' then 33 cnt := cnt + 1; 34 carry_out<='0'; 35 end if; 36 end if; 37 q <= cnt; 38 end process; 39 end behave;
与实验六不同,这次要在8个数码管上显示不同的数值(秒个位,秒十位,分个位,分十位,时个位,时十位),设计译码器电路,根据当前SEL选中的数码管,输出相应的显示内容给数码管的段码输入口。下面代码中的SEL来自数码管扫描电路输出的SEL,下面代码中的Disp_Temp输出给数码管扫描电路的switch输入。
01 library ieee; 02 use ieee.std_logic_1164.all; 03 use ieee.std_logic_unsigned.all; 04 entity Dynamic_Scan is 05 port(clk : in std_logic; --定义动态扫描时钟信号 06 --switch : in std_logic_vector(3 downto 0); --四位输入信号 07 HOUR10 : in std_logic_vector(3 downto 0); 08 HOUR1 : in std_logic_vector(3 downto 0); 09 MIN10 : in std_logic_vector(3 downto 0); 10 MIN1 : in std_logic_vector(3 downto 0); 11 SEC10 : in std_logic_vector(3 downto 0); 12 SEC1 : in std_logic_vector(3 downto 0); 13 ledag : out std_logic_vector(7 downto 0); --8 个数码管的8 段输出 14 sel : buffer std_logic_vector(2 downto 0) --8 个数码管的位选输出 第 34 页 共 37 页
数字逻辑电路设计实验教案赵蕙
15 ); 16 end Dynamic_Scan; 17 architecture behave of Dynamic_Scan is 18 signal Disp_Temp : std_logic_vector (3 downto 0); 19 begin 20 21 --三位计数器实现000~111 计数,计数器的输出作为数码管的SEL 选通信号。 22 process(clk) 23 variable count : std_logic_vector(2 downto 0); 24 begin 25 if clk'event and clk='1' then--检测时钟上升沿 26 count:=count+1;--计数器count 累加 27 end if; 28 sel<=count; 29 end process; 30 31 process(sel) 32 begin 33 case (sel) is 34 when \35 when \36 when \37 when \38 when \39 when \40 when \41 when \42 end case; 43 end process; 44 45 process(Disp_Temp) 46 begin 47 case Disp_Temp is 48 when \49 when \50 when \51 when \52 when \53 when \54 when \55 when \56 when \57 when \58 when \第 35 页 共 37 页
数字逻辑电路设计实验教案_指导教师赵蕙
59 when others => null; 60 end case; 61 end process; 62 63 end behave; 3. 逻辑综合 4. 布局布线
参考附录中FPGA管脚对应关系,根据自己的设计需要,为设计的输入输出端口分配引脚。
5. 编程 6. 验证
数码管上正确显示秒、分、时计数器的计数值后,给老师检查。
说明:本例作为数字逻辑实验的考核项目,靠的是同学们之前项目的积累,自己想办法实现,不限定必须使用指导中给出的方法,也不再给出详细的实验指导。大家也许要花费些力气,但相信同学们一定能够顺利完成。 第 36 页 共 37 页
数字逻辑电路设计实验教案赵蕙
附表 EDA/SOPC实验开发平台FPGA管脚对应关系
信号名称 D1 D2 D3 D4 D5 D6 A B C D E F K1 K2 K3 K4 K5 K6 S1 S2 S3 S4 R1 Y1 G1 CLK SPEAKER
EP1C12 IO接脚 A9 B9 A10 B10 A11 B11 H3 H4 K5 L5 K4 L3 A12 B12 B15 B14 A15 D16 A13 B13 B16 C16 F5 D3 D4 J4(GCLK1) N6 信号名称 D7 D8 D9 D10 D11 D12 G DP SEL0 SEL1 SEL2 12位拨动开关 K7 K8 K9 K10 K11 K12 S5 S6 S7 S8 R2 Y2 G2 扬声器输出模块 C17 E17 L7 E16 G5 H5 D17 D18 G6 H6 E3 E4 F3 EP1C12 IO接脚 F7 F6 E10 E8 F12 E11 L4 M3 G4 G3 F4 EDA/SOPC开发平台 12位LED灯显示模块 EDA/SOPC开发平台 八位七段数码管显示模块 EDA/SOPC开发平台 EDA/SOPC开发平台 8位按键开关模块 EDA/SOPC开发平台 交通信号灯模块 EDA/SOPC开发平台 EDA/SOPC开发平台 可调数字时钟模块CLK 第 37 页 共 37 页
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数字逻辑电路设计实验教案_赵蕙在线全文阅读。
相关推荐: