第一篇:EDA综合实验设计报告
Beijing Jiaotong University
EDA实验设计报告
指导老师:刘彪
学
院:电子信息工程学院 姓
名:黄家维 学
号:13213012 班
级:电子1301
实验地点:电气楼406
实验日期:2014年5月29日星期四
实验一熟悉QuartusII软件的安装及使用(4学时)
我们通过下载及安装,可在电脑上运行Altera Quartus II。打开软件,新建一个工程,在工程底下新建一个VHDL File,即可实现编程功能。编完程序后点击Start Compilation可试运行程序,待编写的程序运行无误后,再在此工程下新建一个Vector Waveform File,给程序中的输入变量赋值,保存后点击Start Simulation即可实现程序的仿真。实验
二、组合逻辑电路的设计 实验方案设计、实验方法、1.实验方案
8-3优先编码器的VHDL描述有多种方法,设计过程中可以根据真值表采用case…when语句、with…select语句、if…then结构等多种手段实现,也可以根据真值表分析输入输出间的逻辑关系,根据逻辑关系写出其布尔表达式,根据布尔代数式调用基本逻辑门元件实现8-3优先编码器。
本实验中根据真值表用if-then结构实现8-3优先编码器 2.实验方法
首先根据前文所述,对照真值表的列出的不同输入逻辑状态,分情况依次输出于输入的对应关系,而后编译综合,由开发系统自行实现电路功能。实验步骤
1.设计输入 利用FILENew菜单输入VHDL源程序,创建源文件 2.设计项目的创建 1)原文件存储…..2)利用FILEProjectSet Project… 3.设计编译 ….4.器件选择及管脚分配 …..5.设计仿真 …..6.时序分析 …..7.编程下载(可选)….LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ENCODER IS
PORT(D:IN TO 7);
A:OUT STD_LOGIC_VECTOR(0 TO 2));END;ARCHITECTURE XIANI OF ENCODER IS BEGIN PROCESS(D)BEGIN IF
(D(7)='0')THEN A<=“111”;
ELSIF(D(6)='0')THEN A<=“110”;
STD_LOGIC_VECTOR(0
ELSIF(D(5)='0')THEN A<=“101”;
ELSIF(D(4)='0')THEN A<=“100”;
ELSIF(D(3)='0')THEN A<=“011”;
ELSIF(D(2)='0')THEN A<=“010”;
ELSIF(D(1)='0')THEN A<=“001”;
ELSIF(D(0)='0')THEN A<=“000”;
ELSE A<=“ZZZ”;
END IF;END PROCESS;END;
1用CASE语句设计一个4-16译码器。设计思路:
通过case语句可实现使能端的控制及4-16译码器的功能,即输入一个四位二进制数,即可使输出的16个端口中相应的端口电平发生变化。用case语句来实现译码器中相应数值选择的功能恰到好处。程序:
其中实体名为SB2,when “0000”=> outt(15 downto 0)<=“***0”等语句即可实现从0011译码到第4位输出发生变化。具体程序如下: library ieee;use ieee.std_logic_1164.all;entity SB2 is
port(inn:in std_logic_vector(3 downto 0);
shi:in std_logic;
outt:out std_logic_vector(15 downto 0));end entity SB2;architecture sb of SB2 is
begin process(inn,shi)begin if shi='1' then case inn is when “0000”=>
outt(15 0)<=“***0”;when “0001”=>
outt(15 0)<=“***1”;when “0010”=>
outt(15 0)<=“***1”;when “0011”=>
outt(15 0)<=“***1”;when “0100”=>
outt(15 0)<=“***1”;when “0101”=>
outt(15 0)<=“***1”;when “0110”=>
outt(15
downto
downto
downto
downto
downto
downto
downto 0)<=“***1”;when “0111”=>
outt(15 0)<=“***1”;when “1000”=>
outt(15 0)<=“***1”;when “1001”=>
outt(15 0)<=“***1”;when “1010”=>
outt(15 0)<=“***1”;when “1011”=>
outt(15 0)<=“***1”;when “1100”=>
outt(15 0)<=“***1”;when “1101”=>
outt(15 0)<=“***1”;
downto
downto
downto
downto
downto
downto
downto when “1110”=> outt(15 downto 0)<=“***1”;when “1111”=>
outt(15
downto 0)<=“***1”;when others
=>outt(15
downto 0)<=“***1”;end case;end if;end process;end architecture;仿真波形:
当输入inn为0000时,输出outt中的第16个端口变为低电平,即实现了译码的功能。实际仿真波形如下图。
实验3:时序电路设计
设计4位二进制同步加/减法可逆计数器,其中 输入: clr:
异步清零(高电平有效)clk:
时钟输入
d3-d0:
4位二进制数输入端 updown:
加/减法控制信号(‘1’加,‘0’减)输出: q3-q0:
4位二进制计数输出 co:
进位输出 bo:
借位输出 设计思路:
用if语句实现清零及加减法的选择。若选择updown=1,则当时钟输入为高电平时输入的d就加1,当d=1111时进位输出co就变1,最后将d中的数送给q来输出,以达到4位二进制同步加/减法可逆计数器的设计。程序:
其中实体名为
CTRDIV16,程序中两个关键的if语句即可实现加减法的控制及进位、借位的输出。具体程序如下: library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;entity CTRDIV16 is
port(clk:in STD_LOGIC;
updown:in STD_LOGIC;
clr:in STD_LOGIC;
q:out STD_LOGIC_VECTOR downto 0);
co,bo:out std_logic);end CTRDIV16;
(3 architecture sbb of CTRDIV16 is signal d:std_logic_vector(3 downto 0);begin process(clk,clr,updown)begin if clr='1' then
d<=“0000”;elsif clk'event and clk='1' then
if updown='1' then
d<=d+'1';
co<='0';
bo<='0';
else
d<=d-'1';
co<='0';
bo<='0';
end if;
if d=“1111” and updown='1' then
co<='1';
bo<='0';
end if;
if d=“0000” and updown='0' then
bo<='1';
co<='0';
end if;end if;end process;process(d)begin q<=d;end process;end sbb;仿真波形:
若选取updown=1(加法),通过波形即可看出,该程序已经实现了d的加法运算,同时在d=1111时,进位输出co跳转一次,即有一个进位。
若选取updown=0(减法),该程序也实现了d的减法运算,同时在d=0000是,借位输出bo跳转一次,即有一个借位输出。具体仿真波形如下。
updown=1(加法)updown=0(减法)
实验感想:
quartusII可以模拟硬件设计,即为硬件程序烧写模拟软件,操作简单,易于运行。它让我熟练了实际硬件的使用语言和逻辑顺序,并能实现一些简单硬件的程序编制和模拟仿真,使我对VHDL和EDA有了更加具体而深刻的认识,我认为这次实验设计对使我获益匪浅,一定会为我以后的学习生活带来不少的益处。
第二篇:数字钟实验设计报告
数字钟实验设计报告
数字钟设计
一 设计任务
1.基本功能:以数字形式显示时、分、秒的时间,小时的计时要求为“24翻1”,分和秒的计时要求为60进位; 2.扩展功能:校时、正点报时及闹时功能;
二 电路工作原理及分析
数字电子钟主要由以下几个部分组成:秒信号发生器,时、分、秒计数器,显示器,校时校分电路,报时电路。
2.1数字钟的基本逻辑功能框图
图1 数字钟的基本逻辑功能框图
2.2振荡器的设计
振荡器是数字钟的核心。振荡器的稳定度及频率的精确度决定了数字钟的准确程度。通常选用石英晶体构成振荡器电路。一般来说,振荡的频率越高,计时精度越高。如果精度要求不高则可以采用由集成逻辑门与R、C组成的时钟源振荡器或集成电路计时器555与R、C组成的多谐振荡器,电路参数如图2所示.接通电源后,电容C1被充电,当Vc上升到2Vcc/3时,使vo为低电平,同时放电三极管T导通,此时电容C1通过R2和T放电,Vc下降。当Vc下降到Vcc/3时,vo翻转为高电平。电容C1放电所需时间为 tpL=R2ln2≈0.7R2C1 当放电结束时,T截止,Vcc将通过R1、R2向电容器 C1充电,一;Vc由Vcc/3上升到2Vcc/3所需的时间为
当平。如得到 振 故
tpH=(R1+R2)C1ln2≈0.7(R1+R2)C Vc 上升到2Vcc/3 时,电路又翻转为低电此周而复始,于是,是在电路的输出端就一个周期性的矩形波。其振荡频率为 f=1/(tpL+tpH)≈1.43/[(R1+2R2)C] 荡周期:T=T1+T2=(R1+2R2)C1In2 得 R1+2R2=T/C1In2=0.142k 选定R1=0.1K,R2=0.021k
图2 555振荡器(图中R1,R2值不为实际值)
图3 555振荡器产生的波形
2.3时、分、秒计数器电路
时、分、秒计数器电路由秒个位和秒十位,分个位和分十位及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而时个位和时十位为24进制计数器。
2.4校时电路
通过开关,触发器,逻辑门组成的校时电路来校时。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的.三 数字电路的设计
3.1计数电路的设计
由2个74LS90计数器和4个74LS290计数器组成的时分秒的计数电路。
3.1.1六十进制计数电路
秒计数和分计数单元为60进制计数器,其输出为8421BCD码。采用十进制计数器74LS290来实现时间计数单元的计数功能。由图可知,74LS90为异步清零计数器,有异步清零端12,13脚(高电平有效)。
图4 六十进制计数器
(1)秒计数器电路的电路图如图4所示
秒个位计数单元为10进制计数器,无需进制转换,当QAQBQCQD从1001变成0000时,U1 向U3 的输入端发出一个脉冲信号,使秒十位进1位。
秒十位计数单元为6进制,当QAQBQCQD变成0110时,通过与QBQC相连的导线,给U3 两个清零端一个信号,把它的两个清零端都变成1,计数器的输出被置零,跳过0110到1111的状态,又从0000开始,如此重复,十位和个位合起来就是60进制。
(2)分计数器
分的个位和十位计数单元的状态转换和秒的是一样的,只是它要把进位信号传输给时的个位计数单元,电路图如图4所示
3.1.2二十四进制计数器电路
时计数单元为24进制计数器,其输出为8421BCD码。采用十进制计数器74LS90来实现时间计数单元的计数功能。
时计数器电路的电路图如图5所示
图5 二十四进制计数器
当“时”十位的QAQBQCQD为0000或0001时,“时”的个位计数单元是十进制计数器,当个位的QAQBQCQD到1010时,通过与非门使得个位74LS90上的清零端为0,则计数器的输出直接置零,从0000开始。当十位的QAQBQCQD为0010时,通过与非门使得该74LS90的清零端为0,“时”的十位又重新从0000开始,此时的个位计数单元变成4进制,即当个位计数单元的QAQBQCQD为0100时,就要又从0000开始计数,这样就实现了“时”24进制的计数。
3.2校时电路的设计
数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。如图6所示,当开关J1按下时,直接给分个位计数器一个脉冲信号,使分计数器进1位,同时不影响数字钟的运行。同理,由J2对时计数器进行校对。
图6 校时校分电路
3.3 整点报时设计
仿广播电台正点报时电路的功能要求时:每当数字钟计时快要到正点时发出声响,通常按照4低音1高音的顺序发出间断声响,以最后一声高音结束的时刻是整点时刻。
每当数字钟计时快要到正点时发出声响,按照4低音1高音的频率发出间 断声响,前4低音声响频率为500HZ,后1高音声响频率为1000HZ。并以最后一 声高音结束的时刻为正点时刻。本设计中,报时电路采用TTL与非门。报时电路如图1.5所示。4声低音分别发生在59分51秒、53秒、55秒及57秒,最后一 声高音发生在59分59秒,声响均持续1秒。如表1.2所示。由表可得式1.1。只有当分十位的Q2M2Q0M2=11,分个位的Q3M1Q0M1=11,秒个位的Q2S2Q0S=11及秒个位的Q0S1=1时,音响电路才能工作。
3.4 报时电路的安装与调试
按照原理图及实物连线图接线。报时音响电路采用三极管3DG130来推动喇叭。报时所需的500Hz和1000Hz音频信号,分别取分频器的500Hz输出端和1000Hz输出端。
四 主要芯片的技术参数
4.1 74LS90芯片
74LS90芯片结构及引脚分布如图7所示,74LS90计数器是一种中规模的二一五进制计数器。它由四个主从JK触发器和一些附加门电路组成,整个电路可分两部分,其中FA触发器构成一位二进制计数器;FD、FC、FB构成异步五进制计数器,在74LS90计数器电路中,设有专用置“0”端R1、R2和置位(置“9”)端S1、S2。
图7 74LS90芯片
4.2 74LS290芯片
74LS190芯片的管脚分布如图8所示,其中,R9(1)、R9(2)称为置“9”端,R0(1)、R0(2)称为置“0”端;A、B端为计数时钟输入端,QAQBQCQD为输出端,NC表示空脚。74LS290具有以下功能:
置“9”功能:当R9(1)= R9(2)=1时,不论其他输入端状态如何,计数器输出QAQBQCQD=1001,而1001(2进制)=9(10进制),故又称为异步置数功能。
置“0”功能:当R9(1)和 R9(2)不全为1,并且R0(1)=R0(2)=1时,不论其他输入端状态如何,计数器输出QAQBQCQD=0000,故又称为异步清零功能或复位功能。
计数功能:当R9(1)和 R9(2)不全为1,并且R0(1)和R0(2)不全为1时,输入计数脉冲,计数器开始计数。
图8 74LS290芯片
五 心得体会
通过这次综合试验设计,大大提高了我分析问题的能力,同时提高了运用电工领域有关的软件进行电路模拟仿真的能力,将自己在课堂上学到的数电知识得到充分发挥,解决了很多问题,同时学到了很多元件和芯片的各种用途及性能,从中学到了很多书上没有明白的问题
本次的课程设计,是对所学的数电知识的一次综合应用,既考验了我的知识掌握程度,也锻炼了我的动手能力。在此过程中,我学到很多新知识,对电工电子课程的学习也更有兴趣了。虽然此次课程设计花费了一番功夫,却让我收获了很多,让我知道了学无止境,永远不能满足现有的知识,人生就像在爬山,一座山峰的后面还有更高山峰在等着你。
在这次数字电子钟课程设计中,也非常感谢同学的帮助!
第三篇:EDA设计报告
EDA
多 功 能 数 字 时 钟
专业:11级应用电子技术 班级:二班
学号:110372021307 姓名:贺成林 指导老师:祝宏
日期:2012年6月29日
一、实验目的
1、课程设计是一实践教学环节,是针对《数字电子技术》课程的要求,结合实践对学生进行综合设计性训练,在自学和实践训练中培养学生理论联系实践和实践动手能力,独立地解决实际问题能力。
2、通过课程设计是使学生熟悉和了解可编程专用数字逻辑电路的设计、开发流程,熟悉和了解现代EDA设计工具,掌握数字电子系统层次化的设计方法。
已知条件:MAX+Plus软件
基本功能:
1、以数字形式显示时、分、秒的时间;
2、小时计数器为24进制;
3、分秒计数器为60进制。
二、实验要求、综合应用《数字电子技术基础》课程中的理论知识去独立地完成一个设计课题;
2、熟悉和了解现代EDA设计、编程、编译、仿真及下载技术的全过程。
三、EDA 技术介绍
1、EDA 技术概况
EDA 是电子设计自动化(Electronic Design Automation)的缩写,在 20 世 纪 90 年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA 技术就是以计算机为工 具,设计者在 EDA 软件平台上,用硬件描述语言 HDL 完成设计文件,然后由计算机 自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特 定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA 技术的出现,极大地提 高了电路设计的效率和可*性,减轻了设计者的劳动强度。
2、ALTERA QUARTUS II 软件介绍
Quartus II 是 Altera 公司的综合性 PLD 开发软件,支持原理图、VHDL、VerilogHDL 以及 AHDL(Altera Hardware Description Language)等多种 设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件 配置的完整 PLD 设计流程。
四、关键词
数字计数器、动态显示、快速校分、整点报时、时段控制。
五、实验步骤
1、秒计数器是60进制的。当下面的74161到9时等下一个脉冲来是向上面的74161计数,到5时将两个74161共同预置。从而实现00—59秒的计数功能。
电路图如下:
进行编译及波形仿真,如下图: 将上述文件保存并打包,如图:
2、分计数器是60进制的。功能如秒计数器。其电路图如下:
波形图仿真及打包图如下:
3、小时计数器是24进制的。当下面的74161到9时等下一个脉冲来是向上面的74161计数。但是等到上面的记到2时下面的将不能超过4,所以等上面的记到2,下面的记到4时就将两个74161共同预置。从而实现00—24秒的计数功能。
原理图如下:
仿真的波形图及打包的文件图如下:
4、校时。校时是通过加快时分的计数速度来快速校准时间的。实际上我们把秒脉冲cps加到分计数和时计数上,是他们加快计数速度。所以其中我们需要通过开关来选择。
原理图及打包图如下:
5、时段控制:时段控制是通过7485集成电路的数据比较来控制的。
原理图及打包图如下:
6、整点报时:整点报时是通过整点时的二进制数据规律来报时的。
原理图及打包图如下:
7、将时分秒打包文件连成多功能数字电路图如下:
8、多功能数字钟硬件测试原理图如下:
9、部分制作过程图,如下:
六、实验工具
装有QuartusⅡ软件的电脑,EDA开发板,相关EDA设计方面的书籍。
七、设计中遇到问题及解决方法
1、实验后期的引脚分配及下载方法不当,实验所用电脑没有
quartus11.0 的 驱动。耗费时间较多。解决方法:参阅西安电子科技大学出版社出版的《数字电路设计及 Verilog HDL 实现》第 394 页关于引脚分配和下载验证的介绍;
2、下载验证过程中时段控制部分有错误,原代码在软件上仿真没有错误,但是下载到实验板验证时,出现错误。解决方法:通过去请教同学及查阅相关资料得到解决。
八、特点和实用性
利用 QuartusII 软件,结合所学的数字电路的知识设计一个 24 时多功能数 字钟,具有正常分、秒计时,动态显示、快速校分、整点报时、时段控制的功能。分析整个电路的工作原理,分别说明各子模块的设计原理和调试、仿真、编 程下载的过程,并对最终结果进行总结,最后提出在实验过程中出现的问题和解 决的方案。通过实验掌握一些逻辑组合器件的基本功能和用法,同时体会利用软件设计 电路的方便快捷,避免硬件布线的繁琐,提高效率。
九、心得体会
1、设计必须要有整体概念,提前熟悉软件。刚开始时没头绪,不知道该怎 样分块,进度很慢,加上对软件不是很熟悉,比如:封装要注意哪些,哪些不能 运行,哪些是不正确的操作等等,走了很多冤枉路。
2、设计的模块要分块调试,免得等所有都完工了再调试出错,那样的话很 难确定是什么出错,更加没头绪。有必要的话做一部分后就送到平台上调试,这 样会大大减少出错率。
3、没有硬件软件化的概念,开始设计时没有总体的规划,不知道什么是可行 的,什么是封装,怎样使搭配组合最优化。
4、遇到问题先自己摸索,查阅资料要有技巧,避免没有目的和思路。明白 自己要解决什么问题。同时请教老师,和同学交流。良好的沟通很重要。针对本次的毕业设计,用我国著名的数学家的话概括一下我的感受: “科学上没有平坦的大道,真理长河中有无数礁石险滩。只有不为畏攀登的采药者,只有不怕 巨浪的弄潮儿,才能登上高峰采得仙草,深入水底觅得骊珠。”
十、参阅教材及文献
1、蒋立平编著《数字电路》.南京理工大学翻印;
2、南京理工大学电子技术中心编著.《EDA 设计实验指导书》 南京理工大学,2008 年;
3、谭会生,张昌凡.《EDA 技术及应用》.西安电子科技大学出版社,2001年;
4、《数字电路设计及 Verilog HDL 实现》 西安电子科技大学出版社出版;
5、《电子线路实验设计与仿真讲义》。
第四篇: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;第五篇:EDA实习报告