第一篇:可控脉冲发生器的设计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软件的使用有了更多的体会。 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》课程设计 课程设计任务书 学生姓名:-专业班级:电子科学与技术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技术》课程设计报告 题目:简易数字频率计 专业: 本组成员: 简述 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 班级:09电信 姓名:熊雷 学号:13 指导教师:赵欣 湖北轻工职业技术学院 2011年3月4日 湖北轻工职业技术学院 电子设计与制作综合实训 目录 第一章 概述..............................................................................................................................2 第二章 万用表组装与调试的目的与意义..............................................................................5 第三章 电路调试与制作..........................................................................................................7 3.1万用表的种类............................................................................错误!未定义书签。3.2万用表的结构特征....................................................................错误!未定义书签。第四章 指针式万用表最基本的的工作原理..........................................................................7 4.1MF47型万用表的工作原理...............................................错误!未定义书签。4.2MF47万用表电阻档工作原理.............................................................................9 第五章 总结与体会..................................................................................................................9 第六章 附录............................................................................................................................10 第一章 概述 1.1 引言 电子设计的必由之路是数字化,这已成为共识。在数字化的道路上,我国的电子技术经历了一系列重大的变革。从应用小规模集成电路构成电路系统,到广泛地应用微控制器或单片机(MCU),在电子系统设计上发生了具有里程碑意义的飞跃。电子产品正在以前所未有的速度进行着革新,主要表现在大规模可编程逻辑器件的广泛应用。在可编程芯片CPLD(复杂可编程逻辑器件)和FPGA(现场可编程门阵列)上实现电子系统的设计,必将成为今后电子 湖北轻工职业技术学院 电子设计与制作综合实训 系统设计的一个发展方向。所以电子设计技术发展到今天,又将面临另一次更大意义的突破,即CPLD/FPGA在EDA(电子设计自动化)基础上的广泛应用。本设计将采用基于VHDL的EDA设计来实现波形发生器的各种功能。 1.2 EDA技术的涵义EDA是电子设计自动化(Electronic Design Automation)的缩写。它是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计电子系统到硬件系统的一门新技术。EDA技术可以实现逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化,逻辑布局布线、逻辑仿真。完成对于特定目标芯片的适配编译、逻辑映射、编程下载等工作,最终形成集成电子系统或专用集成芯片。 EDA的工程设计流程电子设计的全过程分为物理级、电路级和系统级三个设计层次,涉及的电子系统从低频、高频到微波,从线性到非线性,从模拟到数字,从通用集成电路到专用集成电路构造的电子系统。EDA技术采用系统级的设计方法,其设计流程如图1所示。 图1 EDA的工程设计流程图 ①源程序的编辑:利用文本编辑器或图形编辑器,将设计用文本方式或图形方式表达出来。常用的源程序输入方式有原理图输入、HDL文本输入和状态图输入。 ②逻辑综合和优化:逻辑综合的功能是将软件描述与给定硬件结构联系起来,也就是HDL、原理图或状态图的描述,针对给定硬件结构组件进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述文件。 ③目标器件的布线/适配:适配器的功能是将逻辑综合后产生的网表文件配置到指定的目标器件中,并产生最终的下载文件。 ④目标器件的编程/下载:如果编译、综合、布线/适配和行为仿真、功能仿真、时序仿真等过程都没有发现问题,也就是说满足原设计的要求,这时就可以通过编程器或下载电缆将布线/适配器产生的配置/下载文件载入目标芯片FPGA或CPLD中。湖北轻工职业技术学院 电子设计与制作综合实训 多功能波形发生器的设计 2.1多功能波形发生器多功能波形发生器采用FPGA器件作为核心控制部件,精度高稳定性好,得到波形平滑,特别是由于FPGA的高速度,能实现较高频率的波形。控制上更方便,可得到较宽频率范围的波形输出,步进小。波形数据使用Matlab计算,Matlab能对数据进行四舍五入,得到的数据误差较小,且编程简单,修改容易,调用方便。计算正弦波及指定函数波的N点采样值,然后写入到ROM中待用。通过预置FPGA的分频系数以及改变相位进步实现对输出频率的调节,并可以等步进调频。幅度调节采用高精度的电位器调节。湖北轻工职业技术学院 电子设计与制作综合实训 第二章 单元电路分析与设计 输出信号频率的产生。输出信号的频率由触发信号的频率决定,触发信号的频率由50MHZ的信号分频率得到,分频率系数由选择模块产生。本文设计的波形频率xfo从100-1000Hz,步进为100Hz,因此,有IOOHz、200Hz、300Hz … 900Hz、1000Hz等10种频率。每种频率的波形的一个周期都要输出64个离散点,故时钟触发信号的频率fc=64xfo。该模块将频率选择模块的输出信号送到一个分频程序(FANA)进行分频,就得到分频时钟信号。 幅度调节的原理及实现。直接对数模转换芯片的电阻网络的基准电压进行调节,DAC0832的基准电压为+(-)15V,理论上输出波形的幅度范围+(-)15V。通过在ADC0832的8脚(基准电压输入脚)接一个精密电位器便可实现。 波形输出控制模块与键盘控制模块设计。波形选择用于按键选择输出的波形类型,因为波形发生器要求输出正弦波、三角波、方波以及它们两两或三种线性组合,所以采用三个按键,分别控制了三种波形的任意一种,或任意两种波形的叠加,又或者三种波形的叠加输出,同时还设计了一个清零按钮,随时可以将输出清零,使操作简单。 D/A转换电路设计。该电路是将波形输出控制模块输出的二进制信号值转换成模拟信号输出。由8位D/A转换器DAC0832及运算放大器等组成,织成电路如图2所示。 图2 D/A转换电路图 波形合成器的设计。对幅度为1的正弦波的一个周期进行64点采样,用Matlab计算得到每一点对应的幅度值,然后量化成8位二进制数据存放在ROM中。理论上,采样点数及量化位数越多,合成波形精确度越高。D/ACO832的位数为8位,量化等级最高为256,其量化误差已能达到要求,对于查正弦表的舍入误差也可忽略,故不采用更高位数的数模转换器。这里采用64个采样点,是为了在从高到低各个频段都能得到较好波形。在分频器输出脉冲驱动下,依次取出ROM中数据,即可得到幅度上离散正弦波,再经过D/A转换,便可得到连续正弦波。而三角波的产生是从某点起,使幅度逐次增加一个相位步进,一直到最大值后变为逐次减小一个相位步进,到最小值后又变为逐次增加相位步进,如此循环便产生周期性三角波形,方波的产生,只需根据占空比,调节一个周期内输出高、低电平时间即可。湖北轻工职业技术学院 电子设计与制作综合实训 FPGA器件内部结构多功能波形发生器由初值模块、分频模块、方波产生模块、三角波产生模块、正弦波产生模块、波形输出控制模块等部分组成。其中初值模块CHUZHl提供初值,供下一个模块FANA分频时用,通过不同的初值,在波形产生模块得到不同的工作频率,从而实现调节波形频率的目的。送不同的初值,是由输入A决定的,4位矢量产生的16种组合中的10种对应了10种不同的频率:分频模块FANA的功能是将前一模块CHUZHI送来的初值对时钟进行分频,得到不同的工作频率,从而调节波形频率;方波产生模块SQUARE的功能是产生方波,每32个时钟翻转一次,每64个时钟为一个周期(为了与正弦波相同);三角波产生模块DELTA的功能是产生三角波,为了得到64个时钟为一个周期的三角波,对于8位D/A转换芯片,输出Q每次加/减8;正弦波产生模块SIN的功能产生正弦波,一个周期取64点,所以64个时钟为一个周期;波形输出控制模块CHPR031设置了三个按键,分别控制三种波形任意一种,或任意两种波形的叠加,又或者三种波形叠加输出。输出的是信号的二进制值,同时还设计了一个清零按键,可以将输出清零。 管脚封装与EDA实验箱设置管脚封装如表1所示。 ASl:(3)(4)设为“ON”,其余所有档均设为“OFF”。 表1管脚封装表 JSl:(1)、(5)、(8)设置为“ON”。 在TP6、TP7两处用示波器观察输出信号的波形。湖北轻工职业技术学院 电子设计与制作综合实训 第三章 电路调试与制作 第四章 指针式万用表最基本的的工作原理 指针式万用表最基本的的工作原理(见图5)。 由表头、电阻测量档、电流测量档、直流电压测量档和交流电压测量档几个部分组成,图中“-”为黑表棒插孔,“+”为红表棒插孔。 测电压和电流时,外部有电流通入表头,因此不须内接电池。 当我们把档位开关旋钮SA打到交流电压档时,通过二极管VD整流,电阻R3限流,由表头显示出来; 当打到直流电压档时不须二极管整流,仅须电阻R2限流,表头即可显示; 打到直流电档档时既不须二极管整流,也不须电阻R2限流,表头即可显示; 测电阻时将转换开关SA拨到“Ω”档,这时外部没有电流通入,因此必须使用内部电池作为电源,设外接的被测电阻为Rx,表内的总电阻为R,形成的电流为I,由Rx、电池E、可调电位器RP、固定电阻R1和表头部分组成闭合电路,形成的电流I使表头的指针偏转。红表棒与电池的负极相连,通过电池的正极与电位器RP及固定电阻R1相连,经过表头接到黑表棒与被测电阻Rx形成回路产生电流使表头显示。回路中的电流为: E I = Rx+R 湖北轻工职业技术学院 电子设计与制作综合实训 从上式可知:I和被测电阻Rx不成线性关系,所以表盘上电阻标度尺的刻度是不均匀的。当电阻越小时,回路中的电流越大,指针的摆动越大,因此电阻档的标度尺刻度是反向分度。 当万用表红黑两表棒直接连接时,相当于外接电阻最小Rx=0,那么: E I = Rx+R 此时通过表头的电流最大,表头摆动最大,因此指针指向满刻度处,向右偏转最大,显示阻值为0Ω。请看电阻档的零位是在左边还是在右边,其余档的零位与它一致吗? 反之,当万用表红黑两表棒开路时Rx→∞,R可以忽略不计,那么: 此时通过表头的电流最小,因此指针指向0刻度处,显示阻值为∞。 看今天要安装的MF47型万用表的原理图(见图6),测量线路板线路板(见图7)。它的显示表头是一个直流μA表,WH2是电位器用于调节表头回路中的电流大小,D3、D4两个二极管反向并联并与电容并联,用于保护限制表头两端的电压起保护表头的作用,使表头不至电压、电流过大而烧坏。电阻档分为×1Ω、×10Ω、×100Ω、×1kΩ、×10kΩ、几个量程,当转换开关打到某一个量程时,与某一个电阻形成回路,使表头偏转,测出阻值的大小。 E = R 湖北轻工职业技术学院 电子设计与制作综合实训 4.2MF47万用表电阻档工作原理 第五章 总结与体会 由于VHDL语言具有支持大规模设计和再利用已有设计等优点,因此使用VHDL语言来设计数字系统已成为一种潮流。采用EDA技术,实现了各种波形的产生,且波形平滑,无毛刺,质量高,输出波形的频率可调范围宽,可等步进调节且步进小。人机界面经过精简,按键少且操作方便。湖北轻工职业技术学院 电子设计与制作综合实训 第六章 附录 1、电阻27只,阻值如下: R1 =0.47 R6=4.99k R2 =4.99 R7=40.2k R3= 51 R4 =560 R5 =15k R10=4.02k R33=6.25M R34=6.25M R8=150k R9=806k R11=84.5M R12=360k R13=1.8 R14=2.26M R15=4.3M M R16=0.025(分R17=15 R18=165 R19=1.78K R20=54.9k 流器)R21=17.4k R22=140k R23=21k R24 =20k(5%)R25 =20k R26=750(5%)R27=6.5 R28=180 R29=4.12K R30=54.9K 2、元器件 1.电位器 10k 5% WH161 1只 2.二极管 1N4001 3只、1N4007 1只 3.保险丝座 2只 4.点解电容 10uF 16V 1只 5.保险丝 5x20 250V/0.5A 1只 3、塑料件 1.面板 1只 2.大旋钮 1只 3.小旋钮 1只 4.表箱5.电池盖板 1只 6.晶体插座管 1只 7.提拔 1只 8.电刷架 1只 1只第二篇:EDA课设
第三篇:EDA课设电子琴设计.
第四篇:EDA简易数字频率计~课设报告
第五篇:EDA波形发生器实训报告