第一篇:EDA课设电子琴设计.
武汉理工大学《电子线路EDA》课程设计 课程设计任务书
学生姓名:-专业班级:电子科学与技术0903班 指导教师: 李成军 工作单位: 信息工程学院 题 目: 简易电子琴设计 初始条件:
QUARTUS 软件,微机,EDA-IV型实验箱。课题要求:
结合所学的知识,利用QUARTUS采用VHDL语言设计乐曲演奏电路,可以演奏8个音符:1、2、3、4、5、6、7、1。
课题内容: 时间安排: 1、2011年6月11日集中,听老师作课设安排与报告格式要求说明。2、2012年6月12日至6月16日,选好课题,学习相关资料,开始课 设。3、2012年6月17日至6月19日,进行硬件调试。4、2012年6月20至6月21日,撰写实验报告。5、2012年6月22日,检查硬件,进行答辩,提交设计报告。
设计一个简易的八音符电子琴,可以通过按键输入来控制蜂鸣器输出不同音调。指导教师签名: 2012年 月 日 系主任(或责任教师)签名: 2012年 月 日 武汉理工大学《电子线路EDA》课程设计 目录
摘要................................................................................................................................3 Abstract..........................................................................................................................4 绪论................................................................................................................................5 1设计简介.....................................................................................................................6 1.1 课程设计的目的..............................................................................................6 1.2 课程设计的内容..............................................................................................6 2.VHDL简介.................................................................................................................7 2.1 VHDL的特点...................................................................................................7 2.2VHDL特点........................................................................................................8 2.3VHDL设计流程...............................................................................................8 3程序过程.....................................................................................................................9 3.1设计总体模块...................................................................................................9 3.2模块原理及程序...............................................................................................9
4波形仿真...................................................................................................................12 5总结体会...................................................................................................................13 参考文献......................................................................................................................14 附录 源程序................................................................................................................15 武汉理工大学《电子线路EDA》课程设计 摘要
随着基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制用计算机等领域的重要性日益突出。作为一个学电子信息专业的学生,我们必须不断地了解更多的新产品信息,这就更加要求我们对EDA有个全面的认识。本程序设计的是简易电子琴的设计。采用EDA作为开发工具,VHDL语言为硬件描述语言,QUARTUS作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,初步实现了设计目标。本程序使用的硬件描述语言VHDL,可以大大降低了硬件数字系统设计的入门级别,让人感觉就是C语言的近亲。通过老师的指导和自己的学习完成了预想的功能。关键词:电子琴 ;quartus;EDA;VHDL语言 武汉理工大学《电子线路EDA》课程设计
Abstract With the expansion and deepening of CPLD EDA technology development and applications, EDA technology in the electronic information, communication, automatic control computers and other areas of importance have become increasingly prominent.As an electronic information of professional students, we must continue to learn more about the new product information, it is even more we have a comprehensive understanding of EDA.The program design is the design of simple keyboard.Using EDA as a development tool, VHDL language for hardware description language, QUARTUS run as a program platform, the development of program debugging and running, the waveform simulation, the initial realization of the design goals.This program uses the hardware description language VHDL, can greatly reduce the entry level of the hardware design of digital systems, and close relatives of people feel is the C language.Through the guidance of their teachers and their own learning to complete the desired function.Keywords: electronic organ;the quartus;the EDA;VHDL language 武汉理工大学《电子线路EDA》课程设计
绪论
EDA是电子设计自动化(Electronic Design Automation)的缩写。EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言
HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。EDA技术使设计者的工作仅局限于利用软件的方式来完成对系统硬件功能的实现,可以说EDA技术的产生与发展是电子设计技术的一个巨大进步。EDA技术融合了众多电子设计技术和计算机辅助技术,使得它在现代电子学方面的应用越来越广泛,也成为电子、电气类大学生必须熟练掌握的一种设计工具。
硬件描述性语言HDL是EDA技术的重要组成部分,常见HDL的有VHDL、HDL、ABEL、Verilog、AHDL、SystemC等。其中VHDL、Verilog在现在的EDA设计中使用的最多,也拥有了几乎所有主流EDA工具的支持,而相对于其他语言VHDL更加完善。VHDL是英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Description Language,是硬件描述语言的业界标准之一。它作为一个规范语言和建模语言,具有与具体硬件电路无关及设计平台无关的特性,而且还有很强的电路行为描述和建模能力,能从多个层次的数字系统进行建模和描述,从而大大简化了硬件设计的任务,提高了设计效率和可靠性。武汉理工大学《电子线路EDA》课程设计 1设计简介
1.1 课程设计的目的
巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。为了进一步了解计算机组成原理与系统结构,深入学习EDA技术,用VHDL语言去控制将会使我们对本专业知识可以更好地掌握。
1.2 课程设计的内容
设计一个简易的八音符电子琴,它可通过按键输入来控制音响。当按下不同按键时,蜂鸣器发出不同频率声响,来实现简易电子琴功能。
武汉理工大学《电子线路EDA》课程设计 2.VHDL简介 2.1 VHDL的特点
VHDL语言功能强大、设计灵活。VHDL语言可以用简洁明确的源代码来描述复杂的逻辑控制,它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。VHDL还支持多种设计方法,既支持自底向上的设计,又支
持自顶向下的设计;既支持模块化设计,又支持层次化设计。由于VHDL已经成为IEEE标准所规定的硬件描述性语言,目前大多数EDA工具几乎都支持VHDL。因为VHDL易读和结构化且易于修改设计所以在硬件电路设计过程中,VHDL语言得到广泛应用。
VHDL语言独立于器件的设计与工艺无关。因而设计人员用VHDL进行设计时,不需要考虑选择器件得问题,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。
VHDL语言易于共享和复用。VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能。这个特点很好的符合了市场需求。对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述的设计转变成门级网表。
总之,由于VHDL语言有的这些优良的特点,它被广泛的应用在电子线路和电子系统的设计中。
武汉理工大学《电子线路EDA》课程设计 2.2VHDL优点
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(4)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
2.3VHDL设计流程
(1)设计输入根据电路设计所提出的要求,将程序输入到VHDL编辑器中去编辑。
(2)功能级模拟用VHDL,模拟器对编辑后的程序进行模拟,如果达不到设计要求,则可以重新修改程序,直到通过功能模拟。
(3)逻辑综合与优化 将通过功能模拟的程序放到VHDL编译器中,进行逻辑综合与优化。
(4)门级模拟对电路用VHDL。仿真器仿真。可对门级电路的延时、定时状态、驱动能力等进行仿真。如不符合要求,可重复步骤(3),再门级模拟,直到符合要求止。
(5)版图生成 用相应的软件处理后,就可以拿去制版。武汉理工大学《电子线路EDA》课程设计 3程序过程 3.1设计总体模块
图3-1电子琴总体模块
Clk为实验板时钟输入,key[7..0]分别对应八个按键输入,buz为输出端,连接蜂鸣器。
3.2模块原理及程序 1、2、3、4、5、6、7、1分别对应的频率分别为2616HZ、2936HZ、3295HZ、3490HZ、3920HZ、4399HZ、4940HZ、5232HZ。在程序里可以对20M时钟频率进行分频来得到所需频率而发出不同音调。
20M时钟要得到上面所需频率需要进行分频,分频系数分别为3822、3405、3034、2865、2551、2273、2024、1911,可以令时钟计数一定次数后反向从而达到分频的效果得到所需不同音调对应的频率。程序中定义8个常数来作为计数对应值:
constant duo : std_logic_vector(12 downto 0):=“0111011101110”;constant lai : std_logic_vector(12 downto 0):= “0110101001101”;constant mi : std_logic_vector(12 downto 0):= “0101111011010”;constant fa : std_logic_vector(12 downto 0):= “0101100110001”;constant suo : std_logic_vector(12
downto 0):= “0100111110111”;constant la : std_logic_vector(12 downto 0):= “0100011100001”;constant xi : std_logic_vector(12 downto 0):= “0011111101000”;武汉理工大学《电子线路EDA》课程设计
constant duo1 : std_logic_vector(12 downto 0):= “0011101110111”;8个按键分别对应8个频率的脉冲,当一个按键按下去后此时该按键对应引脚输入高电平,故可利用“01000000”这种形式来表示哪个按键按下,而不同按键对应不同频率输出。对应关系分别为:
“10000000”对应1的频率; “01000000”对应2的频率; “00100000”对应3的频率;
“00010000”对应4的频率; “00001000”对应5的频率; “00000100”对应6的频率; “00000010”对应7的频率; “00000001”对应1的频率;
故可用以下程序来实现不同按键对应不同频率的要求:
when“10000000”=>if(clk1 /= duo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;
(clk1 /= lai)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00100000”=>if(clk1 /= mi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;武汉理工大学《电子线路EDA》课程设计
when“00010000”=>if(clk1 /= fa)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00001000”=>if(clk1 /= suo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000100”=>if(clk1 /= la)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000010”=>if(clk1 /= xi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000001”=>if(clk1 /= duo1)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when others=>null;武汉理工大学《电子线路EDA》课程设计 4波形仿真
图4-1 波形仿真图
由仿真波形可以看到,当按键输入不同值时,蜂鸣器也将发出不同频率声响。武汉理工大学《电子线路EDA》课程设计
5总结体会
经过努力,简易电子琴的设计基本上完成了。在整个设计过程中,包括前期中期和后期,我都有着许多不同的体会:
1)这个设计的基本是接触一门新的语言并加以应用,对于我来说,没有想到的是入手的速度比我的预料快,在以前编程的基础上,从接触到开始动手编程的时间得到了很大的缩短。知识的接收速度在很大的程度上决定了动手的时间。
2)VHDL的编程与C语言的编程有着本质的不同,然而以往形成的旧编程习惯在VHDL编程中依然起着很大的作用。一通百通,不是没有道理的。对于学习新的知识并予以应用的信心,显得更足了。
3)VHDL的设计关键是电路逻辑设计,而一个程序的关键是总体设计。对于硬件设计接触不多的我们清楚这一点也许不无好处。
4)通过这个程序设计让我学会一种新的语言,对数字系统结构也有了更进一步的了解和认识,对我以后的学习有很大的帮助。希望其他人在看再做类似设计时有所借鉴。
通过几天的课程设计,我对数据库软件EDA技术、VHDL、等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高。武汉理工大学《电子线路EDA》课程设计
参考文献
[1]潘松 黄继业.EDA技术与VHDL(第二版).北京:清华大学出版社,2005.7 [2]康华光.电子技术基础.北京:高等教育出版社.2006.1 [3]付家才.EDA工程实践技术.北京:化学工业出版社,2007.1 [4]汉泽西.EDA技术及其应用.北京:北京航空航天大学出版社,2004.5 [5]赵刚.EDA技术简明教程.成都:四川大学出版社,2004.6 [6]章彬宏 周正林.EDA应用技术.北京:北京理工大学出版社,2007.7 [7]刘艳萍 高振斌 李志平.EDA实用技术及应用.北京:国防工业出版社,2006.1
武汉理工大学《电子线路EDA》课程设计 附录 源程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity music is port(clk:in std_logic;key:in std_logic_vector(7 downto 0);buz:out std_logic);end music;architecture beh of music is signal clk1:std_logic_vector(12 downto 0);constant duo : std_logic_vector(12 downto 0):=“0000000001110”;constant lai : std_logic_vector(12 downto 0):= “0000000001101”;constant mi : std_logic_vector(12 downto 0):= “0000000011010”;constant fa : std_logic_vector(12 downto 0):= “0000000010011”;constant suo : std_logic_vector(12 downto 0):= “0000000010010”;constant la : std_logic_vector(12 downto 0):= “0000000010001”;constant xi : std_logic_vector(12 downto 0):= “0000000010000”;constant duo1 : std_logic_vector(12 downto 0):= “0000000001111”;signal buzz:std_logic;signal key_out:std_logic_vector(7 downto 0);begin buz<=buzz;key_out<=key;process(clk)begin if clk'event and clk='1' then case key_out is when“10000000”=>if(clk1 /= duo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“01000000”=>if(clk1 /= lai)then clk1<=clk1+“0000000000001”;
else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00100000”=>if(clk1 /= mi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;武汉理工大学《电子线路EDA》课程设计 buzz<=not buzz;end if;when“00010000”=>if(clk1 /= fa)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00001000”=>if(clk1 /= suo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000100”=>if(clk1 /= la)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000010”=>if(clk1 /= xi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000001”=>if(clk1 /= duo1)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when others=>null;end case;end if;end process;end beh;武汉理工大学《电子线路EDA》课程设计 本科生课程设计成绩评定表
指导教师签字: 年 月 日
第二篇:EDA课设
EDA课程设计报告
课题名称:智力竞赛抢答器
班级:11电科2班
姓名:代维宽
学号:201114580207
同组人:闻仔逊
指导老师:贾默伊
任务书
一、用VHDL运用层次化设计方法设计一个小型数字系统
题目:智力竞赛抢答器
二、说明书内容:
1.系统设计要求(功能)2.系统设计方案(包括顶层电路图)3.VHDL源程序及仿真波形图 4.课程设计注释 5.设计解释、说明 6.独特之处
三、成绩评定
1.设计内容及掌握情况
2.说明书。包括电子档(各类文件的可执行性及说明书)和纸质
3.答辩情况
目录
第一章:系统设计
1系统设计要求„„„„„„„„„„„„„„„„„„„1 2系统设计方案„„„„„„„„„„„„„„„„„„„2 第二章:VHDL原程序及仿真波形图
1、抢答启动模块„„„„„„„„„„„„„„„„„„3(1)按键识别子模块„„„„„„„„„„„„„„„„„3(2)倒计时子模块„„„„„„„„„„„„„„„„„„5
2、选手抢答模块„„„„„„„„„„„„„„„„„„7(1)单个选手按键子模块„„„„„„„„„„„„„„„7(2)判断抢答选手子模块„„„„„„„„„„„„„„„9
3、加减分模块„„„„„„„„„„„„„„„„„„„11(1)组别判断子模块„„„„„„„„„„„„„„„„„11(2)加减及寄存器子模块„„„„„„„„„„„„„„„12(3)分数选择输出模块„„„„„„„„„„„„„„„„15
4、显示模块„„„„„„„„„„„„„„„„„„„„16
5、蜂鸣器模块„„„„„„„„„„„„„„„„„„„18
第三章设计心得及总结
智力竞赛抢答器
1系统设计要求
1.设计一智力竞赛抢答器,可同时供8名选手参加比赛。2.给节目主持人设置一个控制开关,控制系统清零和抢答开始。
3.抢答器具有锁存功能和显示功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示选手编号,同时扬声器响,禁止其他选手抢答。
4.抢答器具有抢答定时功能,时间由主持人确定。5.参赛选手在设定的时间内抢答有效,定时器停止工作。
6.如果定时时间到,无人抢答,本次抢答无效,系统报警,并封锁输入电路,禁止超时抢答,定时器显示00。
7.为每组设计一个计分电路,0~999分,可加分,也可减分。
对于一个抢答器系统,可将其分为五个模块:选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块。整体框图如下:
图一 总体框图
其中抢答启动模块具有启动抢答及启动定时功能,输出使能信号给选手识别模块,以及抢答剩余时间给显示模块;选手识别模块完成锁存抢答信号的功能,并输出选手号给显示模块;蜂鸣器对抢答成功以及超时鸣声报警;显示模块对输入的数据进行显示。
2系统设计方案
智力竞赛抢答器拟由单片CPLDFPGA来实现,经分析设计要求,拟定整个系统由五个单元组成,原理图如下所示:
主要VHDL源程序
1、抢答启动模块
启动模块除了有启动的功能外,还有启动定时的功能。定时时间分为5秒和20秒两种,使用两个按键对应两种限时抢答。
将本模块再划分为2个子模:一个模块完成按键识别的功能,另一模块完成倒计时功能。
1)按键识别子模块
按键的识别即对输入信号进行电平变化检测,电平发生跳变就认为是键被按下。但VHDL程序中一个结构体内不能同时对两个信号进行电平跳变的检测,所以对本模块的程序设计采用状态机来实现,并使用统一的时钟信号来扫描按键的电平状态。模块图如下:
图2 按键识别子模块
对START5和START20两个按键定义三种状态,START5按下为ST1状态,此时两个按键“START5&START20”输入电平为“01”;START20按下为ST2状态,此时电平为“10”;两个都没按下为ST0状态,此时电平为“11”。
本模块程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY START_5_20 IS PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--输出定时初值
S_FLAG:OUT STD_LOGIC);
--置数信号
END ENTITY;ARCHITECTURE ONE OF START_5_20 IS SIGNAL DATAIN:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);
--定义状态
SIGNAL C_ST:ST_TYPE;BEGIN
DATAIN<=START5&START20;
--两个输入信号放在一起判断 BEGIN
IF RST='0' THEN
--复位 B<=“0000”;A<=“0000”;C_ST<=ST0;S_FLAG<='0';ELSIF CLK1'EVENT AND CLK1='1' THEN CASE C_ST IS WHEN ST0=> IF DATAIN=“01” THEN
C_ST<=ST1;
--输入信号为01,转ST1状态 S_FLAG<='1';
--置数信号有效 B<=“0000”;A<=“0101”;
--定时初值“05” ELSIF DATAIN=“10” THEN
C_ST<=ST2;
--输入信号为10,转ST1状态
S_FLAG<='1';
--置数信号有效 B<=“0010”;A<=“0000”;
--定时初值“20”
ELSE C_ST<=ST0;--输入信号为11,保持ST0状态
END IF;
C_ST<=ST0;--防按键抖动,为11时才转ST0状态 S_FLAG<='0';
--置数信号无效
ELSE C_ST<=ST1;
--按键没弹起,继续等待
END IF;
ELSE C_ST<=ST2;END IF;PROCESS(RST,CLK1)WHEN ST1=>IF DATAIN=“11” THEN WHEN ST2=>IF DATAIN=“11” THEN C_ST<=ST0;S_FLAG<='0';WHEN OTHERS=>C_ST<=ST0;B<=“0000”;A<=“0000”;END CASE;END IF;END PROCESS;END ARCHITECTURE;本模块仿真波形如图所示。
图3 按键识别模块仿真波形
2)倒计时子模块
倒计时需要1Hz的脉冲输入,每来一个上升沿,进行一次减一运算,将结果输出到TIMEB、TIMEA;置数信号LOAD输入有效,读入B、A端口的数据;输入L_CR信号与选手识别模块连接,当选手抢答成功后,L_CR信号为0,将倒计时清0.;若倒计时到,没有选手抢答,则在SR1输出1使扬声器发声。同时输出信号给选手抢答模块,禁止选手抢答。
图4倒计时模块
本模块程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DE_COUNT IS PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE TWO OF DE_COUNT IS BEGIN
PROCESS(LOAD,L_CR,RST,CLK2)VARIABLE P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF LOAD='1' THEN P1:=B;P0:=A;
--指数信号有效,将B、A值读入P1、P0 ELSIF L_CR='0' THEN
--有选手抢答成功,L_CR输入为0,定时时间清0 P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='1';ELSIF RST='0' THEN P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='0';
ELSIF(CLK2'EVENT AND CLK2='1')THEN
IF P0=“0000” THEN
IF P1>0 THEN P1:=P1-1;P0:=“1001”;
--若个位为0,十位减1,个位赋为9 END IF;ELSE P0:=P0-1;
--若个位不为0,个位直接减一
IF P0=“0000” AND P1=“0000” THEN TIMEOUT<='0';SR1<='1';
--若时间到,输出锁存信号 END IF;END IF;
END IF;TIMEB<=P1;TIMEA<=P0;END PROCESS;END ARCHITECTURE;
程序中,因为每次减一后的时间值需要保存,用于下次继续减一,所以程序中使用了不完整的IF语句引入寄存器,用于保存每次减一后的时间值。P1、P0定义为变量而不是信号的原因是,变量的赋值是即时的,减一后可以马上进行判断;若定义为信号,不能即时进行判断,并且减一操作后的赋值要经过一个δ延时,程序不好控制。
本模块仿真波形如图所示:
图5 倒计时模块仿真波形
用元件例化语句将以上两个子模块组合,得到整个抢答启动模块。如下图所示:
图6 由两个子模块组成抢答启动模块
两个子模块组合的程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY STARTER IS PORT(CLK1,CLK2,L_CR,RST,START5,START20:IN STD_LOGIC;
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE THREE OF STARTER IS
COMPONENT START_5_20 IS
--调用元件START_5_20声明
PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
S_FLAG:OUT STD_LOGIC);END COMPONENT;COMPONENT DE_COUNT IS
--调用元件DE_COUNT声明
PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL m,n:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL p:STD_LOGIC;
--对应图7中的中间信号 BEGIN
--按照图7将两个元件连接起来
U1:START_5_20 PORT MAP(CLK1=>CLK1,START5=>START5,START20=>START20,RST=>RST,B=>m,A=>n,S_FLAG=>p);U2:DE_COUNT PORT MAP(CLK2=>CLK2,B=>m,A=>n,LOAD=>p,RST=>RST,L_CR=>L_CR,TIMEB=>TIMEB,TIMEA=>TIMEA, TIMEOUT=>TIMEOUT,SR1=>SR1);END ARCHITECTURE;
2、选手抢答模块
在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,所以将本模块划分为两个子模块:单个选手按键模块和判断抢答选手模块。最后将8个选手按键模块和1个判断抢答选手模块连接起来,得到整个选手抢答模块。
1)单个选手按键子模块
按键输入相当于该实体的时钟信号,键被按下,等于来一个脉冲,输出信号给判断模块进行选手号的判断。只要有选手抢答成功,相关模块会输出信号使8个按键模块的LOCK信号有效,禁止其他选手抢答。如图所示。
图7 单个选手按键模
本模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON1 IS PORT(LOCK , BUTTON , RST :IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END ENTITY;ARCHITECTURE B1 OF BUTTON1 IS BEGIN
PROCESS(RST , BUTTON)
--使用进程时刻监测RST、BUTTON信号 BEGIN
IF RST='0' THEN
PRESSED<='0';
--复位
IF LOCK='1' THEN
--键被按下并且LOCK信号无效 PRESSED<='1';
--则输出信号给判断模块 END IF;ELSIF BUTTON'EVENT AND BUTTON='0' THEN END IF;END PROCESS;END ARCHITECTURE;
图8 倒计时模块仿真波形
2)判断抢答选手子模块
本子模块接收8个按键子模块的输出信号,如收到1号子模块输出的高电平,则输出选手号“0001”;并发出信号使扬声器发声并控制8个按键子模块使它们的LOCK信号有效,禁止其他选手抢答。本子模块端口设置如图所示。
图9判断选手模块
本子模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IDENTIFIER IS
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF IDENTIFIER IS
SIGNAL P:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN
P<=PP8&PP7&PP6&PP5&PP4&PP3&PP2&PP1;
--8个输入放在一起判断 BEGIN
CASE P IS
WHEN “00000001”=>P_NUM<=“0001”;LOCK<='0';SR1<='1';--1号选手 WHEN “00000010”=>P_NUM<=“0010”;LOCK<='0';SR1<='1';--2号选手 WHEN “00000100”=>P_NUM<=“0011”;LOCK<='0';SR1<='1';--3号选手 WHEN “00001000”=>P_NUM<=“0100”;LOCK<='0';SR1<='1';--4号选手 WHEN “00010000”=>P_NUM<=“0101”;LOCK<='0';SR1<='1';--5号选手 WHEN “00100000”=>P_NUM<=“0110”;LOCK<='0';SR1<='1';--6号选手 WHEN “01000000”=>P_NUM<=“0111”;LOCK<='0';SR1<='1';--7号选手 WHEN “10000000”=>P_NUM<=“1000”;LOCK<='0';SR1<='1';--8号选手 WHEN OTHERS=>P_NUM<=“0000”;LOCK<='1';SR1<='0';PRO1:PROCESS(P)
--输入若发生变化,马上启动进程进行判断
END CASE;END PROCESS;END ARCHITECTURE;9
图10 判断抢答选手模块仿真波形
所以将以上两个子模块用元件例化语句连接起来,组成整个选手抢答模块,如下图所示
图11 选手抢答模块
实现程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON IS
PORT(P1,P2,P3,P4,P5,P6,P7,P8,RST,LOCK:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK_S,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE BB1 OF BUTTON IS COMPONENT BUTTON1 IS
--调用元件BUTTON1声明
PORT(LOCK,B,RST:IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END COMPONENT;COMPONENT IDENTIFIER IS
--调用元件IDENTIFIER声明
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);10 LOCK,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL a1,a2,a3,a4,a5,a6,a7,a8:STD_LOGIC;
--定义图12中的中间信号 BEGIN
--按照图12将两个元件连接起来
U1:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P1,RST=>RST,PRESSED=>a1);U2:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P2,RST=>RST,PRESSED=>a2);U3:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P3,RST=>RST,PRESSED=>a3);U4:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P4,RST=>RST,PRESSED=>a4);U5:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P5,RST=>RST,PRESSED=>a5);U6:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P6,RST=>RST,PRESSED=>a6);U7:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P7,RST=>RST,PRESSED=>a7);U8:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P8,RST=>RST,PRESSED=>a8);U9:IDENTIFIER PORT MAP(PP1=>a1,PP2=>a2,PP3=>a3,PP4=>a4,PP5=>a5,PP6=>a6,PP7=>a7,PP8=>a8,P_NUM=>P_NUM,LOCK=>LOCK_S,SR1=>SR1);END ARCHITECTURE;
3、加减分模块
加减分模块要识别按下的按键:加5分按键及减5分按键。所以采用状态机的方法来识别。将本模块划分为三个子模块:组别判断子模块,加减及寄存器子模块,分数选择输出子模块。
1)组别判断子模块
该模块要实现的功能是根据抢答成功的选手编号,判断出该选手属于哪组,并输出使能信号允许该组的分数寄存器进行加减操作。如图所示。
图12 组别判断模块
实现程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECODE IS PORT(CLK:IN STD_LOGIC;P_NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
EN1,EN2,EN3,EN4:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF DECODE IS
SIGNAL E:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
PROCESS(CLK)
--引入时钟信号,协调各部分电路的工作
BEGIN IF CLK'EVENT AND CLK='1' THEN
CASE P_NUM IS WHEN “0001”=>E<=“0001”;WHEN “0010”=>E<=“0001”;--
1、2号选手属第一组
WHEN “0011”=>E<=“0010”;WHEN “0100”=>E<=“0010”;--
3、4号选手属第二组 WHEN “0101”=>E<=“0100”;WHEN “0110”=>E<=“0100”;--
5、6号选手属第三组 WHEN “0111”=>E<=“1000”;WHEN “1000”=>E<=“1000”;--
7、8号选手属第四组 WHEN OTHERS=>E<=“0000”;
--其他情况则四个分数锁存器都不工作
END CASE;END IF;
END PROCESS;
EN4<=E(3);EN3<=E(2);EN2<=E(1);EN1<=E(0);END ARCHITECTURE;程序仿真波形如图所示:
图13 组别判断模块仿真波形
2)加减及寄存器子模块
本模块的状态机转换过程为:将ADD和SUB信号并置,并检测其电平变化。当ADD按下时,“ADD&SUB”的电平为“01”,弹起时恢复为“11”。当SUB按下时,“ADD&SUB”的电平为“10”,弹起时恢复为“11”。本模块另外还需实现的功能是寄存功能。如下图所示:
图14 加减及寄存器模块
实现程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER1 IS PORT(CLK,EN:IN STD_LOGIC;
ADD,SUB:IN STD_LOGIC;
AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF COUNTER1 IS SIGNAL A:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);SIGNAL C_ST:ST_TYPE;BEGIN A<=ADD&SUB;
--将ADD信号和SUB信号并置在一起判断
PROCESS(CLK)VARIABLE P2,P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF EN='1' THEN
--使能端有效,才对该分数寄存器进行操作
IF CLK'EVENT AND CLK='1' THEN
CASE C_ST IS
WHEN ST0=>IF A=“01” THEN--A为“01”,说明ADD按下
C_ST<=ST1;
--下一状态转ST1,以等待按键弹起
IF P0=“1001” THEN--个位为9,进1为0,再向十位进1
P0:=“0000”;
IF P1=“1001” THEN
--十位为9,进一为0
P1:=“0000”;
IF P2=“1001” THEN
--百位为9,进一为0
P2:=“0000”;
ELSE P2:=P2+1;
--百位不为9,百位加1
END IF;
ELSE P1:=P1+1;
--十位不为9,加一
END IF;
ELSE P0:=P0+1;
--个位不为9,加一
END IF;
ELSIF A=“10” THEN
--A为“10”,说明SUB按下
C_ST<=ST2;--下一状态转ST2,以等待按键弹起
IF(P2/=0 OR P1/=0 OR P0/=0)THEN
IF P0=“0000” THEN P0:=“1001”;
P1:=P1-1;--个位向十位借1 P2:=P2-1;--十位向百位借1
IF P1=“0000” THEN
ELSE P1:=P1-1;--十位不为0,直接减1
END IF;
P1:=“1001”;
ELSE P0:=P0-1;--个位不为0,直接减1
END IF;
END IF;
ELSE C_ST<=ST0;
END IF;WHEN ST1=>IF A=“11” THEN
--A为“11”,说明按键弹起
C_ST<=ST0;
--回到ST0继续监视按键
ELSE C_ST<=ST1;--否则等待按键弹起
END IF;
C_ST<=ST0;WHEN ST2=>IF A=“11” THEN
ELSE C_ST<=ST2;
END IF;WHEN OTHERS=>C_ST<=ST0;END CASE;END IF;END IF;
AA2<=P2;AA1<=P1;AA0<=P0;
--操作后的分数输出 END PROCESS;END ARCHITECTURE;
加减及寄存器模块仿真波形图如下:
图15 加减及寄存器模块仿真波形
图中,加分按键ADD按下,输出“010”;减分按键SUB按下,输出回到“000”;又来两个加分按键,输出“020”。当EN信号无效时,有按键按下输出不变。
3)分数选择输出模块
四组分数要显示出来,需要12个7段数码管。若只显示当前抢答成功选手的分数,则只需3个数码管。所以设置一个分数选择器,根据抢答成功的选手编号,选择其分数输出给显示模块显示。
程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUXX IS PORT(P_NUM,AA2,AA1,AA0,BB2,BB1,BB0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CC2,CC1,CC0,DD2,DD1,DD0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF MUXX IS BEGIN
PROCESS(P_NUM)
--P_NUM为选手编号
BEGIN
CASE P_NUM IS
WHEN “0001”=>D2<=AA2;D1<=AA1;D0<=AA0;WHEN “0010”=>D2<=AA2;D1<=AA1;D0<=AA0;--1号和2号选手为一组 WHEN “0011”=>D2<=BB2;D1<=BB1;D0<=BB0;WHEN “0100”=>D2<=BB2;D1<=BB1;D0<=BB0;--3号和4号选手为一组 WHEN “0101”=>D2<=CC2;D1<=CC1;D0<=CC0;WHEN “0110”=>D2<=CC2;D1<=CC1;D0<=CC0;--5号和6号选手为一组 WHEN “0111”=>D2<=DD2;D1<=DD1;D0<=DD0;WHEN “1000”=>D2<=DD2;D1<=DD1;D0<=DD0;--7号和8号选手为一组 WHEN OTHERS=>D2<=“0000”;D1<=“0000”;D0<=“0000”;
END CASE;
END PROCESS;END ARCHITECTURE;仿真波形如图所示。
图16分数选择输出模块仿真波形
4、显示模块
本模块根据送来的数据:抢答成功选手号,选手分数、倒计时时间,将相应的字形码送数码管显示。端口设置如图所示。
图17显示模块
图18数码管分配
显示0,“00111111”;3F;显示1,“00000110”;06;显示2,“01011011”;5B;显示3,“01001111”;4F;显示4,“01100110”;66;显示5,“01101101”;6D;显示6,“01111101”;7D;显示7,“00000111”;07;显示8,“01111111”;7F;显示9,“01101111”;6F;显示10,“00000000”;00;
17图中,BT为数码管的位选信号,SG为数码管的段选信号。另外图18为数码管的分配。左起第一位为选手编号,第3、4位为该选手的分数,最后两位为倒计时。程序如下:
LIBRARY IEEE;16
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAY IS
PORT(CLK:IN STD_LOGIC;SCORE2,SCORE1,SCORE0,P_NUMBER,TIMEB,TIMEA:IN BT,SG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF DISPLAY IS SIGNAL CNT8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P1:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
--时钟信号一来,显示下一位 CNT8<=CNT8+1;END IF;END PROCESS;BEGIN
CASE CNT8 IS
WHEN “000”=>BT<=“10000000”;A<=P_NUMBER;--第一位显示选手号
WHEN “001”=>BT<=“01000000”;A<=“1010”;
--第二位不用,灭
WHEN “010”=>BT<=“00100000”;A<=SCORE2;
--第三位显示分数百位
WHEN “011”=>BT<=“00010000”;A<=SCORE1;
--第四位显示分数十位
WHEN “100”=>BT<=“00001000”;A<=SCORE0;
--第五位显示分数个位
WHEN “101”=>BT<=“00000100”;A<=“1010”;
--第六位不用,灭
WHEN “110”=>BT<=“00000010”;A<=TIMEB;
--第七位显示倒计时十位
WHEN “111”=>BT<=“00000001”;A<=TIMEA;
--第八位显示倒计时个位 END CASE;P2:PROCESS(CNT8)
END PROCESS;BEGIN
CASE A IS
--根据数据选择相应的字形码送数码管显示
WHEN “0000”=>SG<=“00111111”;WHEN “0001”=>SG<=“00000110”;
WHEN “0010”=>SG<=“01011011”;WHEN “0011”=>SG<=“01001111”;
WHEN “0100”=>SG<=“01100110”;WHEN “0101”=>SG<=“01101101”;
WHEN “0110”=>SG<=“01111101”;WHEN “0111”=>SG<=“00000111”;
WHEN “1000”=>SG<=“01111111”;WHEN “1001”=>SG<=“01101111”;
WHEN “1010”=>SG<=“00000000”;WHEN OTHERS=>NULL;END CASE;P3:PROCESS(A)END PROCESS;END ARCHITECTURE;本模块仿真波形如图所示。
图19显示模块仿真波形
5、蜂鸣器模块
当SR1鸣声信号来时,输出CLK2(2KHz)驱动蜂鸣器发声。CLK1用于扫描SR1的电平变化,SR1上升沿来到,允许CLK2输出,并持续一段时间。模块图如下:
图20蜂鸣器模块
本模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SPEAKER IS PORT(CLK1,SR1,CLK2:IN STD_LOGIC;
S:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF SPEAKER IS TYPE ST_TYPE IS(ST0,ST1);SIGNAL C_ST:ST_TYPE;SIGNAL A:STD_LOGIC;BEGIN PROCESS(CLK1)
VARIABLE P:STD_LOGIC_VECTOR(7 DOWNTO 0);--P用于定时,使蜂鸣器发声持续
BEGIN
IF CLK1'EVENT AND CLK1='1' THEN
CASE C_ST IS WHEN ST0=>IF SR1='1' THEN
--SR1信号有上升沿
P:=“00111111”;18
C_ST<=ST1;A<='1';--蜂鸣器发声,开始定时
ELSE C_ST<=ST0;A<='0';--否则等待
END IF;
P:=P-1;C_ST<=ST1;
A<='0';--定时到,蜂鸣器停止发声 IF SR1='1' THEN
C_ST<=ST1;--等待系统复位 END IF;WHEN ST1=>IF P/=0 THEN
--定时还没到,等待
ELSE
ELSE C_ST<=ST0;--复位
END IF;WHEN OTHERS=>C_ST<=ST0;A<='0';END CASE;END IF;S<=CLK2 AND A;
--只有A为1时,蜂鸣器才发声 END PROCESS;END ARCHITECTURE;本模块的仿真波形如图所示。
图21 蜂鸣器模块仿真波形
3设计心得及总结
刚开始确定这个课题时,我首先确定了要用到哪些知识,主要是VHDL程序的设计,软件的仿真。首先我查阅课本质料,找了不少关于这方面的程序,尽量的把它们都弄懂了。然后我确定了总体方案,把整体方案划分成了几个模块,形成了一个整体的框架,然后各个击破。有了总体的思路做指导我很快我就仿真调试好了抢答启动模块选手抢答模块,这样一来就增加了我的信心,一鼓作气拿下了以后的模块。当然任何事情都不会一帆风顺,也遇到许多难题,不懂的地方我就请叫老师和同学,最后所有的模块都被我一个一个的做出来了,我很高兴,觉得我这两天来的努力没有白费。
此次课程设计不仅加强了我对专业知识的学习与了解,更有许多的感慨,主要有以下几点:
(1)加强了我们动手、思考和解决问题的能力。我们很少能有这种机会来锻炼自己,通过这次课程设计,起到了很好的锻炼效果。
(2)我在做课程设计同时也是对课本知识的巩固和加强,课本 的知识太多,平时课间的学习并不能很好的理解程序的功能,所以在这次课程设计过程中,我们了解了很多程序的功能,并且对于其在实际中的使用有了更多的认识。
(3)我们两人一组相互合作,共同解决问题也认识到了团队精神的重要性
最后,我要感谢老师和同学们给我的帮助,没有你们的帮助,我是不能完成此次课程设计的,真的很感谢你们!
第三篇:EDA课程设计 电子琴
简易电子琴的设计和实现
----结题报告
学号:110342241
姓名:章译文
一.设计要求
1.能发出1234567基本音。
2.能自动播放《偶像万万岁》和《梁祝》。3.能在数码管上显示弹奏时的音名。
二.设计原理分析
1.音阶的获得
系统要求要求用7个按键控制发声,我们用7个键盘来控制产生低音(或中音)段的7个音阶频率。所有的音名频率都是通过一个基准频率经过分频得到的。但部分分频过大的音频直接输出给扬声器,频率信号脉冲的占空比会非常窄,不能驱动扬声器工作。于是,我们设计了一个“带有预置数的计数器”来简化整个设计过程。将原频率分频成期望值的2倍频率信号。再通过二分频,驱动扬声器工作。
简易电子琴控制流程图
2.MUSICAL_NOTE内部电路
MUSICAL_NOTE内部电路
使用MUSICAL_NOTE电路,实现初值可变的计数器,并对音阶实现二分频,使电子琴实现正常发音。
按键播放部分电路
3.自动播放功能的实现
自动播放部分电路
Hebing.mif文件(偶像万万岁&梁祝)
歌曲长度为352位,利用三个74261设计0~352的计数器,自动寻址,将音频导入lpm_rom,与MUSICAL_NOTE相互作用,实现自动播放。
按键除颤电路原理图
作为机械开关的键盘,在按键操作时,机械触点的弹性及电压跳动等原因,再触点闭合或者开启的瞬间会出现电压的抖动,如果不进行处理就会造成误操作。按键去抖动的关键在于提取稳定的低电平状态,滤去前沿后沿的抖动毛刺。4.在数码管上显示弹奏时的音名
显示部分电路图
Display内部电路
电路中的74161是16进制的计数器,它的低三位接到3—8译码器模块74138的地址输入端,这样就可以实现74138的8个输出端轮流输出低电平,恰好用来控制“位码”DIG7~DIG0。LPM_MUX是QuartusⅡ中的宏模块,用来实现多位的“多选一”,它的数据位数可以以及数据的数量可以任意设定。
电路中使用了与非门,实现发音与现实同时实现,在此要注意的是,因为使用了与非门,静态字符现实数码管管脚的设定值应该与原值相反。
三.设计原理图
简易电子琴原理图
根据以上分析,将三个模块组合,便得到了简易电子琴的整体设计。在整体设计的过程中,要注意三个模块之间的关系,使其能够相互作用,正常发音和显示。
四.实验总结 在这三天的实验过程中,通过对于实验目的的分析,有目标的查找资料,研读教材,在分清楚模块的基础上,写下了实验计划,规划好时间,确定每天要做的事。在实验的第一天,实现了按键发音,同时,也基本弄清楚了自动播放的原理,有了设计思路,第二天上午,完成了自动循环播放的功能,下午在同学的帮助下,确定了数码管显示的基本思路,通过对于以前知识的复习和查找,成功实现了数码管的显示功能。
在实验的过程中,也遇到很多的困难。在自动播放的时候,由于没有修改hebing.mif的进制,音乐总不能正常播放。还有就是在数码管显示的时候,一开始没有弄清与非门的作用,显示的数字总是反着的。后来经过冷静的分析,在老师和同学的帮助下,成功完成了电子琴的设计,实现了所有的功能。当然,设计也还有很多可以完善和改进的地方,在以后的学习过程中,我会更加用心,多做,多思考。
这次课程设计,我受益匪浅,这种认真研读,查找资料,动手操作的学习方式,应该贯彻到每一门课程的学习,也应该贯彻到我们的生活中。一直保持这样的方式,不管做什么事,都会取得很好的结果。
第四篇:EDA简易数字频率计~课设报告
EDA课程设计~简易数字频率计
《EDA技术》课程设计报告
题目:简易数字频率计
专业:
本组成员:
简述
EDA课程设计~简易数字频率计
随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青睐。目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。为了克服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。其设计的灵活性使得EDA技术得以快速发展和广泛应用。以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
EDA技术已经广泛应用于模拟与数字电路系统等许多领域。电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。
1.设计概述
EDA课程设计~简易数字频率计
1.1设计原理
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
本设计中使用的就是直接测频法,即用计数器在计算1s内输入信号周期的个数,其测频范围为1Hz~9999Hz。
1.2原理框图
1.3 系统原理图
系统原理图仿真
EDA课程设计~简易数字频率计
分析说明:clk为1HZ,待测信号sig为10HZ 1.5 引脚图
2.设计思路
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求测频控制信号发生器testpl的计数使能信号tsten能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的使能端en进行同步控制。当tsten为高电平“1”时,允许计数;为低电平“0”时停止计数,并保持其计数结果。在停止计数期间,首先需要一个锁存信号load的上跳沿将计数器在前1 秒种的计数值锁存进16位锁存器reg16b中。锁存信号之后,必须有一个清零信号clr_cnt对计数器进行清零,为下1 秒的计数操作做准备。,然后由外部数码管控制器ledcom控制的7段译码器ymq译出,并稳定显示。
3.模块划分
3.1 测频控制信号发生器testpl模块:
输入端clk收到1Hz信号后,其输出端testen控制各个cnt10的使能,clr_cnt控制各个cnt10的清零,load控制锁存器内数据的输出。
仿真图如下:
EDA课程设计~简易数字频率计
3.2 十进制计数器cnt10模块:
有一时钟使能输入端en,用于锁定计数值。当高电平“1”时计数允许计数,低电平“0”时禁止计数。多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
仿真图如下:
3.3 16位锁存器reg16b模块:将已有16 位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
仿真图如下:
EDA课程设计~简易数字频率计
3.4 数码管控制器ledcom模块:两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
仿真图如下:
3.5
译码器ymq模块:输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平“1”可以使四个数码管的小数点不显示。经译码器的处理输出后数码管显示相应的数值。
EDA课程设计~简易数字频率计
4.VHDL顶层文件:
library ieee;use ieee.std_logic_1164.all;entity lx is port(clk: in std_logic;led: out std_logic_vector(7 downto 0);ledc: out std_logic_vector(2 downto 0));end lx;architecture art of lx is--十进制计数器
component cnt10--待调用的有时钟使能的十进制计数器端口定义
port(clk,clr,en: in std_logic;q: out std_logic_vector(3 downto 0);c10: out std_logic);end component;--16位锁存器
component reg16b--待调用的32位锁存器端口定义 port(load: in std_logic;din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end component;--测频控制器
component testpl--待调用的测频控制信号发生器端口定义 port(clk:in std_logic;
EDA课程设计~简易数字频率计
tsten:out std_logic;clr_cnt:out std_logic;load:out std_logic);end component;--数码管选择器
component ledcom--待调用的数码管选择器端口定义 port(clk:in std_logic;datain: in std_logic_vector(15 downto 0);dataout: out std_logic_vector(3 downto 0);sel: out std_logic_vector(2 downto 0));end component;--译码器
component ymq--待调用的译码器端口定义 port(d_in: in std_logic_vector(3 downto 0);d_out: out std_logic_vector(7 downto 0));end component;signal clk1,clk2,clk3: std_logic;--clk1为1Hz信号,clk2为被测信号,clk3为数码管扫描信号
signal tsten,clr,load: std_logic;signal c1,c2,c3,c4: std_logic;signal qout,rout: std_logic_vector(15 downto 0);signal datao: std_logic_vector(3 downto 0);begin u0:testpl port map(clk1,tsten,clr,load);u1:cnt10 port map(clk2,clr,tsten,qout(3 downto 0),c1);u2:cnt10 port map(c1,clr,tsten,qout(7 downto 4),c2);u3:cnt10 port map(c2,clr,tsten,qout(11 downto 8),c3);u4:cnt10 port map(c3,clr,tsten,qout(15 downto 12),c4);u5:reg16b port map(load,qout(15 downto 0),rout);u6:ledcom port map(clk3,rout,datao,ledc);u8:ymq port map(datao,led);end art;
5.心得体会
这次课程设计中,我不仅复习巩固了课堂所学的理论知识,提高
EDA课程设计~简易数字频率计
了对所学知识的综合应用能力,并从根本上了解了VHDL语言的一些基本用法,应用了原来不会或者不熟练的句型,如if句,case句等,也学会了一些基本功能的实现方法,如分频,状态控制等等,从另外一个角度重新审视了上学期完全从硬件角度出发的电路设计,明白了软硬件之间的交互。通过这个课题,对系统框图、逻辑流程图、状态转移图的设计有了一定的了解。也懂得了系统的前期设计对于后续的编程和调试的重要性。
本课题采用了自下而上的设计方法,根据系统对硬件的要求,画出系统控制流程图;然后根据控制流程图,分化模块,利用模块实现功能;最后进行仿真和调试。
每个成功的背后都要面对无数次的失败,这次课设也不例外。虽然遇到不少问题与困难,但通过老师以及同学的帮助,都一一得到顺利地解决。我想这必定会为将来的实践积累宝贵的经验和教训。总之,这次课设我们都受益匪浅。整个过程氛围浓厚,本人也态度十分认真,积极向老师和同学求教并在此过程中收获良多,能够进一步了解和使用一门与硬件直接打交道的基本语言对我们将来的学习和工作都会十分有益。
6.五个模块的程序源代码
6.1 测频控制信号发生器
EDA课程设计~简易数字频率计
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity testpl is port(clk:in std_logic;--1Hz信号
tsten:out std_logic;--计数器使能信号 clr_cnt:out std_logic;--计数器清零信号 load:out std_logic);--锁存器输出控制信号 end testpl;architecture art of testpl is signal div2clk:std_logic;begin process(clk)begin if clk'event and clk='1'then div2clk<=not div2clk;--div2clk为2Hz end if;end process;process(clk ,div2clk)begin if(clk='0'and div2clk='0')then clr_cnt<='1';--当div2clk与clk同时为零时计数器清零 else clr_cnt<='0';--当div2clk处于的高电平时计数器计数 end if;end process;load<=not div2clk;--锁存器输出与计数器使能信号反相 tsten<=div2clk;end art;
有时钟使能的十进制计数器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 is port(clk,clr,en: in std_logic;--clk:计数器时钟,clr:清零信号,en:计数使能信号
q: out std_logic_vector(3 downto 0);--q:4位计数结果输出
EDA课程设计~简易数字频率计
c10: out std_logic);--计数进位
end cnt10;architecture art of cnt10 is signal cqi: std_logic_vector(3 downto 0);begin process(clk,clr)begin if clr='1' then cqi<=“0000”;--当输入的clr_cnt为低电平0时清零
elsif clk'event and clk='1' then if en='1' then--当输入的tesen为高电平1时允许计数
if(cqi<9)then cqi<=cqi+1;else cqi<=“0000”;--等于9则计数器清零
end if;--当输入的tesen为低电平0时禁止计数,锁定计数值 end if;end if;end process;--产生进位 process(cqi)begin if cqi=“1001” then c10<='1';--当加的9时产生进位输出 else c10<='0';end if;end process;q<=cqi;end art;
16位锁存器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reg16b is port(load: in std_logic;--输出锁存控制信号 din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end reg16b;
EDA课程设计~简易数字频率计
architecture art of reg16b is begin process(load,din)begin if load'event and load='1'then--load为高电平时teten为低电平,计数器禁止
dout<=din;--锁存输入的数据 end if;end process;end art;
6.4 数码管控制器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledcom is port(clk:in std_logic;--数码管扫描频率
datain: in std_logic_vector(15 downto 0);--锁存器输入的16位信号 dataout: out std_logic_vector(3 downto 0);--输出至译码器的4位信号
sel: buffer std_logic_vector(2 downto 0));--输出数码管选择信号 end ledcom;architecture art of ledcom is begin--sel同扫描频率clk循环变化 process(clk)begin if rising_edge(clk)then if sel>=7 then
sel <=“000”;
else sel<=sel+1;end if;end if;
end process;--数码管选择 process(sel,datain)
begin case sel is when “000”=> dataout<=datain(3 downto 0);
EDA课程设计~简易数字频率计
when “001”=> dataout<=datain(7 downto 4);when “010”=> dataout<=datain(11 downto 8);when “011”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art;
七段数码管的译码器
library IEEE;use IEEE.std_logic_1164.all;entity ymq is port(d_in: in std_logic_vector(3 downto 0);--数码管控制器输入四位信号
d_out: out std_logic_vector(6 downto 0));--输出8位信号
end ymq;--第8位d_out[7]为逗号 architecture art of ymq is begin process(d_in)begin case d_in is--第8位为1高电平逗号不显示 when “0000” => d_out<=“1111110”;--0 when “0001” => d_out<=“0110000”;--1 when “0010” => d_out<=“1101101”;--2 when “0011” => d_out<=“1111001”;--3 when “0100” => d_out<=“0110010”;--4 when “0101” => d_out<=“1011011”;--5 when “0110” => d_out<=“1011111”;--6 when “0111” => d_out<=“1110000”;--7 when “1000” => d_out<=“1111111”;--8 when “1001” => d_out<=“1111011”;--9 when others =>NULL;end case;end process;end art;7.参考文献
1、王小军 主编.《VHDL简明教程》.清华大学出版社,1997
EDA课程设计~简易数字频率计
2、潘松、王国栋 主编.《VHDL应用教程》电子科技大学出版社,2000
3、甘历 主编.《VHDL应用于开发实践》科学出版社,2003
4、刘爱荣 主编.《EDA技术与CPLD/FPGA开发应用简明教程》.清华大学出版社,2007
第五篇:可控脉冲发生器的设计EDA课设报告资料
可控脉冲发生器的设计
一、设计目的
1.了解可控脉冲发生器的实现机理。2.学会用示波器观察FPGA产生的信号。3.学习用VHDL编写复杂功能的代码。
二、设计原理
1.EDA是电子设计自动化(Electronic Design Automation)的缩写。EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。EDA技术使设计者的工作仅局限于利用软件的方式来完成对系统硬件功能的实现,可以说EDA技术的产生与发展是电子设计技术的一个巨大进步。EDA技术融合了众多电子设计技术和计算机辅助技术,使得它在现代电子学方面的应用越来越广泛,也成为电子、电气类大学生必须熟练掌握的一种设计工具。
2.VHDL是英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Description Language,是硬件描述语言的业界标准之一。VHDL语言功能强大、设计灵活。VHDL语言可以用简洁明确的源代码来描述复杂的逻辑控制,它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。VHDL还支持多种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
由于VHDL已经成为IEEE标准所规定的硬件描述性语言,目前大多数EDA工具几乎都支持VHDL。因为VHDL易读和结构化且易于修改设计所以在硬件电路设计过程中,VHDL语言得到广泛应用。
VHDL语言易于共享和复用。VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能。这个特点很好的符合了市场需求。对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述的设计转变成门级网表。总之,由于VHDL语言有的这些优良的特点,它被广泛的应用在电子线路和电子系统的设计中。
3.Quartus II是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,Quartus II通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
4.脉冲发生器就是要产生一个脉冲波形,而可控脉冲发生器则是要产生一个周期和占空比可变的脉冲波形。可控脉冲发生器的实现原理比较简单,可以简单的理解为一个计数器对输入的时钟信号进行分频的过程。通过改变计数器的上限值来达到改变周期的目的,通过改变电平翻转的阈值来达到改变占空比的目的。下面举个简单的例子来说明其工作原理。
假如有一个计数器T对时钟分频,其计数的范围是从0~N,另取一个M(0≤M≤N),若输出为Q,那么Q只要满足条件
时,通过改变N值,即可改变输出的脉冲波的周期;改变M值,即可改变脉冲波的占空比。这样输出的脉冲波的周期和占空比分别为:
1Q00TMMTN周期(N1)TCLOCKM占空比100%N
1三、设计内容
编写实现可控脉冲发生器程序,通过脉冲周期和占空比改变实现不同脉冲的输出。用QuartusII软件对设计进行编译、综合、仿真,给出相应的时序仿真波形和硬件电路图。
四、设计流程 1.程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CC IS
PORT(CLK: IN STD_LOGIC;
--时钟输入
RST : IN STD_LOGIC;
--复位输入
NU,ND : IN STD_LOGIC;
--输入:控制频率的改变
MU,MD : IN STD_LOGIC;
--输入:控制占空比的改变
FOUT : OUT STD_LOGIC
--波形输出);
END CC;ARCHITECTURE BEHAVE OF CC IS SIGNAL N_BUFFER,M_BUFFER:STD_LOGIC_VECTOR(10 DOWNTO 0);SIGNAL N_COUNT :STD_LOGIC_VECTOR(10 DOWNTO 0);SIGNAL CLKIN : STD_LOGIC;SIGNAL CLK_COUNT : STD_LOGIC_VECTOR(12 DOWNTO 0);--产生一个低速时钟,用于按键判断
BEGIN
PROCESS(CLK)
--计数器累加
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(N_COUNT=N_BUFFER)THEN
N_COUNT<=“00000000000”;
ELSE
N_COUNT<=N_COUNT+1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK)
--波形判断
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(N_COUNT FOUT<='1';ELSIF(N_COUNT>M_BUFFER AND N_COUNT THEN 6 FOUT<='0'; END IF; END IF; END PROCESS; PROCESS(CLK) BEGIN IF(CLK'EVENT AND CLKIN='1')THEN CLK_COUNT<=CLK_COUNT+1; END IF; CLKIN<=CLK_COUNT(12); END PROCESS; PROCESS(CLKIN) --频率及占空比的改变1 BEGIN IF(CLK'EVENT AND CLKIN='0')THEN IF(RST='0')THEN M_BUFFER<=“01000000000”; N_BUFFER<=“10000000000”; ELSIF(NU='0')THEN 7 N_BUFFER<=N_BUFFER+1; ELSIF(ND='0')THEN N_BUFFER<=N_BUFFER-1; ELSIF(MU='0')THEN M_BUFFER<=M_BUFFER+1; ELSIF(MD='0')THEN M_BUFFER<=M_BUFFER-1; END IF; END IF; END PROCESS;END BEHAVE; 2.管脚分配: 3.时序仿真图: 4.硬件电路图: 5.现象: 五、心得体会 通过这次EDA课程设计,我对课堂上所学到的理论知识的理解加深了许多,自己动脑、动手设计的能力也得到了较大提高。 在这次课程设计的过程中,我对VHDL语言有了更深的认识。通过查阅相关资料和动手设计我发现我以前对VHDL语言的认识太过肤浅,认为VHDL语言只能用于设计小型的电路系统。但有了更深刻的认识之后我发现学好VHDL语言可以设计出大规模的、功能复杂的电路系统。以前之所以会有错误的认识是因为自己对VHDL语言的了解和掌握还不够。现在仔细想想,这次课程设计使得我对VHDL语言的理解与应用能力得到了较大的提升,也让我认识到只要升入学习,提升的空间永远的存在的。 另一方面我也发现了动手实践的重要性。动手实践是理论知识得以灵活运用的必要前提,也是今后今后走上工作岗位之后能够很好的完成设计工作的技术保证。只有遇到实际问题并根据自己对课堂上获得的专业知识的理解来解决它才能真正的提高自己的能力。这也提醒我在平时的学习生活中不能一味埋头于课本知识,当今社会竞争越来越激烈,社会对人才的要求越来越全面,只有理论知识是远远不够的,必须靠动手能力做支撑。因此在学习之余我们应该积极参加各种与专业知识有关的实践活动和知识竞赛,巩固所学的理论知识,多注重培养实际动手能力和专业技术能力,这样才能在以后的工作岗位上有所作为。 数字秒表设计 一、设计目的 本设计的任务就是设计一个数字钟,要求显示格式为小时-分钟-秒钟。系统时钟选择时钟模块的50MHz,要得到1Hz时钟信号,必须对系统时钟进行50000000次分频。用S1按键作为系统时钟复位,复位后全部显示00-00-00。 二、设计原理 数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。 三、设计主要内容 本设计要求掌握使用QuartusII设计数字系统的设计思路和设计方法。学习VHDL基本逻辑电路的综合设计应用。掌握VHDL语言的语法规范,掌握时序电路描述方法。掌握多个数码管动态扫描显示的原理及设计方法。 设计一个由共阴八位数码管作为显示、按键作为控制系统的数字钟电路,要求利用实验室设备完成系统设计并运行调试。 四、设计流程 1.程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity stopwatch is port(Clk : in std_logic; --时钟输入 reset : in std_logic; --复位输入 start,over : in std_logic; --秒表控制输入 ledag : out std_logic_vector(6 downto 0);--七段码管显示输出 SEL : buffer std_logic_vector(2 downto 0)--七段码管扫描驱动); end stopwatch;architecture behave of stopwatch is signal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(6 downto 0); signal mSEC1,mSEC10 : integer range 0 to 9; signal SEC1,SEC10 : integer range 0 to 9; signal MIN1,MIN10 : integer range 0 to 9; signal HOUR1,HOUR10 : integer range 0 to 9; signal Clk1kHz : std_logic; signal Clk100Hz : std_logic; signal Start_Flag : std_logic; signal Music_Count : std_logic_vector(2 downto 0); begin PROCESS(clk)--generate 100hz clock signal variable cnt : INTEGER RANGE 0 TO 499999;--产生100Hz时钟的分频计数器 BEGIN IF clk='1' AND clk'event THEN IF cnt=499999 THEN cnt:=0; ELSE IF cnt<250000 THEN clk100hz<='1'; ELSE clk100hz<='0'; END IF; cnt:=cnt+1; END IF; END IF; END PROCESS; PROCESS(clk)--generate 1khz clock signal variable cnt1 : INTEGER RANGE 0 TO 49999;--产生1kHz时钟的分频计数器 BEGIN IF clk='1' AND clk'event THEN IF cnt1=49999 THEN cnt1:=0; ELSE IF cnt1<25000 THEN clk1khz<='1'; ELSE clk1khz<='0'; END IF; cnt1:=cnt1+1; END IF; END IF; END PROCESS; process(Clk100Hz) begin if(reset='0')then --系统复位 mSEC1<=0; mSEC10<=0; SEC1<=0; SEC10<=0; MIN1<=0; MIN10<=0; HOUR1<=0; HOUR10<=0; Start_Flag<='0'; elsif(start='0' and Start_Flag='0')then Start_Flag<='1'; elsif(over='0' and Start_Flag='1')then Start_Flag<='0'; elsif(Clk100Hz'event and Clk100Hz='1')then --正常运行 if(Start_Flag='1')then if(mSEC1=9)then mSEC1<=0; if(mSEC10=9)then mSEC10<=0; if(SEC1=9)then SEC1<=0; if(SEC10=5)then SEC10<=0; if(MIN1=9)then MIN1<=0; if(MIN10=5)then MIN10<=0; if(HOUR1=9)then HOUR1<=0; if(HOUR10=9)then HOUR10<=0; else HOUR10<=HOUR10+1; end if; else HOUR1<=HOUR1+1; end if; else MIN10<=MIN10+1; end if; else MIN1<=MIN1+1; end if; else SEC10<=SEC10+1; end if; else SEC1<=SEC1+1; end if; else mSEC10<=mSEC10+1; end if; else mSEC1<=mSEC1+1; end if; end if; end if; end process; process(SEL) begin if(HOUR1=0)then case(SEL+1)is when “111”=>Disp_Temp<=mSEC1; when “110”=>Disp_Temp<=mSEC10; when “101”=>Disp_Temp<=10; when “100”=>Disp_Temp<=SEC1; when “011”=>Disp_Temp<=SEC10; when “010”=>Disp_Temp<=10; when “001”=>Disp_Temp<=MIN1; when “000”=>Disp_Temp<=MIN10; end case; else case(SEL+1)is when “111”=>Disp_Temp<=SEC1; when “110”=>Disp_Temp<=SEC10; when “101”=>Disp_Temp<=10; when “100”=>Disp_Temp<=MIN1; when “011”=>Disp_Temp<=MIN10; when “010”=>Disp_Temp<=10; when “001”=>Disp_Temp<=HOUR1; when “000”=>Disp_Temp<=HOUR10; end case; end if; end process;process(Clk1khz) begin if(Clk1khz'event and Clk1khz='1')then --扫描累加 SEL<=SEL+1; ledag<=Disp_Decode; end if; end process; process(Disp_Temp) --显示转换 begin case Disp_Temp is when 0=>Disp_Decode<= “0111111”; --0 when 1=>Disp_Decode<= “0000110”; --1 when 2=>Disp_Decode<= “1011011”; --2 when 3=>Disp_Decode<= “1001111”; --3 when 4=>Disp_Decode<= “1100110”; --4 when 5=>Disp_Decode<= “1101101”; --5 when 6=>Disp_Decode<= “1111101”; --6 when 7=>Disp_Decode<= “0000111”; --7 when 8=>Disp_Decode<= “1111111”; --8 when 9=>Disp_Decode<= “1101111”; --9 when 10=>Disp_Decode<= “1000000”; --- when others=>Disp_Decode<=“0000000”; --全灭 end case; end process; end behave; 2.管脚分配: 2.时序仿真图: 4.硬件电路图: 5.现象: 五、设计总结 通过本次的课程设计,我初步了解了VHDL语言的编程思想,以及利用EDA软件进行电子电路设计的方法,通过对一个课题的分析,将实验的内容进行分块解读,具体到每一个模块的具体作用,然后将各个功能的模块通过连线进行总体的电路实现,也可以通过VHDL语言对各个模块进行组合,然后需要在程序编译成功的基础上,安装硬件,将程序下载到具体的芯片上进行硬件的实现。通过整个实验的完成,我从老师和同学那里学到了更多关于VHDL编程,仿真以及硬件实现的知识,自己以前模糊不清的地方也通过此次的课程设计了解清楚了,并且通过这次课程设计,我也锻炼了独立思考,独立操作的能力,虽然对于VHDL语言的应用我还很生疏,但是此次的课程设计却让我学到了很多,也对这门语言有了更深的理解,对EDA软件的使用有了更多的体会。