实验一 设计基本触发器
一 实验目的
1. 了解基本触发器的工作原理。
2. 学习Quartus II中基于原理图设计的流程。 二 硬件需求
1.EDA/SOPC实验箱一台。 三 实验原理
图2-14 基本触发器电路图 基本触发器的电路如下图2-14所示。它可以由两个与非门交叉耦合组成,也可以由两个或非门交叉耦合组成。现在以两个与非门组成的基本触发器为例,来分析其工作原理。根据与非逻辑关系,可以得到基本触发器的状态转移真值表及简化的真值表,如下表2-2所示: 状态转移真值表 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 不定 不定 表2-2 基本触发器状态转移真值表 简化真值表 0 1 1 0 1 0 1 0 0 1 Qn 不定 根据真值表,不难写出其特征方程:
其中式(2)为约束条件。 四 实验内容
本实验的任务就是利用Quartus II软件的原理图输入,产生一个基本触发器,触发器的形式可以是与非门结构的,也可以是或非门结构的。实验中用按键模块的用K1和K5来分别表示R和S,用LED模块的LED1_1和LED1_5分别表示Q和的情况下,观察Q和
的变化。
。在R和S满足式(2)
五 实验步骤
完成基本触发器的实验步骤如下: 1.首先打开Quartus II软件,新建一个工程,并新建一个Block Diagram/Schematic File。见图2-15。
图2-15 新建原理图文件
2.在新建的原理图中双击鼠标左键,在弹出的Symbol对话框中的Name栏中输入nand2(在右侧的窗口中就会出现一个二输入与非门符号),并打开Repeat-insert mode选项(此选项使得用户易于增加一个符号的多个实例)。见图2-16。
3.点击OK,在原理图文件中点击两次鼠标左键,然后点击鼠标右键并选择Cancel。此时,可以看到原理图中就会出现两个与非门。然后按照图2-10对其进行连线。见图2-17。 4.再次双击鼠标左键,在弹出的Symbol对话框中的Name栏中输入
图2-16 在Sysmbol
对话框中输入与非门
图2-17 正确连接后的原理图
图2-18 输入input实例
input,然后点击OK,在原理图中输入两个input实例,见图2-18。同样的步骤,在输入两个output实例。
5.把输入输出实例与原理图中的端口进行连接,并修改输入输出的Pin_Name分别为:输入为R和S,输出为Q和nQ。见图2-19。
图2-19 完整的原理图
6.点击File>Save,按照默认的值,点击OK即可。到此为止就完成了一个RS触发器的原理图输入。该文件存储的名称为exp1.bdf。
7.对自己画的bdf文件进行编译并仿真。
9.仿真无误后,根据附录一的引脚对照表,对实验中用到的拨挡开关 及LED进行管脚绑定,然后再重新编译一次。
10.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。 11.观察实验结果是否与自己的真值表相吻合。 六、实验报告要求
1.详细列出Quartus II中基于原理图设计的基本流程。 2.分析波形仿真的结果。
3.用VHDL语言重新设计本实验,并比较对于原理图和文本描述(VHDL)这两种设计输入方法的优劣心得。
实验三 BCD码加法器
一 实验目的
1. 了解BCD码的构成。
2. 了解BCD码加法器的原理。 3. 巩固对Quartus II的使用。
4. 进一步熟悉EDA/SOPC实验箱。 二 硬件需求
1.EDA/SOPC实验箱一台。 三 实验原理
BCD码是二进制编码的十进制码,也就是用4位二进制数来表示十进制中的0~9这十个数。由于4位二进制数有0000~1111共16种组合,而十进制数只需对应4位二进制数的10种组合,故从4位二进制数的16种组合中取出10种组合来分别表示十进制中的0~9,则有许多不同的取舍方式,于是便形成了不同类型的BCD码。
本实验我们只针对最简单的情况,也是最常见的BCD码,就是用4位二进制的0000~1001来表示十进制的0~9,而丢弃4位二进制的1010~1111共6种组合,这样一来,就相当于用4位二进制的0~9对应十进制的0~9。这样的BCD码进行相加时会出现两种可能,一种可能是当两个BCD码相加的值小于10时,结果仍旧是正确的BCD码;另外一种可能是当两个码相加的结果大于或者等于10时,就会得到错误的结果,这是因为4位二进制码可以表示0~15,而BCD码只取了其中的0~9的原因。对于第二种错误的情况,有一个简单的处理方法就是作加6处理,就会得到正确的结果。 下面举例说明第二种情况的处理过程。
假如A=(7)10=(0111)2=(0111)BCD,B=(8)10=(1000)2=(1000)BCD,那么A+B=(15)10=(1111)2≠(0001 0101)BCD。但是对于(1111)2+(0110)2=(0001 0101)2=(0010 0001)BCD。因此在程序设计时要注意两个输入的BCD码相加结果是否会出现大于或等于10的情况,如果是则必须作加6的修正处理。 四 实验内容
本实验的任务就是要完成一个简单的BCD码加法器。具体的实验过程就是利用EDA/SOPC实验箱上的拨挡开关模块的K1~K4作为一个BCD码输入,K5~K8作为另一个BCD码输入,用LED模块的LED1_1~LED1_4来作为结果的十位数输出,用LED1_5~LED1_8来作为结果的个位数输出,LED亮表示输出‘1’,LED灭表示输出‘0’。 五 实验步骤
完成BCD码加法器的实验步骤如下:
1.首先打开Quartus II软件,新建一个工程,并新建一个VHDL File。 2.按照自己的想法,编写VHDL程序。
3.对自己编写的VHDL程序进行编译并仿真。
4.仿真无误后,根据附录一的引脚对照表,对实验中用到的拨挡开关 及LED进行管脚绑定,然后再重新编译一次。
5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。 6.观察实验结果是否与自己的预期想法相吻合。 下面是VHDL源文件。
六、实验报告要求
1、总结VHDL设计文件的基本结构。
2、详细论述实验的原理及设计文件中各部分的作用与涵义。 3、分析仿真波形及实验结果。
4、如果输出结果m_Result用两个4位BCD码即十位:m_Result10和个位m_Result1表示,该如何修改设计文件?
4、写出设计过程的心得体会。
实验四 译码显示电路的设计
一、实验目的:
了解实验系统中8位七段数码管显示模块的工作原理,设计七段显示译码器电路模块,以备后面实验调用。
了解模块电路的设计方法。 了解管脚复用的设置方法。 二、硬件要求:
主芯片:EP1C6Q240C8,时钟,八位七段数码显示管,七位拨码开关。 三、实验内容:
1、用VHDL语言设计一个8421BCD码→七段数码管显示的译码器。进行编译并仿真,观察并分析波形。
2、用译码器文件生成可重复利用的电路模块——点击菜单:File→Create/Update→Create Symbol Files for Current File。
3、新建一个原理图文件,将刚才生成的电路模块“deled”调入原理图,按图4.3.1完成原理图的设计。
4、将原理图设置为顶层文件,重新编译、综合,选择器件、绑定管脚。
5、此时如果重新编译综合将出现错误提示“管脚被占用”。在本实验中须用到管脚复用,所以需要进行相关设置——依次点击菜单:Assingments→Device„„打开配置窗口,按下图所示配置好。重新编译、综合,并下载到FPGA中,用拨码开关设置输入的BCD码及其对应在数码管上显示的图形是否正确,用拨码开关调整sel片选地址,记录各个数码管的地址码。
四、实验原理:
四位拨码开关提供8421BCD码,经译码电路(DELED)后产生七段数码管的字形显示驱动信号(A…G)。三位拨码开关提供输出片选地址SEL[2..0]。 由SEL[2..0]和A..G决定了8位数码管中的哪一数码管显示和显示什么字形。
其参考电路图如图4.3.1。 五.实验连线:
1.输入信号:D[3],D[2],D[1],D[0]所对应的管脚同四位拨码开关相连;insel[2],insel[1],insel[0]与三位拨码开关相连。
2.输出信号:代表扫描片选地址信号SEL2,SEL1,SEL0的管脚同四位扫描驱动地址的低3位相连,最高位地址接“0”(也可悬空);
代表7段字码驱动信号ledag[0]——ledag[6]的管脚分别同扫描数码管的段输入a,b,c,d,e,f,g相连。
六.实验报告:
1、设计过程的心得体会。
2、分析deled模块仿真波形及实验结果。 3、模块电路的设计和调用方法。
4、字形编码的种类,即一个7段数码管可产生多少种字符,产生所有字符需多少根被
译码信号线?
5、如果数码管只用于显示0-9的数字,可对译码器设计文件怎样修改,使其更为简单
高效?
6、如果要用数码管表示一些特殊的符号,如“=”、“-”,对应的输入d[3..0]和输
出ledag[6..0]应怎么设置?
7、 如果有“1”——“8”8个数字,能不能在实验箱上的8个数码管上同时显示出来?
如何设计才能看到这8个数字“同时”显示的效果?
图4.3.1
附七段显示译码器DELED的VHDL源代码:
本实验也可以用时钟信号自动产生数码管地址码,从而得到动态显示的效果,程序代码如下:
实验五 模块化的层次电路设计
一、实验目的:
掌握模块化层次电路的设计方法。 了解VHDL设计时序逻辑电路的方法。
了解八位数码管动态扫描驱动的原理及设计方法。 二、硬件要求:
主芯片:EP1C6Q240C8,时钟,八位七段数码显示管,八位拨码开关。 三、实验内容:
1、新建一个工程,并将前面实验三和实验四设计好的BCD码加法器和译码显器的设计文件添加到当前工程(为便于文件管理,可先将其复制到当前工程所在文件夹)。
2、新建一个VHDL设计文档,设计一个数码管扫描驱动电路。
3、将上述三个文件生成模块电路,新建一个原理图设计文件,将三个模块添加到原理图,按图5.3.1连接好电路。
4、将原理图文件生成顶层文件,编译综合,绑定管脚后再重新编译综合并下载到FPGA中(clk绑定到始终模块的始终输出端)。(注意需进行管脚复用设置)
5、用拨码开关产生8421BCD码,观察数码管上的显示结果是否正确。调节时钟频率,感受“扫描”的过程,并观察字符亮度和显示刷新的效果。
四、实验原理:
八位拨码开关提供2个8421BCD码A和B,经BCD码加法器模块(exp3)输出相加结果——2位10进制的BCD编码m_Result[7..0],加法器的输入A[3..0]、B[3..0]和输出m_Result[7..0]送到数码管扫描驱动模块(sel_time),按clk时钟节拍,对应于数码管的地址码SEG_SEL[2..0]从“000”、“001”——“111”依次输出A、分隔符、B、分隔符、result高四位、result低四位„„的BCD编码(BCD_OUT[3..0])。SEG_SEL[2..0]用于选择数码管,BCD_OUT经译码电路(DELED)后产生七段数码管的字形显示驱动信号(A…G)。可通过调节时钟频率控制输出片选地址SEL[2..0]的变化快慢,从而控制八位数码管显示的亮度和刷新速度。调整时钟频率使数码管感觉不到闪烁(既各位数字好像“同时”显示在各个数码管上),且亮度适中。
其参考电路图如图4.3.1。 五.实验连线:
1.输入信号:A、B所对应的管脚同八位拨码开关相连; 2.时钟CLK 所对应的管脚同实验箱上的时钟源相连;
3.输出信号:代表扫描片选地址信号SEL2,SEL1,SEL0的管脚同三位扫描驱动地址相连;
代表7段字码驱动信号ledag[0..6]的管脚分别同扫描数码管的段输入a,b,c,d,e,f,g相连。 六.实验报告:
1、总结模块化层次电路设计的基本方法。
2、分析时序逻辑电路与组合逻辑电路在设计上有哪些不同。 3、分析数码管扫描驱动模块“sel_time”的设计思路。
4、分析八个数码管是如何显示几个不同的数字的?实验中最适当的时钟频率是多少? 4、如何修改译码模块“deled”使其显示出“+”、“-”、“=”等符号?
5、说说模块化层次电路设计与计算机高级语言中类和对象的使用有何异同之处? 6、设计过程的心得体会。
图5.3.1
附:数码管扫描驱动模块“sel_time”的VHDL源代码:
实验六 多功能数字钟
一 实验目的
1. 了解数字钟的工作原理。
2. 进一步熟悉用VHDL语言设计时序逻辑电路的方法以及编写驱动七段码管显示的
代码。
3. 进一步熟悉模块化层次电路的设计方法。 4. 掌握VHDL编写中的一些小技巧。 二 硬件需求
1.EDA/SOPC实验箱一台。 三 实验原理
多功能数字钟应该具有的功能有:显示时-分-秒、整点报时、小时和分钟可调等基本功能。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。
在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。
实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描的确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。
对于报警信号,由于实验箱上只有一个小的扬声器,而要使扬声器发声,必须给其一定频率的信号进行驱动,频率越高,声音越尖。另外由于人耳的听觉范围是300Hz~3.4KHz左右,所以设计时也要选择恰当的发声频率。 四 实验内容
本实验的任务就是设计一个多功能数字钟,要求显示格式为小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始报警,且前五次报警的声音频率较低,最后一次报警声音的频率较高,类似于收音机整点报时,即从xx-59-50秒开始,依次为嘀、嘀、嘀、嘀、嘀、嗒。系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。在整点前5秒,用一个LED指示灯闪烁提示(频率为几赫兹)。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。报时的喇叭采用实验箱的扬声器模块,整点报时时嘀声用1.25KHz(对10KHz信号进行8分频),嗒声用2.5KHz(对10KHz信号进行4分频)。另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。 五 实验步骤
完成多功能数字钟的实验步骤如下:
1.首先打开Quartus II软件,新建一个工程,并新建一个VHDL File。 2.按照自己的想法,编写VHDL程序。
3.对自己编写的VHDL程序进行编译并仿真。
4.仿真无误后,根据附录一的引脚对照表,对实验中用到的时钟信号、 按键开关、七段码管及扬声器输出进行管脚绑定,然后再重新编译一次。
5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。
6.按动S1和S2按键,观察时钟的小时和分钟会不会递增。
7.将时间调整到xx时59分,观察时钟到了第50秒时是否会发出嘀、嘀、嘀、嘀、嘀、嗒的报时声。
注意:此实验需管脚复用 下面是数字钟参考电路。
模块“all_clock”把1kHz时钟分频输出,其中:Clk_1Hz用于计时,Clk_1kHz用于数码管扫描,Clk_1250Hz用于扬声器发出“嘀”声,Clk_1250Hz用于扬声器发出“嗒”声。 count60、count24分别用于秒、分、时计数器。注意:分和时的计时时钟来自前一级的进位输出。另外count60中SetC用于强制输出进位,即用于调节分钟、小时。 alert用于计时到XX时59分50秒后进行报时及彩灯控制。
sel_time用于输出选通,即对于数码管地址SEG_SEL从\"000\"——\"111\"分别输出时十位、时个位、分隔符“-”(编码\"1111\")、分十位、分个位、分隔符“-”、秒十位、秒个位。
deled用于对BCD编码译码驱动数码管显示数字。
下面是完整VHDL程序,请参考例程按上图编写出各模块,对各个模块进行仿真;并用原理图作为顶层文件,完成整个设计。(注:整点报时模块alert可以不做,时、分调节可以不做)
去掉整点报时模块、时、分调节后的顶层电路如下图。
各模块代码如下: all_clock模块:
分、秒计时模块count60:
小时计时模块count24:
数码管扫描选通模块sel_time:
译码模块deled:
六、实验报告要求
1.详细论述各模块功能和设计思路。
2.分析“all_clock”、“count60”、“count24”三个模块的仿真波形及实验结果。 3.论述VHDL中端口、信号、变量有何异同? 4.实验的心得体会。
实验十二 数码锁
一 实验目的
1. 了解数码锁的工作原理。 2. 了解数码锁的实现方法。
3. 掌握4×4键盘的扫描的巧妙实现过程。 二 硬件需求
1.EDA/SOPC实验箱一台。 三 实验原理
数码锁又称密码锁,它只需要主人记住自己的开锁密码,开门时只需要将密码输入,就可以开门,所以密码锁的核心问题就是密码的比对问题。
假如密码锁有六位,那么在系统复位后,用户按键6次,输入一个完整的密码串,输入完6次后,系统进行比对,如果发现密码吻合,则开门,否则要求用户继续输入,如果连续3次输入的密码串都是错误的,则系统报警,直到输入正确的密码,报警声停止。
实验中还要用到4×4键盘,用于用户输入密码。系统需要完成4×4键盘的扫描,确定有键按下后需要获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,首先输出4列中的第一列为低电平,其它列为高电平,然后读取行值;然后再输出4列中的第二列为低电平,读取行值,依此类推,不断循环。系统在读取行值的时候会自动判断,如果读进来的行值全部为高电平,则说明没有按键按下,否则如果读进来的行值发现不全为高电平,则说明键盘整列中必定有至少一个按键按下,读取此时的行值和当前的列值,即可判断到当前的按键位置。获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。 四 实验内容
本实验需要完成的任务就是一个密码锁,考虑到系统中有键盘扫描、七段码管显示和报警,系统时钟选择时钟模块的10KHz时钟。键盘扫描和显示均是用1KHz(对系统时钟进行10分频),输入密码时,七段码管从右至左显示按键对应的数值,每按键(0~9)一次,显示左移一次,6次密码输入结束后系统开始校验,校验结束后,七段码管全灭。也就是显示部分维持的时间就是按键6次的时间和校验的时间。密码输入连续三次错误开始报警,报警声要求为高声2.5KHz,低声1.25KHz交替报警,交替周期为1s(1Hz时钟,需要对系统时钟进行10K分频)。实验中要求用LED模块的LED1_1指示键盘状态,如果有按键按下,LED1_1亮起,直到松开该按键;用LED2_1指示门的状态,也就是密码校验结果,如果密码校验正确,LED2_1亮起,否则如果密码校验错误LED2_1闪烁4次,然后熄灭,表明密码错误。系统的复位用主芯片模块的复位键,复位时,七段码管全部熄灭。 五 实验步骤
完成数码锁的实验步骤如下:
1.首先打开Quartus II软件,新建一个工程,并新建一个VHDL File。 2.按照自己的想法,编写VHDL程序。
3.对自己编写的VHDL程序进行编译并仿真。
4.仿真无误后,根据附录一的引脚对照表,对实验中用到时钟、七段码显示、4×4键盘、扬声器、按键以及LED对应的FPGA引脚进行管脚绑定,然后再重新编译一次。
5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。 6.测试数码锁的工作是否满足实验要求。 注意:此实验需管脚复用 以下是VHDL源码:要求在读懂源码基础上,增加一个预设密码的功能:用开关K1作为“预设密码”和“输入密码”的转换,当K1=1时,输入6位密码作为预设的密码,可以定义6个信号save1、save2……save6来存储预置的密码。当K=0时,为正常输入密码,将输入的密码与预置的密码进行比较。
实验设计的各模块图(无预设密码功能):
加上预设密码后的模块图(其中“mima”模块增加了一个输入“IN_FLAG”用于表示校验密码和设置密码两种状态)
其中,“Read_Keyboard”功能是键盘扫描并获取按下的键值(0~9用对应的BCD编码,其余用“1111”表示非法输入)。
Kc[3..0]为键盘列字符,如“1101”,其中为0的位对应于选择的行(如1101表示选择第二行)。
Kr[3..0]为键盘行字符,如“1110”,如为“1111”表示该行未按下任何键,其中为0的位对应于按下的列(如1110表示选择第一列)。
Key_State为按键状态,“0”表示无按键按下,“1”表示有按键按下。
“mima”模块功能是读取输入的键值并依次送入buff1~buff6,以提供显示(从左到右顺序),并在键入6个数字时根据IN_FLAG的值选择校验密码值或存储密码值,校验密码的情况通过open_Door、Error_Flag和Error_3输出,以提供彩灯和喇叭控制: IN_FLAG为输入选择,0时进行密码校验,1时设置密码。 open_Door:开门信号,密码校验通过时为“1”(持续5秒) Error_Flag:出错标志,密码校验错误时为“1”(持续4秒) Error_3:三次出错标志,三次密码校验错误时为“1”
buff1~buff6:六位密码输入,未输入的位用“1111”表示。
“manage”模块功能是根据开门或错误标志控制彩灯和喇叭,同时还负责对10KHz时钟分频输出1KHz信号。
SPK:扬声器输出,当三次错误后,按1Hz频率交替用高声2.5KHz,低声1.25KHz报警
Lamp[3..0]:彩灯输出,出错时一个灯按1Hz频率闪烁4秒,3次错误时4个灯按1Hz频率持续闪烁,开门时4个灯长亮(持续5秒)
“sel_time”模块功能是数码管动态扫描,并从选择对应的buff位按顺序输出到译码器译码显示。
“deled”模块功能是BCD译码输出。
实验时,可先做出“Read_Keyboard”模块,并将其中的kflag2——表示“前一刻键盘状态”输出到端口“PRE_KEY_STATE”,并建立下图所示的原理图,clk_1Hz用1Hz时钟输入。测试键盘输入模块,注意观察“KEY_STATE”、“PRE_KEY_STATE”、Kc_OUT、Kr_OUT、BCDOUT的状态的变化以及其时序关系。
完整的VHDL程序代码:
重写的各功能模块的代码:
六、实验报告要求
1.详细论述源码中实现各功能(特别是键盘输入和读取部分)的设计方法。 2.分析键盘输入模块的仿真波形。
3.详细论述实验的VHDL源码中是如何检测按键状态的跳变的?这与通常的检测时钟边沿的语句有何不同,为什么要采用这种方式?
4、6×6键盘有几种按键状态(不包括组合键),应该定义多少编码来表示?如果包含所有组合键,则用于表示按键状态的编码至少应定义为几位?
5、如果用“#”键作为功能键(类似PC键盘上的[Ctrl]键),如何输入“#+C”(类似于“Ctrl+C”)这种组合功能键?(只说思路,不用给出具体实现)
6、增加“预设密码”功能的设计思路及主要代码功能描述。 7、实验的心得体会。
因篇幅问题不能全部显示,请点此查看更多更全内容