第一篇:EDA实习报告
电子设计自动化技术EDA实习报告
目录
引 言
(1)EDA简介
(2)EDA的设计流程 第一章
实训目的
第二章 实训内容
一、EDA 开发软件Max+plus II 或Quartus II
1.1基本原理
1.2条件要求
1.3主要内容
1.4实践步骤与结果分析
(一)设计原理图或VHDL源程序
1)原理图
2)VHDL源程序
(二)器件及管脚逻分配图
1)调试编译与仿真波形
2)时序分析图
1.5项目一的结论
二、4位全加器设计
2.1基本原理
2.2条件要求
2.3主要内容
2.4方案及实现方法
2.5实践步骤与结果分析
(一)设计1 位全加器
1)1 位全加器原理图
2)1位全加器仿真波形
(二)四位全加器设计
1)四位全加器原理图
2)器件及管脚逻分配图
3)调试编译与仿真波形
4)时序分析图
(三)项目二的结论
三、8 线-3 线优先编码器
3.1基本原理
1、管脚
2、真值表
3.2条件要求
3.3主要内容
3.4方案及实现方法
3.5实践步骤与结果分析
(一)原理图和VHDL程序
203130705岳慧慧
电子设计自动化技术EDA实习报告
1)3-8译码器的原理图
2)VHDL程序
(二)器件及管脚逻分配图
(三)调试编译与仿真波形
1、调试编译
2、仿真波形
(四)时序分析图
(五)项目三的结论
四、10 进制计数器设计
4.1基本原理
1、管脚
2、真值表
4.2条件要求
4.3主要内容
4.4方案及实现方法
4.5实践步骤与结果分析
(一)原理图和VHDL程序
1)10 进制计数器
2)VHDL程序
(二)器件及管脚逻分配图
(三)调试编译与仿真波形
1、调试编译
2、仿真波形
(四)时序分析图
(五)项目四的结论
五、8 位循环移位寄存器
5.1基本原理
1、管脚
2、真值表
5.2条件要求
5.3主要内容
5.4方案及实现方法
5.5实践步骤与结果分析
(一)原理图和VHDL程序
1)8 位循环移位寄存器
2)VHDL程序
(二)器件及管脚逻分配图
(三)调试编译与仿真波形
1、调试编译
2、仿真波形
(四)时序分析图
(五)项目三的结论
第三章 结 论
203130705岳慧慧
电子设计自动化技术EDA实习报告
引
言
(1)EDA简介
电子技术的迅猛发展,高新技术日新月异。传统的电子技术设计方法,以不能帮助我们更好的、高效的完成设计任务。所以我们需要更好的工具来帮助我们完成设计任务。
EDA技术是指以计算机为工作平台,融合应用电子技术、计算机技术、信息处理及智能化技术,进行电子产品自动化设计的一门新技术。
EDA技术作为现代电子设计技术的核心,依赖于计算机,在EDA工具软件平台上,对以硬件描述语言为逻辑描述手段完成设计文件,自动地完成逻辑编译、逻辑化简、逻辑综合、布局布线,以及逻辑优化和仿真测试,直至实现既定的电子电路的功能。
在硬件方面,EDA技术融合了大规模集成电路制造技术、集成电路板图设计技术、可编程器件编程技术、自动测试技术等;在计算机辅助工程方面融合了计算机辅助设计、计算机辅助制造、计算机辅助测试、计算机辅助分析、计算机辅助工程技术以及多种计算机语言的设计概念;在现代电子学方面容纳了诸如计算机设计技术、电子线路设计理论、数字信息处理技术、数字系统建模和优化技术以及基于微波技术的长线技术理论。
可以说,EDA技术打破了软件设计和硬件设计间的壁垒,是一门综合性学科,一种多方位技能技术。它将设计效率和产品性能合二为一,代表了电子设计技术和电子应用技术的发展方向。
(2)EDA的设计流程
编辑输入
1)文本输入。在EDA工具软件的文本编辑见面上,输入用某种硬件语言表
述的电路设计文本。
2)原理图输入。在EDA工具软件的图形编辑界面上,绘制能完成预定功能的电路原理图。
3)状态图输入。依据电路的控制条件和状态转换的因果关系,在EDA工具软件的状态图编辑界面上绘制时序电路的状态流程图。
波形图输入
在EDA工具软件的波形图编辑界面上,绘制电路输入输出信号间的波形关系,然后由EDA编译器据此完成电路设计。
综合
综合是将由硬件描述语言表述的电路行为表述转换为低级的、与可编程逻辑器件基本结构相映射的网表文件或电路连接图。
适配
适配是为了将综合器产生的网表文件装配于指定的目标器中,而产生最终的编程文件。
功能仿真与时序仿真
1)功能仿真是指针对文本设计、原理图设计及其它设计方法的逻辑功能进 2)行测试模拟,以便了解所设计电路实现的功能是否符合要求。
3)时序仿真的结果接近真实器件的运行特性。
编程下载
把适配后生成的编程文件通过编程器或编程电缆载入目标可编程逻辑器件,以便进行硬件验证。
硬件测试
对含有载入了编程文件的可编程逻辑器件的硬件系统进行统一的测试。
203130705岳慧慧
电子设计自动化技术EDA实习报告
第一章 实训目的
1)掌握MAX+PLUSⅡ或Quartus II 的安装与使用方法,EDA 的开发流程及相关分析综合方法。2)复习加法器的原理,掌握加法器的设计实现方法,设计实现数字系统设计中常用的4位全加器,在此基础上进一步熟悉MAX+PLUSⅡ或Quartus II 软件的使用方法,熟练掌握EDA的图形编程方法、开发流程、以及组合逻辑电路的设计、分析、综合、仿真方法。
3)复习编码器的原理,掌握编码器的设计实现方法,设计实现数字系统设计中常用的8线-3 线优先编码器,逐步学会熟练运用MAX+PLUSⅡ或Quartus II 软件,熟悉EDA 的VHDL程序设计方法、学习掌握组合逻辑电路的VHDL 描述方法,进一步掌握应用EDA 常用工具进行组合逻辑电路的设计、分析、综合、仿真等的技巧。
4)复习计数器的原理,掌握计数器的设计实现方法,设计实现数字系统设计中常用的10进制计数器,逐步学会熟练运用MAX+PLUSⅡ或Quartus II 软件,熟悉EDA 的VHDL 程序设计方法、学会使用信号升沿、降沿、VHDL 的敏感量表等内容,掌握时序逻辑电路的VHDL描述方法,步掌握应用EDA 常用工具软件进行时序逻辑电路的设计、分析、综合、仿真等的方法与技巧。
5)复习循环移位寄存器的原理与功能,学习掌握循环移位寄存器的设计实现方法,设计实现数字系统设计中常用的8 位循环移位寄存器,逐步学会熟练运用MAX+PLUSⅡ或QuartusII 软件,熟悉EDA 的VHDL 程序设计方法、学会使用信号升沿、降沿、VHDL 的敏感量表等内容,掌握时序逻辑电路的VHDL 描述方法,掌握应用EDA 常用工具软件进行时序逻辑电路的设计、分析、综合、仿真等的方法与技巧。
6)初步掌握VHDL语言和原理图的设计输入,编译,仿真和调试过程,理解VHDL语言的基本特点包括结构、语法、数据类型等。
第二章 实训内容
一、EDA 开发软件Max+plus II 或Quartus II 1.1基本原理
根据EDA 的设计流程:设计输入→编译→器件选择→管脚分配→设计仿真→时序分析→编程下载,在熟悉EDA 开发软件Max+plus II 或Quartus II 界面操作基础上,使用软件提供的编辑、编译、仿真等工具,分析所设计的系统。
1.2条件要求
1)计算机及操作系统
2)MAX+Plus II 或Quartus II 软件 3)编程电缆(可选)
1.3主要内容
1.设计输入方法,包括图形输入、文本输入等 2.设计编译
3.器件选择及管脚分配 4.设计仿真 5.时序分析 6.编程下载
1.4实践步骤与结果分析
(一)设计原理图或VHDL源程序
203130705岳慧慧
电子设计自动化技术EDA实习报告
1)原理图
我设计了一个半加器,A和B是输入端,C是进位输出,D是加法输出
以上为采用图形输入法完成的一个二输入半加器电路 2)VHDL源程序
O<=A XOR B;//A与B异或 C<=A AND B;//A与B相与
(二)器件及管脚逻分配图203130705岳慧慧 5
电子设计自动化技术EDA实习报告
与门的两个输入A 和B 分配给管脚3 与2,输出C分配给管脚44,输出O分配给管脚43,所选器件为EPM3032ALC44-4。
(三)调试编译与仿真波形 1)调试编译
203130705岳慧慧 6
电子设计自动化技术EDA实习报告
编译结果正确,无错误,但是有一个警告。
2)仿真波形
此处,我设计A输入信号为100ns/每格的时钟脉冲,B输入信号为300ns/每格的时钟脉冲。
仿真波形如下图所示:
从仿真波形可以看出,输入输出结果满足表达式O=A XOR B、C=A AND B,亦即所设203130705岳慧慧
电子设计自动化技术EDA实习报告
计电路功能达到设计要求。
(四)时序分析图
此处,我进行Classic Timing Analyzer 时序分析,可以得到A、B、C、D四个波形的信号到达时间都是3.5ns,所以仿真波形图上不存在毛刺,很完美。
1.5项目一的结论
我掌握了MAX+PLUSⅡ或Quartus II 的安装与使用方法,EDA 的开发流程及相关分析综合方法,在此基础上进一步熟悉MAX+PLUSⅡ或Quartus II 软件的使用方法,熟练掌握EDA的图形编程方法、开发流程、以及组合逻辑电路的设计、分析、综合、仿真方法。同时复习加法器的原理,掌握加法器的设计实现方法,我完成的主要工作是设计了数字系统设计中常用的一个半加器。A和B是半加器输入,C是半加器的进位输出,D是A加B的结果输出,并且利用波形仿真验证VHDL程序和原理图的正确性。得出的结论是根据波形图结果,波形符合逻辑关系,无毛刺,十分完美地实现二输入半加器。
二、4位全加器设计
2.1基本原理 位全加器的管脚如下图所示:
其中CIN 表示输入进位位,COUT 表示输出进位位,输入A 和B 分别表示加数和被加数。输出SUM=A+B+CIN,当SUM 大于255 时,COUT 置‘1’。
4位全加器可以看做四个1位全加器级联而成,首先采用基本逻辑门设计一位全加器,而后通过多个1位全加器级联实现4位全加器。其中,其中C1表示输入进位位,C0表示输出进位位,输入A和B分别表示加数和被加数。S为输出和,其功能可用布尔代数式表示为:
S=A+B+C1
203130705岳慧慧
电子设计自动化技术EDA实习报告
首先根据一位全加器的布尔代数式应用基本逻辑门设计一位全加器,而后仿真验证一位全加器设计,准确无误后生成元件,供4位全加器设计用。将4个1位全加器级联构成四位全加器。
2.2条件要求
1.计算机及操作系统
2.MAX+Plus II 或Quartus II 软件 3.编程电缆(可选)
2.3主要内容
根据所学相关知识,运用MAX+PLUS II 或Quartus II 软件的图形输入方法,实现4位全加器设计。首先给出设计原理并提出实现方案,经指导教师同意后,通过设计输入、编译综合、仿真验证等过程完成并验证设计。
1.设计输入方法,包括图形输入、文本输入等 2.设计编译
3.器件选择及管脚分配 4.设计仿真 5.时序分析 6.编程下载
2.4方案及实现方法
设计过程中可以首先采用基本逻辑门设计1 位全加器,而后通过多个1 位全加器级联实现4 位全加器,也可以根据输出与输入的逻辑关系写出其布尔代数式,根据布尔代数式用基本逻辑门实现全加器。
2.5实践步骤与结果分析
(一)设计1 位全加器 1)1 位全加器原理图
我设计了一位全加器,A和B是输入端,C1是进位输入端,C0是进位输出端,S是全加器输出端。
203130705岳慧慧
电子设计自动化技术EDA实习报告
以上为采用图形输入法完成的一个一位全加器电路。
2)1位全加器仿真波形
仿真结果如图,1位全加器设计成功。
(二)四位全加器设计
与门的两个输入A 和B 分配给管脚3 与2,输出C分配给管脚44,输出O分配给管脚43,所选器件为EPM3032ALC44-4。
1)四位全加器原理图
203130705岳慧慧
电子设计自动化技术EDA实习报告
2)器件及管脚逻分配图
203130705岳慧慧
电子设计自动化技术EDA实习报告
管脚分配情况如图,所选器件为EPM3032ALC44-4。
3)调试编译与仿真波形 1.调试编译
编译结果正确,无错误,但是有一个警告。
分析可得,通过二输入与门,非门,或门,输出的S为两者之和,C0为输出进位。仿真结果与全加器真值表相同,四位全加器设计成功。
2.仿真波形
仿真波形如下图所示:
203130705岳慧慧
电子设计自动化技术EDA实习报告
当A3A2A1A0=0000,B3B2B1B0=0000时,S3S2S1S0=0000 ;当A3A2A1A0=0101,B3B2B1B0=1100时,S3S2S1S0=0001,其他时刻波形也与全加器功能相符,全加器设计成功。
从仿真波形可以看出,输入输出结果满足表达式O=A XOR B、C=A AND B,亦即所设计电路功能达到设计要求。
4)时序分析图
203130705岳慧慧
电子设计自动化技术EDA实习报告
此处,我进行Classic Timing Analyzer 时序分析,可以得到A、B、C1、C0、S五个端口的信号到达时间,同步逻辑性能分析后可知仿真波形图上不存在毛刺,满足四位全加器的设计要求。
(三)项目二的结论
我掌握了EDA 的开发流程及相关分析综合方法,在此基础上进一步熟悉MAX+PLUSⅡ或Quartus II 软件的使用方法,熟练掌握EDA的图形编程方法、开发流程、以及组合逻辑电路的设计、分析、综合、仿真方法。同时复习加法器的原理,掌握加法器的设计实现方法,我完成的主要工作是设计了数字系统设计中常用的一个半加器。A和B是全加器加数和被加数,C1是全加器的进位输入,C0是全加器的进位输出,S是A加B的结果输出,并且利用波形仿真验证原理图的正确性。得出的结论是根据波形图结果,波形符合逻辑关系,无毛刺,十分完美地实现一位全加器。
三、8 线-3 线优先编码器
3.1基本原理
1、管脚 线-3 线优先编码器的管脚如图:
其中IN 表示输入编码位,Sel 为片选信号,Y 表示输出编码值,YS 与YEX 表示器件状态,“11”表示器件未选中,“01”表示无键按下,“10”表示器件工作态。
2、真值表
8-3 编码器的真值表如下:
3.2条件要求
1.计算机及操作系统
2.MAX+Plus II 或Quartus II 软件 3.编程电缆(可选)
203130705岳慧慧
电子设计自动化技术EDA实习报告
3.3主要内容
1.根据所学相关知识,运用MAX+PLUS II 或Quartus II 软件的文本文件输入方法,编写VHDL 程序,实现8-3 优先编码器的设计。首先给出设计原理并提出实现方案论证,经指导教师同意后,通过设计输入、编译综合、仿真验证等过程完成并验证设计。设计输入方法,包括图形输入、文本输入等
2.设计编译
3.器件选择及管脚分配 4.设计仿真 5.时序分析 6.编程下载
3.4方案及实现方法
8-3 优先编码器的VHDL 描述有多种方法,设计过程中可以根据真值表采用case„when语句、with„select 语句、if„then 结构等多种手段实现,也可以根据真值表分析输入输出间的逻辑关系,根据逻辑关系写出其布尔表达式,根据布尔代数式调用基本逻辑门元件实现8-3 优先编码器,详细方案与方法略。
3.5实践步骤与结果分析
(一)原理图和VHDL程序 1)3-8译码器的原理图
203130705岳慧慧
电子设计自动化技术EDA实习报告
以上为采用图形输入法完成的一个3-8优先译码器。
2)VHDL程序
8-3优先编码器的VHDL描述有多种方法,设计过程中可以根据真值表采用case„when语句、with„select语句、if„then结构等多种手段实现,也可以根据真值表分析输入输出间的逻辑关系,根据逻辑关系写出其布尔表达式,根据布尔代数式调用基本逻辑门元件实现8-3优先编码器。本实验中,我根据真值表用if-then结构实现8-3优先编码器。
203130705岳慧慧
电子设计自动化技术EDA实习报告
(二)器件及管脚逻分配图
管脚分配情况如图,所选器件为EPM3032ALC44-4。
(三)调试编译与仿真波形
1、调试编译
编译结果正确,无错误,但是有两个警告。
203130705岳慧慧
电子设计自动化技术EDA实习报告
2、仿真波形
8线-3线优先编码器的仿真波形如下图所示:
当3-8译码器的片选信号为000时,片选信号选中输出的个位,当3-8译码器的片选信号为001时,片选信号选中输出的十位,当3-8译码器的片选信号为010时,片选信号选中输出的个位,当3-8译码器的片选信号为011时,片选信号选中输出的十位,当3-8译码器的片选信号为100时,片选信号选中输出的个位,当3-8译码器的片选信号为101时,片选信号选中输出的十位,就这样动态扫描,当输入的时钟信号频率很高的时候,就形成了我们的时钟。
从仿真波形可以看出,输入输出结果满足所设计电路功能,符合前文真值表,3-8优先编码器达到设计要求。
(四)时序分析图
203130705岳慧慧 18
电子设计自动化技术EDA实习报告
此处,我进行Classic Timing Analyzer 时序分析,可以得到输入输出端口的信号到达时间都是4.5ns,同步逻辑性能分析后可知仿真波形图上不存在毛刺,满足3-8优先编码器的设计要求。
(五)项目三的结论
我掌握了EDA 的开发流程及相关分析综合方法,在此基础上进一步熟悉MAX+PLUSⅡ或Quartus II 软件的使用方法,熟练掌握EDA的图形编程方法、开发流程、以及组合逻辑电路的设计、分析、综合、仿真方法。同时复习加法器的原理,掌握加法器的设计实现方法,我完成的主要工作是设计了数字系统设计中常用的一个3-8优先编码器,并且利用波形仿真验证VHDL程序和原理图的正确性。得出的结论是根据波形图结果,波形符合逻辑关系,无毛刺,十分完美地实现3-8优先编码器的功能。
我发现用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
附:参考程序 LIBRARY IEEE;ENTITY ENCODER IS USE IEEE.STD_LOGIC_1164.ALL;PORT(I:IN STD_LOGIC_VECTOR(7 USE IEEE.STD_LOGIC_UNSIGNED.ALL;DOWNTO 0);203130705岳慧慧
电子设计自动化技术EDA实习报告
SEL: IN STD_LOGIC;Y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);YS,YEX : INOUT STD_LOGIC);END ENCODER;ARCHITECTURE sample OF ENCODER IS BEGIN P1:PROCESS(I,SEL)BEGIN if SEL='1' then Y <=“111”;YS <='1';YEX<='1';elsif I(7)='0' then Y <=“000”;YS <='1';YEX<='0';elsif I(6)='0' then Y<=“001”;YS <='1';YEX<='0';elsif I(5)='0' then Y<=“010”;YS <='1';YEX<='0';elsif I(4)='0' then Y<=“011”;
YS <='1';YEX<='0';
elsif I(3)='0' then Y<=“100”;YS <='1';YEX<='0';
elsif I(2)='0' then Y<=“101”;YS <='1';YEX<='0';
elsif I(1)='0' then Y<=“110”;YS <='1';YEX<='0';
elsif I(0)='0' then Y<=“111”;YS <='1';YEX<='0';
elsif I=“11111111” then Y<=“111”;YS <='0';YEX<='1';else
Y<=“ZZZ”;end if;
END PROCESS P1;END sample;
四、10 进制计数器设计
4.1基本原理
1、管脚 进制计数器的管脚如图:
其中IN 表示输入编码位,Sel 为片选信号,Y 表示输出编码值,YS 与YEX 表示器件状态,“11”表示器件未选中,“01”表示无键按下,“10”表示器件工作态。
2、真值表
203130705岳慧慧
电子设计自动化技术EDA实习报告 进制计数器的真值表如下:
计数开始,计数器从计数初值开始做加计数或减计数。加计数时,计数到‘9’后,再来一个计数脉冲,计数器从‘0’开始。重新启动加计数;减计数时,计数到‘0’后,再来一个计数脉冲,计数器从‘10’开始,重新启动减计数。
4.2条件要求
1.计算机及操作系统
2.MAX+Plus II 或Quartus II 软件 3.编程电缆(可选)
4.3主要内容
① 根据所学相关知识,运用MAX+PLUS II 或Quartus II 软件的文本文件输入方法,编写VHDL 程序,实现10 进制计数器的设计。首先给出设计原理并提出实现方案论证,经指导教师同意后,通过设计输入、编译综合、仿真验证等过程完成并验证设计。设计编译
② 器件选择及管脚分配 ③ 设计仿真 ④ 时序分析 ⑤ 编程下载
4.4方案及实现方法 进制计数器的VHDL 描述有多种方法,设计过程中可以采用计数脉冲CP 作为敏感量,CP 的每个上升沿,计数值Q 加‘1’或减‘1’,加到‘9’后回‘0’或减到‘0’后回‘9’,语句可采用case„when、with„select、if„then 以及加减运算等多种结构实现。也可以首先设计基本的触发器、锁存器等元件,而后通过元件的互联实现,详细方案与方法略。
4.5实践步骤与结果分析
(一)原理图和VHDL程序 1)10 进制计数器
203130705岳慧慧
电子设计自动化技术EDA实习报告
以上为采用图形输入法完成的一个3-8优先译码器。
2)VHDL程序
8-3优先编码器的VHDL描述有多种方法,设计过程中可以根据真值表采用case„when语句、with„select语句、if„then结构等多种手段实现,也可以根据真值表分析输入输出间的逻辑关系,根据逻辑关系写出其布尔表达式,根据布尔代数式调用基本逻辑门元件实现8-3优先编码器。本实验中,我根据真值表用if-then结构实现8-3优先编码器。
203130705岳慧慧
电子设计自动化技术EDA实习报告
(二)器件及管脚逻分配图
管脚分配情况如图,所选器件为EPM3032ALC44-4。
(三)调试编译与仿真波形
1、调试编译
203130705岳慧慧
电子设计自动化技术EDA实习报告
编译结果正确,无错误,但是有一个警告。
2、仿真波形 进制计数器的仿真波形如下图所示:
从仿真波形可以看出,输入输出结果满足所设计电路功能,符合前文真值表,10 进制计数器达到设计要求。
(四)时序分析图
203130705岳慧慧
电子设计自动化技术EDA实习报告
203130705岳慧慧
电子设计自动化技术EDA实习报告
此处,我进行Classic Timing Analyzer 时序分析,可以得到输入输出端口的信号到达时间都是3.0ns,同步逻辑性能分析后可知仿真波形图上不存在毛刺,满足10 进制计数器的设计要求。
(五)项目四的结论
我熟练掌握了EDA的图形编程方法、开发流程、以及组合逻辑电路的设计、分析、综合、仿真方法。我完成的主要工作是设计了数字系统设计中常用的一个10 进制计数器,并且利用波形仿真验证VHDL程序和原理图的正确性。得出的结论是根据波形图结果,波形符合逻辑关系,无毛刺,十分完美地实现10 进制计数器的功能。
我发现用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
附:参考程序
LIBRARY IEEE;if UD='0' then USE IEEE.STD_LOGIC_1164.ALL;if TMP=“1001” then USE IEEE.STD_LOGIC_UNSIGNED.ALL;TMP<=“0000”;ENTITY counter IS c<='1';PORT(D : IN STD_LOGIC_VECTOR(3 else DOWNTO 0);TMP<=TMP+1;UD : IN STD_LOGIC;c<='0';LD : IN STD_LOGIC;end if;CP : IN STD_LOGIC;elsif UD='1' then STA: IN STD_LOGIC;if TMP=“0000” then C : OUT STD_LOGIC;TMP<=“1001”;Q : OUT STD_LOGIC_VECTOR(3 DOWNTO c<='1';0));else END counter;TMP<=TMP-1;ARCHITECTURE sample OF counter IS c<='0';SIGNAL TMP:STD_LOGIC_VECTOR(3 end if;DOWNTO 0);end if;BEGIN elsif STA='1' then P1:PROCESS(CP,STA,LD,UD)TMP<=TMP;BEGIN end if;if LD='0' then end if;TMP<=D;END PROCESS P1;elsif CP'EVENT AND CP='0' then Q<=TMP;if STA='0' then END sample;
五、8 位循环移位寄存器
5.1基本原理
1、管脚 位循环移位寄存器的管脚如图:
203130705岳慧慧
电子设计自动化技术EDA实习报告
其中D 表示输入的初始值,Sta 为开始移位信号,DOUT 表示当前数值;LD 表示预设计数值,LD 为“1”,初始计数值打入器件;LR 表示移位方向,LR 为‘0’,循环右移位,LR 为‘1’,循环左移位;CP 为移位脉冲。
2、真值表 位循环移位寄存器的真值表如下:
移位开始,循环左移时,CP 上每来一个脉冲升沿,寄存器从输出从低位开始依次左移一位,同时最高位给最低位。相反,循环右移时,从高位开始依次右移一位,同时最低位给最高位。
5.2条件要求
1.计算机及操作系统
2.MAX+Plus II 或Quartus II 软件 3.编程电缆(可选)
5.3主要内容
① 根据所学相关知识,运用MAX+PLUS II 或Quartus II 软件的文本文件输入方法,编写VHDL 程序,实现8 位循环移位寄存器的设计。首先给出设计原理并提出实现方案论证,经指导教师同意后,通过设计输入、编译综合、仿真验证等过程完成并验证设计。
② 器件选择及管脚分配 ③ 设计仿真 ④ 时序分析 ⑤ 编程下载
5.4方案及实现方法 位循环移位寄存器的VHDL 描述有多种方法,设计过程中可以首先设计D 触发器,而后通过D 触发器的互联实现8 位循环移位寄存器;也可采用计数脉冲CP 作为敏感量,CP 的每个上升沿,输出量Q 的每一位赋给左边一位或右边一位。同时循环左移时,最高位赋给最低位,循环右移时,最低位赋给最高位,语句可采用case„when、with„select、if„then以及加减运算等多种结构实现,详细方案与方法略。
5.5实践步骤与结果分析
203130705岳慧慧
电子设计自动化技术EDA实习报告
(一)原理图和VHDL程序 1)8 位循环移位寄存器
以上为采用图形输入法完成的一个8 位循环移位寄存器
2)VHDL程序 位循环移位寄存器的VHDL描述有多种方法,设计过程中可以根据真值表采用case„when、with„select、if„then以及加减运算等多种结构实现,也可以根据真值表分析输入输出间的逻辑关系,根据逻辑关系写出其布尔表达式,根据布尔代数式调用基本逻辑门元件实现8 位循环移位寄存器。
本实验中根据真值表,通过VHDL语言的if-then结构实现8位循环移位寄存器。首先根据前文所述,对照真值表203130705岳慧慧
电子设计自动化技术EDA实习报告 的列出的不同输入逻辑状态,分情况依次输出于输入的对应关系,而后编译综合,由开发系统自行实现电路功能。
(二)器件及管脚逻分配图
管脚分配情况如图,所选器件为EPM3032ALC44-4。
203130705岳慧慧
电子设计自动化技术EDA实习报告
(三)调试编译与仿真波形
1、调试编译
编译结果正确,无错误,但是有一个警告。
2、仿真波形 位循环移位寄存器的仿真波形如下图所示:
203130705岳慧慧 30
电子设计自动化技术EDA实习报告
从仿真波形可以看出,输入输出结果满足所设计电路功能,符合前文真值表,8 位循环移位寄存器达到设计要求。
(四)时序分析图
203130705岳慧慧
电子设计自动化技术EDA实习报告
上述时间分析可以得到,输出信号存在的时间延迟,它主要与器件速度、表达逻辑的合理性有关,选用速度更高器件、优化设计可以使该值降低。
此处,我进行Classic Timing Analyzer 时序分析,可以得到输入输出端口的信号到达时间都是3.0ns,同步逻辑性能分析后可知仿真波形图上不存在毛刺,满足8 位循环移位寄存器的设计要求。
(五)项目五的结论
本次实验我收获到了很多移位寄存器的相关知识,虽然期间我遇到了很多无法解决的问题,但最终都通过查阅资料,询问同学,一一得到了解决。实验中我们完成了1个器件的编写:我使用了VHDL代码的方法。通过资料我知道了74HC164是8位移位寄存器,当其中一个(或二个)选通串行输入端的低电平禁止进入新数据,并把第一个触发器在下一个时钟脉冲来后复位到低电平时,门控串行输入端(A 和B)可完全控制输入数据。一个高电平输入后就使另一个输入端赋能,这个输入就决定了第一个触发器的状态。虽然不管时钟处于高电平或低电平时,串行输入端的数据都可以被改变,但只有满足建立条件203130705岳慧慧
电子设计自动化技术EDA实习报告 的信息才能被输入。时钟控制发生在时钟输入由低电平到高电平的跃变上。为了减小传输线效应,所有输入端均采用二极管钳位。每组实验我们都编写了他们的源代码,并且通过时序仿真和功能仿真不同的仿真方式让我对加法器这个逻辑学电子元件有了更深层次的了解。很多问题最终在老师同学和自己的不懈努力中得以解决。其中我遇到了一些代码上的书写错误问题,编译无法运行问题,以及时序仿真时出现的问题。不过最后在查阅相关资料后明白了自己是少了一些过程。
我发现用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
我采用图形编程法实现了8位循环移位寄存器的设计,并完成了电路的设计编译、综合、逻辑仿真、时间分析,结果表明采用ALTRA的CPLD器件设计的8位循环移位寄存器,时间延迟为3ns。
附:参考程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cyreg IS PORT(D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);LD : IN STD_LOGIC;LR : IN STD_LOGIC;CP : IN STD_LOGIC;DOUT: BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0));END cyreg;ARCHITECTURE sample OF cyreg IS BEGIN P1:PROCESS(CP,LD)BEGIN if LD='0' then DOUT<=D;elsif CP'EVENT AND CP='0' then if LR='1' then DOUT<=DOUT(6 DOWNTO 0)&DOUT(7);elsif LR='0' then DOUT<=DOUT(0)&DOUT(7 DOWNTO 1);end if;end if;END PROCESS P1;END sample;
203130705岳慧慧
电子设计自动化技术EDA实习报告
第三章 结 论
首先,通过对这门课程相关理论的学习,我掌握EDA的一些基本的的知识,现代电子产品的性能越来越高,复杂度越来越大,更新步伐也越来越快。实现这种进步的主要原因就是微电子技术和电子技术的发展。前者以微细加工技术为代表,目前已进入超深亚微米阶段,可以在几平方厘米的芯片上集成几千万个晶体管;后者的核心就是电子设计自动化EDA(lectronic Design Automatic)技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
其次,通过对课程的实验的学习,让我感觉收获颇多,我对EDA的学习和理解有了更深刻的认识和体会,对数字逻辑与数字电路有初步的了解,而EDA是在数字电路发展到一定阶段的产物,因此学习起来也很费力。在这一周的实训中我们不仅巩固了以前学过的知识,而且还学到了怎样运用EDA设计VHDL程序、电路、波形的整个过程和思路,更加强了我们动手能力,同时也提高了我们的思考能力的锻炼,我们在写程序的同时还要学会要改程序,根据错误的地方去修改程序。
在此次实训的过程中,我了解到,我们需要加强培养动手能力,要明白理论与实践结合的重要性,只有理论知识也是不够的,只有把所学的理论知识和实践相结合,才能真正提高我们的实际动手能力与独立思考的能力。
我虽然碰到了很多困难和问题,到最后还是靠自己的努力与坚持独立的完成了任务。当遇到了自己无法解决的困难与问题的时候,要有耐心,要学会一步步的去找问题的根源,才能解决问题,还请教老师给予指导和帮助。这次实训给我最深的印象就是扩大自己的知识面,知道要培养哪些技能对我们的专业很重要。最终我成功地完成了这次的实践课程,包括时序仿真和 硬件测试仿真,都取得了较好地效果。还要在今后的课本理论知识学习过程中要一步一个脚印的扎实学习,灵活的掌握和运用专业理论知识这样才能在以后工作的实践过程中有所成果。
通过这次课程设计,我进一步熟悉了verilog hdl语言的结构,语言规则和语言类型。对编程软件的界面及操作有了更好的熟悉。在编程过程中,我们虽然碰到了很多困难和问题,到最后还是靠自己的努力与坚持独立的完成了任务。当遇到了自己无法解决的困难与问题的时候,要有耐心,要学会一步步的去找问题的根源,才能解决问题,还请教老师给予指导和帮助。这次实训给我最深的印象就是扩大自己的知识面,知道要培养哪些技能对我们的专业很重要。通过这次课程设计,培养了我们共同合作的能力。但是此次设计中参考了其他程序段实际思想,显示出我们在程序设计方面还有不足之处。
在此次实训的过程中,我了解到了要加强培养动手能力,要明白理论与实践结合的重要性,只有理论知识也是不够的,只有把理论知识和实践相结合,才能真正提高我们的实际动手能力与独立思考的能力。通过用VHDL语言设计,统领整个教学内容,让我们在学习过程中得到反复性的思维训练,加深了对教学内容的理解和运用,增强了我们对EDA技术应用性的熟悉和理解。
致 谢
非常感谢张老师这一学期来的指导与教诲,感谢老师在学习上给予的指导,老师平常的工作也很忙,但是在我们学习的过程中,从来没有耽搁过,我们遇到问题问他,他重来都是很有耐心,不管问的学生有多少,他都细心的为每个学生讲解,学生们遇到的不能解决的,他都配合同学极力解决。
感谢学院给我们提供这次实训的机会,感谢张老师对我们的指导,他是为了教会我们如何运用所学的知识去解决实际的问题,此外,还得出一个结论:知识必须通过应用才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。
本次设计过程中得到我们老师们的悉心指导。屈老师多次询问设计进程,并为我们指点迷津,帮助我们理顺设计思路,精心点拨、热忱鼓励。老师一丝不苟的作风,严谨求实的态度,踏踏实实的精神,不仅授我以文,并将积极影响我今后的学习和工作。在此诚挚地向老师们致谢,祝愿们老师身体健康,203130705岳慧慧
电子设计自动化技术EDA实习报告
全家幸福。
参考文献
[1]黄正瑾.CPLD系统设计技术入门与应用.北京:电子工业出版社,2003
[2]宋万杰,罗丰等.CPLD技术及其应用.西安:西安电子科技大学出版社,1999 [3]新编数字逻辑电路.北京邮电大学出版社.江国强.2006.12
[4]EDA技术与应用.电子工业出版社.江国强.2010.4
[5]数字电路EDA入门---VHDL程序实例集.北京邮电大学出版社.张亦华
[6]谭会生,张昌凡.EDA技术及应用[M].西安:西安电子科技大学出版社,2012.6 [7]潘松,黄继业.EDA技术实用教程[M].北京:科学出版社,2008.8
203130705岳慧慧 35
第二篇:EDA实习报告
EDA实验报告
系别:
班级:
姓名:
学号:
目录
1.EDA介绍
2.Quartus II软件介绍
3.实习任务
4.封装引脚图
5.设计程序
6.结果显示
7.实习心得
1.EDA介绍
EDA是电子设计自动化(Electronic Design Automation)缩写。EDA技术是以计算机为工具,根据硬件描述语言HDL(Hardware Description language)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。硬件描述语言HDL是相对于一般的计算机软件语言,如:C、PASCAL而言的。HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL[1]。
几乎所有适于大学生做的数字逻辑电路实验都可以在计算机上利用EDA(Electronic Design Automatic—电子设计自动化)软件进行设计、仿真,只有极少量外部配件不能在计算机上进行仿真。因此,在实验前期阶段,即实验预习阶段的主要应用工具是EDA软件,利用EDA软件可以设计、仿真实验课题,进行虚拟实验。通过虚拟实验使实验者在进入真实实验前就能对预做的实验有相当的了解,甚至可以预测到实验的结果。这样在实际做实验时,可以把许多设计型实验的难度降低,同时能有更多的时间让实验者动手做实验,研究问题,提高实验效率。当前数字电路设计已由计算机辅助设计进入到以计算机为主的设计时代。
2.Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus II 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。
3.1 设计信号发生器使其能在仪器上显示正弦、三角、方波、锯齿波(其中的两种波形)
2设计频率计使其能测出制定波形的频率
4.波形发生器封装引脚图
5.波形发生器程序(正弦波,方波)
Boxing4
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY boxing4 IS PORT(RIN:in std_logic;
clk: IN std_logic;SINT:in std_logic_VECTOR(1 downto 0);--set:in std_logic;--_vector;--(1 downto 0);rs,rw,en,lcdon,lcdbon : OUT STD_LOGIC;YOUT:out std_logic_vector(7 downto 0);data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END boxing4;ARCHITECTURE fwm OF boxing4 IS
TYPE states IS(clear_display,set_initial,set_cgram,write_cgram,set_addram1,diaplay_cgram,set_addram2,diaplay_cgrom);--clear_display-清屏;--set_initial-初始化设置;--set_cgram-设置 cgram 地址;--write_cgram-字模写入 cgram;--set_addram1-设置显示 cgram 字符的 addram 地址;--diaplay_cgram-显示 cgram 字符;--set_addram2-设置显示 cgrom 字符的 addram 地址;--diaplay_cgrom-显示 cgrom 字符 SIGNAL state:states;TYPE ram_array0 IS ARRAY(0 TO 7)OF STD_LOGIC_VECTOR(7 DOWNTO 0);--定义 ram_array0 为二维数组
TYPE ram_array1 IS ARRAY(0 TO 7)OF ram_array0;--定义 ram_array1 为三维数组 SIGNAL lcd_clk : STD_LOGIC;SIGNAL data1,data2,data3:INTEGER RANGE 0 TO 9;--signal n:std_logic;SIGNAL net1,net2:std_logic_vector(7 downto 0);--signal net3:std_logic;
COMPONENT choice4_1
PORT(s:in std_logic_vector(1 downto 0);
d1,d2: in std_logic_vector(7 downto 0);
y: out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT fangbo PORT(clkf,rf:in std_logic;
qf:out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT sin PORT(clksin,rsin:in std_logic;
da:out std_logic_vector(7 downto 0));END COMPONENT;BEGIN u1: fangbo PORT MAP(clkf=>CLK,rf=>RIN,qf=>net1);u2: sin PORT MAP(clksin=>CLK,rsin=>RIN,da=>net2);u3: choice4_1 PORT MAP(s=>SINT,d1=>net1,d2=>net2,y=>YOUT);en <=lcd_clk;rw<= '0';lcdon<='1';lcdbon<='1';data1<=1;data2<=2;data3<=5;
PROCESS(clk)
CONSTANT m : INTEGER:=50000;--50M 分频到 1kHz。
VARIABLE cout : INTEGER RANGE 0 TO 50000000:=0;BEGIN
IF clk'EVENT AND clk='0' THEN cout:=cout+1;
IF cout<=m/2 THEN lcd_clk<='1';
ELSIF cout ELSE cout:=0; END IF; END IF; END PROCESS; PROCESS(lcd_clk)CONSTANT cgram : ram_array1:=(--自定义 8 个 5*8 字符的字模(X“00”,X“0E”,X“00”,X“0E”,X“00”,X“1F”,X“00”,X“00”),--SAN(X“04”,X“1F”,X“04”,X“07”,X“05”,X“09”,X“13”,X“01”),--FANG(X“00”,X“1f”,X“04”,X“04”,X“17”,X“14”,X“14”,X“1f”),--ZHENG(X“0E”,X“02”,X“0E”,X“08”,X“08”,X“0e”,X“02”,X“0e”),--ZUO XIAN(X“04”,X“1E”,X“04”,X“08”,X“1e”,X“04”,X“09”,X“1f”),--YOU XIAN(X“00”,X“13”,X“0A”,X“03”,X“1a”,X“02”,X“0a”,X“13”),--ZUO BO(X“08”,X“1F”,X“09”,X“1E”,X“14”,X“08”,X“14”,X“03”),--YOU BO(X“18”,X“18”,X“07”,X“08”,X“08”,X“08”,X“07”,X“00”)--℃字符数据存储器); VARIABLE datacnt:INTEGER RANGE 0 TO 15; VARIABLE cnt: STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE num:INTEGER RANGE 0 TO 7;BEGIN--wait until net3='0';RISING_EDGE(lcd_clk); IF RISING_EDGE(lcd_clk)THEN --if sint=“00”then case sint is when “11”=> CASE state IS WHEN clear_display=> rs<='0';data<=“00000001”;state<=set_Initial;--清屏 WHEN set_initial=> IF datacnt<3 THEN rs<='0';data<=“00111000”;datacnt:=datacnt+1;--设置功能:8 位,两行,5×8/每字符,重复 3 次 ELSIF datacnt=3 THEN rs<='0';data<=“00000110”;datacnt:=datacnt+1;--显示模式:完成一个字符码传送后,AC 自动加 1;显 ELSIF datacnt=4 THEN rs<='0';data<=“00001100”;datacnt:=datacnt+1;--显示控制:显示开,光标关,光标不闪烁 ELSE rs<='0';datacnt:=0;state <= set_cgram; END IF; WHEN set_cgram=>rs<='0';--设置 CGRAM 字符地址 data<=“01000000”+cnt;state<=write_cgram;--设置 CGRAM 字符地址 000 IF num <8 THEN cnt:=cnt+“00001000”;--设置 CGRAM 字符地址加 1 END IF; WHEN write_cgram=> rs<='1';--在 指 定 的--CGRAM 字符地址写入对应的 8 个 5*8 字符字模 data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram;--写入 CGRAM 字符地址 000 的 5*8--字符字模 IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram;--写入下一个自定义--的 5*8 字符字模 IF num =7 THEN num:=0;cnt:=“00000000”;state<=set_addram1;--8 个 5*8 字符字模写--入完成 END IF; END IF; WHEN set_addram1=>rs<='0';--设置 ADDRAM 地址 1 data<=“10000000”;state<=diaplay_cgram; WHEN diaplay_cgram=>rs<='1';--显示 ADDRAM 地址对应的 CGRAM 字符 --if sint=“00”then IF datacnt=0 THEN data<=X“02”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“03”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data <= X“04”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“05”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“06”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“46”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“3a”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“31”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“30”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=X“4d”;datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“48”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--显示 cgrom 中指定的 ELSIF datacnt=14 THEN data<=X“5a”;datacnt:=datacnt+1; ELSE data<=X“20”;datacnt:=0;state <= set_addram2; END IF; WHEN set_addram2=>rs<='0';--设置 ADDRAM 地址 2 data<=“11000000”;state<=diaplay_cgrom; WHEN diaplay_cgrom=>rs<='1'; IF datacnt=0 THEN data<=X“4A”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“41”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data<=X“43”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“4B”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1; ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1; ELSE data<=X“56”;datacnt:=0;state <= set_addram1; END IF; END CASE; --end if; when “01”=> --elsif sint =“01”then CASE state IS WHEN clear_display=> rs<='0';data<=“00000001”;state<=set_Initial;--清屏 WHEN set_initial=> IF datacnt<3 THEN rs<='0';data<=“00111000”;datacnt:=datacnt+1;--设置功能:8 位,两行,5×8/每字符,重复 3 次 ELSIF datacnt=3 THEN rs<='0';data<=“00000110”;datacnt:=datacnt+1;--显示模式:完成一个字符码传送后,AC 自动加 1;显 ELSIF datacnt=4 THEN rs<='0';data<=“00001100”;datacnt:=datacnt+1;--显示控制:显示开,光标关,光标不闪烁 ELSE rs<='0';datacnt:=0;state <= set_cgram; END IF; WHEN set_cgram=>rs<='0';--设置 CGRAM 字符地址 data<=“01000000”+cnt;state<=write_cgram;--设置 CGRAM 字符地址 000 IF num <8 THEN cnt:=cnt+“00001000”;--设置 CGRAM 字符地址加 1 END IF; WHEN write_cgram=> rs<='1';--在 指 定 的--CGRAM 字符地址写入对应的 8 个 5*8 字符字模 data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram;--写入 CGRAM 字符地址 000 的 5*8--字符字模 IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram;--写入下一个自定义--的 5*8 字符字模 IF num =7 THEN num:=0;cnt:=“00000000”;state<=set_addram1;--8 个 5*8 字符字模写--入完成 END IF; END IF; WHEN set_addram1=>rs<='0';--设置 ADDRAM 地址 1 data<=“10000000”;state<=diaplay_cgram; WHEN diaplay_cgram=>rs<='1';--显示 ADDRAM 地址对应的 CGRAM 字符 --if sint=“00”then IF datacnt=0 THEN data<=X“01”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“05”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data <= X“06”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“46”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“3a”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“31”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“30”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=X“4d”;datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“48”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--显示 cgrom 中指定的 ELSIF datacnt=14 THEN data<=X“5a”;datacnt:=datacnt+1; ELSE data<=X“20”;datacnt:=0;state <= set_addram2; END IF; WHEN set_addram2=>rs<='0';--设置 ADDRAM 地址 2 data<=“11000000”;state<=diaplay_cgrom; WHEN diaplay_cgrom=>rs<='1'; IF datacnt=0 THEN data<=X“4A”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“41”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data<=X“43”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“4B”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1; ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1; ELSE data<=X“56”;datacnt:=0;state <= set_addram1; END IF; END CASE; --end if; when others =>null; end case; END IF;end process;END fwm; Choice4-1 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; --程序包 entity choice4_1 is --定义实体 port(s:in std_logic_vector(1 downto 0); --信号选择端口s d1,d2: in std_logic_vector(7 downto 0);--d1d2d3d4分别连接四个波形发生模块 y: out std_logic_vector(7 downto 0));--定义输出信号端口 end choice4_1;architecture behav of choice4_1 is --结构体 begin process(s) begin case s is --case when语句进行信号位的选择 when “01”=>y<=d1; when “11”=>y<=d2; when others=>null; end case;end process; --进程结束 end behav; --结构体结束 fangbo library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fangbo is port(clkf,rf:in std_logic;qf:out std_logic_vector(7 downto 0));end entity;architecture behav of fangbo is signal a:bit;begin process(clkf,rf)--计数分频 variable cnt:integer range 0 to 256;begin if(rf='0')then a<='0';elsif clkf'event and clkf='1' then if cnt<255 then--进行分频 cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;process(clkf,a)--信号输出 begin if clkf'event and clkf='1' then if a='1' then qf<=“11111111”;else qf<=“00000000”;end if;end if;end process;end behav; sin library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity sin is port(clksin,rsin:in std_logic;da:out BIT_vector(7 downto 0));end entity;architecture behav of sin is signal a:bit;begin process(clksin,rsin)--计数分频 variable cnt:integer range 0 to 256;begin if(rsin='0')then a<='0';elsif clksin'event and clksin='1' then if cnt<4 then--进行分频 cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;--process(clksin,a)process(a) variable tmp:std_logic_vector(7 downto 0);variable d:BIT_vector(7 downto 0);begin--if a='0' then--d:=“00000000”;--elsif clksin'event and clksin='1' then if a'event and a='1' then if tmp=“00111111” then tmp:=“00000000”;else tmp:=tmp+1;end if;case tmp is when “00000000”=>d:=“11111111”;when “00000001”=>d:=“11111110”;when “00000010”=>d:=“11111100”;when “00000011”=>d:=“11111001”;when “00000100”=>d:=“11110101”;when “00000101”=>d:=“11101111”;when “00000110”=>d:=“11101001”;when “00000111”=>d:=“11100001”;when “00001000”=>d:=“11011001”;when “00001001”=>d:=“11001111”;when “00001010”=>d:=“11000101”;when “00001011”=>d:=“10111010”;when “00001100”=>d:=“10101110”;when “00001101”=>d:=“10100010”;when “00001110”=>d:=“10010110”;when “00001111”=>d:=“10001010”;when “00010000”=>d:=“01111100”;when “00010001”=>d:=“01100000”;when “00010010”=>d:=“01100011”;when “00010011”=>d:=“01010111”;when “00010100”=>d:=“01001011”;when “00010101”=>d:=“01000000”;when “00010110”=>d:=“00110101”;when “00010111”=>d:=“00101011”;when “00011000”=>d:=“00100010”;when “00011001”=>d:=“00011010”;when “00011010”=>d:=“00010011”;when “00011011”=>d:=“00001101”;when “00011100”=>d:=“00001000”;when “00011101”=>d:=“00000001”;when “00011110”=>d:=“00000001”;when “00011111”=>d:=“00000000”;when “00100000”=>d:=“00000000”;when “00100001”=>d:=“00000001”;when “00100010”=>d:=“00000001”;when “00100011”=>d:=“00001000”;when “00100100”=>d:=“00001101”;when “00100101”=>d:=“00010011”;when “00100110”=>d:=“00011010”;when “00100111”=>d:=“00100010”;when “00101000”=>d:=“00101011”;when “00101001”=>d:=“00110101”;when “00101010”=>d:=“01000000”;when “00101011”=>d:=“01001011”;when “00101100”=>d:=“01010111”;when “00101101”=>d:=“01100011”;when “00101110”=>d:=“01100000”;when “00101111”=>d:=“01111100”;when “00110000”=>d:=“10001001”;when “00110001”=>d:=“10010110”;when “00110010”=>d:=“10100010”;when “00110011”=>d:=“10101110”;when “00110100”=>d:=“10111010”;when “00110101”=>d:=“11000101”;when “00110110”=>d:=“11011001”;when “00110111”=>d:=“11011001”;when “00111000”=>d:=“11100001”;when “00111001”=>d:=“11101001”;when “00111010”=>d:=“11101111”;when “00111011”=>d:=“11110101”;when “00111100”=>d:=“11111001”;when “00111101”=>d:=“11111100”;when “00111110”=>d:=“11111110”;when “00111111”=>d:=“11111111”;when others=>null;end case;end if;da<=d SRL 1;--幅度调整 end process;end behav; 频率计 1、频率产生器: library ieee;use ieee.std_logic_1164.all;library lpm;use lpm.lpm_components.all;entity lpm_counter0 is port(clock: in std_logic;q: out std_logic_vector(26 downto 0));end lpm_counter0;architecture syn of lpm_counter0 is signal sub_wire0 : std_logic_vector(26 downto 0);component lpm_counter generic(lpm_direction : string; lpm_port_updown : string;lpm_type : string;lpm_width : natural);port(clock : in std_logic; q : out std_logic_vector(26 downto 0));end component;begin q <= sub_wire0(26 downto 0);lpm_counter_component : lpm_counter generic map(lpm_direction => “up”,lpm_port_updown => “port_unused”,lpm_type => “lpm_counter”,lpm_width => 27)port map(clock => clock,q => sub_wire0);end syn; 2、测频控制信号发生器 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为0.5Hz 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; 3、有时钟使能的十进制计数器 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位计数结果输出 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为低电平1时清零 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;4、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;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; 5、数码管控制器 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位信号 com: out std_logic_vector(3 downto 0));--输出数码管选择信号 end ledcom;architecture art of ledcom is signal comclk: std_logic_vector(1 downto 0);begin--comclk同扫描频率clk循环变化 process(clk)begin if rising_edge(clk)then if comclk>=3 then comclk <=“00”; else comclk<=comclk+1;end if;end if;end process;--数码管选择 process(comclk)begin case comclk is when “00” => com<=“1000”;when “01” => com<=“0100”;when “10” => com<=“0010”;when “11” => com<=“0001”;when others =>NULL;end case;end process;--对应数码管的输出 process(comclk,datain)begin case comclk is when “11”=> dataout<=datain(3 downto 0);when “10”=> dataout<=datain(7 downto 4);when “01”=> dataout<=datain(11 downto 8);when “00”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art; 6、七段数码管的译码器 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(7 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<=“11000000”;--0 when “0001” => d_out<=“11111001”;--1 when “0010” => d_out<=“10100100”;--2 when “0011” => d_out<=“10110000”;--3 when “0100” => d_out<=“10011001”;--4 when “0101” => d_out<=“10010010”;--5 when “0110” => d_out<=“10000010”;--6 when “0111” => d_out<=“11111000”;--7 when “1000” => d_out<=“10000000”;--8 when “1001” => d_out<=“10010000”;--9 when others =>NULL;end case;end process;end art; 7、元件声明及例化将各个元器件依据设计相连 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(3 downto 0));end lx;architecture art of lx is component lpm_counter0--待调用的频率生成器端口定义 PORT(clock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR(26 DOWNTO 0));end component;--十进制计数器 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;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);com: out std_logic_vector(3 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);u9:lpm_counter0 port map(clk,q(25)=>clk1,q(15)=>clk2,q(17)=>clk3);end art; 6.结果显示 7.实习心得 贵州师范大学学生 实习报告 科目:EDA实习 专业: 电气工程及其自动化 班级: 10电气 姓名: 李启应 学号: 101401010202 实验项目名称:数字电子钟的设计 实验项目性质:普通试验 所属课程名称:VHDL程序设计 一、实验目的 学习VHDL语言的一些基本特点。2 掌握VHDL程序的基本结构。3掌握VHDL程序设计方法。要能够用vhdl语言读懂并编写eda程序,对eda设计的总体框架能有较好的把握,掌握各模块的调用方式。 二、实验内容和要求 设计一个数字时钟,显示时(2位),分(2位),秒(2位),具体要求是:具有时分秒计数显示功能,以24小时循环计时;数码管动态显示时,分,秒;具有清零功能。 在软件工具平台上,进行VHDL语言的各模块编程输入、编译实现和仿真验证。 三、实验主要仪器设备和材料 计算机,开发环境MAX-PLUSII,ZY11EDA实验系统,VHDL语言。 四、实验方法、步骤及结果测试 1、设计思路: 数字钟的主体是计数器,它记录并显示接收到的秒脉冲个数,其中秒和分位60进制计数器,小时为24进制计数器,分别产生3位BCD码。BCD码经译码,驱动后接数码显示电路。 根据实验要求,将设计分为5个主要部分,时功能模块、分功能模块、秒功能模块、扫描仪功能模块和7段LED功能模块。在时、分、秒模块中,包括复位和预置数,其主要思路如下: 秒钟的模块:设计一个60进制的计数器,以clk为其时钟信号,每60个clk后产 生一个进位信号CF给分钟模块,作为分钟进程的响应信号。秒钟模块VHDL程序见附录1: 仿真波形如下: 封装如下图: 分钟的模块:同理于秒钟的模块,设计一个60进制的计数器,以CFM为其时钟信号,每60个CFM后产生一个进位信号CFM给小时模块,作为小时模块进程的响应信号。分钟模块VHDL程序见附录二: 仿真波形如下: 封装如下图: 小时的模块:为24进制计数器,在分的进位信号CFM的激发下计数,从0到23的时候产生一个信号CFH,全部清0,重新开始计时。小时模块VHDL程序见附录三: 仿真波形如下: 封装如下图: 扫描仪模块:在扫描仪内部,有一个3-8译码器的片选信号,当3-8译码器的片选信号为000时,片选信号选中7段LED模块中的秒的个位,当3-8译码器的片选信号为001时,片选信号选中7段LED模块中的秒的十位,当3-8译码器的片选信号为010时,片选信号选中7段LED模块中的分的个位,当3-8译码器的片选信号为011时,片选信号选中7段LED模块中的分的十位,当3-8译码器的片选信号为100时,片选信号选中7段LED模块中的时的个位,当3-8译码器的片选信号为101时,片选信号选中7段LED模块中的时的十位,就这样动态扫描,当输入的时钟信号频率很高的时候,就形成了我们的时钟。 扫描仪模块VHDL程序见附录四: 仿真波形如下: 封装如下图: 7段LED模块:根据动态扫描仪的片选信号来依次点亮我们所需的时间。7段LED模块VHDL程序见附录五: 仿真波形如下: 封装如下图: 综合以上5大模块,把它们用线连接起来就得到我们的总的电路图:如下图所示: 其工作原理为:扫描仪3-8译码器的片选信号根据时分秒的输入选中7段LED模块,然后再由时分秒中产生的3位BCD码来输出秒的个位,十位、时的个位,十位、小时的个位,十位。 4.总结: 在实验这两周的时间里,我们做过DC触发器、DQ触发器、3-8译码器、二选一电路和四选一电路等,最后综合做了数字时钟电路,通过这次实习,我对用VHDL来编程有了更深的了解,在要编程的时候,我学会了分模块进行,因为一开始的时候设计一个时钟系统比较麻烦,没有分模块之前总是会有差错,而之后思路就会比较清晰,有明确的方案,在对照书本里的编程规则与语句,就完成了这次的设计,总之就是获益良多。附录1:秒钟模块VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity second is port(clk,reset:in std_logic;cf:out std_logic;second1_out:out std_logic_vector(3 downto 0);second10_out:out std_logic_vector(2 downto 0));end entity second;architecture one of second is signal second1n:std_logic_vector(3 downto 0);signal second10n:std_logic_vector(2 downto 0);begin second1_out<=second1n;second10_out<=second10n;process(clk,reset)begin if(reset='1')then second1n<=“0000”;second10n<=“000”;elsif(clk' event and clk='1')then if(second1n=“1001”)then 7 second1n<=“0000”;if(second10n=“101”)then second10n<=“000”;cf<='1';else second10n<=second10n+1;end if;else second1n<=second1n+1;end if;end if;end process;end architecture one;附录二:分钟模块VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity minute is port(clk,reset:in std_logic;cf:out std_logic;minute1_out:out std_logic_vector(3 downto 0);minute10_out:out std_logic_vector(2 downto 0));end entity minute;architecture one of minute is signal minute1n:std_logic_vector(3 downto 0);signal minute10n:std_logic_vector(2 downto 0);begin minute1_out<=minute1n;minute10_out<=minute10n;process(clk,reset)begin if(reset='1')then minute1n<=“0000”;minute10n<=“000”;elsif(clk' event and clk='1')then if(minute1n=“1001”)then minute1n<=“0000”;if(minute10n=“101”)then minute10n<=“000”;cf<='1';else minute10n<=minute10n+1;end if;else minute1n<=minute1n+1;end if;end if;end process;end architecture one;附录三:小时模块VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hour is port(clk,reset:in std_logic;hour1_out:out std_logic_vector(3 downto 0);hour10_out:out std_logic_vector(1 downto 0));end entity hour;architecture one of hour is signal hour1n:std_logic_vector(3 downto 0);signal hour10n:std_logic_vector(1 downto 0);begin hour1_out<=hour1n;hour10_out<=hour10n;process(clk,reset)begin if(reset='1')then hour1n<=“0000”;hour10n<=“00”;elsif(clk' event and clk='1')then if(hour1n=“1001”or(hour1n=“0011”and hour10n=“0010”))then hour1n<=“0000”;if(hour10n=“10”)then hour10n<=“00”;else hour10n<=hour10n+1;end if;else hour1n<=hour1n+1;end if;end if;end process;end architecture one;附录四:扫描仪模块VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity saomiaoyi is port(clk:in std_logic;reset:in std_logic;second1,minute1,hour1:in std_logic_vector(3 downto 0);second_10,minute_10:in std_logic_vector(2 downto 0);hour_10:in std_logic_vector(1 downto 0);dataout:out std_logic_vector(3 downto 0);sel:out std_logic_vector(2 downto 0));end entity saomiaoyi;architecture one of saomiaoyi is signal count:std_logic_vector(2 downto 0);begin sel<=count;process(clk,reset)begin if(reset='1')then dataout<=“0000”;elsif(clk'event and clk='1')then if count>=“101” then count<=“000”;else count<=count+1;end if;end if;case count is when“000”=>dataout<=second1;when“001”=>dataout<='0'& second_10;when“010”=>dataout<=minute1;when“011”=>dataout<='0'& minute_10;when“100”=>dataout<=hour1;when others =>dataout<=“00”& hour_10;end case;end process;end architecture one; 附录五:7段LED模块VHDL程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY led_7 IS PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END entity led_7;ARCHITECTURE one OF led_7 IS BEGIN PROCESS(A)BEGIN CASE A(3 DOWNTO 0)IS WHEN “0000” => LED7S <= “0111111”;--X“3F” 0 WHEN “0001” => LED7S <= “0000110”;--X“06” 1 WHEN “0010” => LED7S <= “1011011”;--X“5B” 2 WHEN “0011” => LED7S <= “1001111”;--X“4F” 3 WHEN “0100” => LED7S <= “1100110”;--X“66” 4 WHEN “0101” => LED7S <= “1101101”;--X“6D” 5 WHEN “0110” => LED7S <= “1111101”;--X“7D” 6 WHEN “0111” => LED7S <= “0000111”;--X“07” 7 WHEN “1000” => LED7S <= “1111111”;--X“7F” 8 WHEN “1001” => LED7S <= “1101111”;--X“6F” 9 WHEN OTHERS => NULL;END CASE;END PROCESS;END ARCHITECTURE one; 青岛农业大学 电子设计自动化课程设计报告 2013——2014学年 第1学期 实习题目:数字式竞赛抢答器 姓名 : 学号 : 专业班级: 指导老师: 2013年8月26日 EDA技术及应用实习报告 自动售卖机 信息13-2班06号 GMH 北华大学电气信息工程学院 目 录 一、设计任务功能简介............................................................................2 1、设计任务......................................................................................2 2、主要功能......................................................................................2 二、原理、方案、框图及任务分解........................................................2 1、原理...............................................................................................2 2、方案...............................................................................................2 3、框图...............................................................................................3 4、任务分解......................................................................................3 三、关键任务的设计代码及注释............................................................4 四、调试中出现的问题及解决方案........................................................8 1、问题一...........................................................................................8 2、问题二...........................................................................................8 五、产业化市场分析及预测....................................................................8 六、测试及运行结果................................................................................9 七、参考文献...........................................................................................1 一、设计任务功能简介 1、设计任务 自动售货机设计。利用软件QuartusII软件,使用VHDL语言结合硬件要求对本题目设计功能进行编程,并在完成整个硬件程序设计后,在软件平台上进行编译和电路仿真,最后生成的目标文件下载到DE2-70实验板上实现上述所有功能并验证程序的可行性。 2、主要功能 本设计主要实现的功能为:货物信息存储功能、商品选择功能、输入钱数处理功能、货架商品更换功能、语音提示功能、信息显示等功能。 二、原理、方案、框图及任务分解 1、原理 自动售货机(Vending Machine,VEM)是能根据投入的钱币自动付货的机器。自动售货机是商业自动化的常用设备,它不受时间、地点的限制,能节省人力、方便交易。是一种全新的商业零售形式,又被称为24小时营业的微型超市。能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。自动售货机是台机电一体化的自动化装置,在接受到货币已输入的前提下,靠触摸控制按 扭输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出。 2、方案 根据题目要求机器设有2个投币孔,机器可以接受1元和5元的纸币,分别有八种商品,价格分别为1元,4元,2元,3元,6元,7元,5元,8元,机器采用拨码开关模拟机器的复位键、确认购买键和商品选择,并且通过开发板上的LED等分别显示购买的不同情况,数码管实时显示购买金额,包括投入的价钱,找零的价钱。此设计按照EDA课程设计 的流程进行源代码的编写、仿真。本设计主要利用QuartusⅡ等设计软件进行设计。 3、框图 依题目要求设计流程框图如下所示: 图2-1 程序流程图 4、任务分解 本设计主要包括按键模块、显示模块、语音提示模块。设计程序任务如下图: 图2-2 程序任务图 任务一:存储商品信息。商品名称及商品价格等信息。 任务二:响应用户选择商品的操作。用户用过按键选择商品,售卖机要实时显示商品名称及价格信息。任务三:货币处理。待用户选择商品结束,售卖机要接收用户投币,包括判断纸币的面额、总金额、是否投币结束等信息。 任务四:人性化设计。售卖机要有良好的人性化交互界面,以及必要的文字、语音等提示信息。 三、关键任务的设计代码及注释 10000“; elsif item =”100“ then item_dis <=”10011001“;money_dis<=”11111001“; elsif item =”101“ then item_dis <=”10010010“;money_dis<=”10011001“; elsif item =”110“ then item_dis <=”10000010“;money_dis<=”10110000“; elsif item =”111“ then item_dis <=”11111000“;money_dis<=”10000000“;end if;end if;else item_dis<=”11111111“;money_dis 商品选择进程设计: data:process(START,sel_add)begin if START='1' then f sel_add'event and sel_add='1' then item<=item+1;if item =”000“ then item_dis <=”11000000“;money_dis<=”10011001“;elsif item =”001“ then item_dis <=”11111001“;money_dis<=”11111000“;elsif item =”010“ then item_dis <=”10100100“;money_dis<=”10100100“;elsif item =”011“ then item_dis <=”10110000“;money_dis<=”101<=“11111111”;price <=“0000”;end if;end process data;-------------------------付钱进程设计: pay:process(finish ,one,five)begin if finish='1' then if one'event and one ='1' then pay_money_one<=pay_money_one+1; if five'event and five ='1' then pay_money_five<=pay_money_five+5;end if;pay_money <= when “0001” => <= pay_money_dis_g “11111001”;pay_money_dis_s <= “11000000”;when “0010” => <= pay_money_dis_g “10100100”;pay_money_dis_s <= “11000000”;when “0011” => <= pay_money_dis_g “10110000”;pay_money_dis_s <= “11000000”;when “0100” => <= pay_money_dis_g “10011001”;pay_money_dis_s <= “11000000”;when “0101” => <= pay_money_five+pay_money_one;case pay_money is when “0000” => <= pay_money_dis_g “10010010”;pay_money_dis_s <= “11000000”;when “0110” => <= pay_money_dis_g “11000000”;pay_money_dis_s <= “11000000”; pay_money_dis_g “10000010”;pay_money_dis_s <= “11000000”;when “0111” => <= when “1100” => <= pay_money_dis_g “10100100”;pay_money_dis_s <= “11111001”;when “1101” => <= pay_money_dis_g “11111000”;pay_money_dis_s <= “11000000”;when “1000” => <= pay_money_dis_g “10110000”;pay_money_dis_s <= “11111001”;when “1110” => <= pay_money_dis_g “10000000”;pay_money_dis_s <= “11000000”;when “1001” => <= pay_money_dis_g “10011001”;pay_money_dis_s <= “11111001”;when “1111” => <= pay_money_dis_g “10010000”;pay_money_dis_s <= “11000000”;when “1010” => <= pay_money_dis_g “10010010”;pay_money_dis_s <= “11111001”; when others => pay_money_dis_g <=“11000000”;pay_money_dis_g “11000000”;pay_money_dis_s <= “11111001”;when “1011” => <= pay_money_dis_s <= pay_money_dis_g “11000000”;end case; if pay_money >= price then “11111001”;pay_money_dis_s <= “11111001”;back <= pay_money-price;case back is when “0000” => money_back_dis <= “11000000”;when “0001” => money_back_dis <= “11111001”;when “0010” => money_back_dis <= “10100100”;when “0011” => money_back_dis <= “10110000”;when “0100” => money_back_dis <= “10011001”;when “0101” => money_back_dis <= “10010010”;when “0110” => money_back_dis <= “10000010”;when “0111” => money_back_dis <= “11111000”;when “1000” => money_back_dis <= “10000000”; when “1001” => money_back_dis <= “10010000”; when others => money_back_dis <=“11000000”; ----------------------声音提示进程设计: int:process(START,finish) begin if START ='1' and finish = '0' then sound<=“01”; elsif START ='1' and finish = '1' then sound<=“10”; elsif START ='0' and finish = '0' then sound<=“11”; end if; end process int; ----------------------end architecture behav; 四、调试中出现的问题及解决方案 1、问题一 问题描述:本设计语音芯片采用LJ600,选择扬声器输出模式,可存储6段语音片段,对应6个引脚下降沿触发且低电平至少维持1ms,语音触发之后必须处于高电平状态,否则影响其他语音输出。综上描述,触发信号应为一个门信号。由于系统未引入时钟,且在同一进程中不可对输出信号重复赋值,产生问题。 解决办法:代码如下图,在if语句中实现状态跳转。 2、问题二 变量初始化状态必须明确定义高低电平。即状态输出时,必须考虑高低电平两种状态,不可以出现不确定状态。完全按照语法要求。 五、产业化市场分析及预测 随着信息技术的发展及人们生活水平的不断提高,人们的消费观念及消费需求都在不断地改变和提高。自动售卖机正是为了满足人们的这种需求而在多年前被引入国内的。但早期的自动售卖机在国内并未获得预期的市场反应及消费者的广泛使用。现阶段大多数的自动售 卖机只投放在国内一线城市,销售的货品也只停留在零食、饮料、饮用水、计生用品等有限的几样品种。在零售业市场竞争日趋白热化的今天,压缩经营成本是增强企业市场竞争力的一个主要手段。然而无论是连锁超市还是便利店,日益高涨的店面租金及人力成本,已经成为他们无法忽视也无法回避的沉重负担。而自动售卖机却完全没有上述所说的麻烦,它24小时营业、售货便利、方便找零,占地面积小(一般仅需1平方米)、移动性强,无须常驻人员盯守、省人工成本,时尚新颖、个性独特、集高科技于一体,有利于树立品牌形象,养护费用低,日常免维护……这些优势势必引领潮流,使得自动售卖机日发成为市场新宠,在零售业市场占领一席之地。 六、测试及运行结果 售卖机整体结构如下图所示: 图6-1 整体结构 商品0的价格为4元。 商品1价格为7元。 商品7价格为8元,输入11元,找零3元。 商品选择按钮及确定按键。 七、参考文献 [1]潘松,黄继业.EDA技术与VHDL.第4版.北京:清华大学出版社,2013.4 [2]潘松,王国栋.VHDL实用教程(修订版).成都:成都电子科技大学出版社,2001 [3]曾繁泰,陈美金.VHDL程序设计.北京:清华大学出版社,2001.1第三篇:EDA实习报告
第四篇:eda实习报告封皮
第五篇:EDA实习报告(自动售卖机)