VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦

VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦,第1张

图11

程序如下:

library IEEE;

use IEEESTD_LOGIC_1164ALL;

use IEEESTD_LOGIC_ARITHALL;

use IEEESTD_LOGIC_UNSIGNEDALL;

entity xuan21 is

Port ( alarm,a,b: in std_logic;

y:out std_logic);

end xuan21 ;

architecture one of xuan21 is

begin

process(alarm,a,b)

begin

if alarm='0' then y<=a;else y<=b;

end if;

end process;

end one;

仿真波形如下图12:

图12

(2)三位二选一:

模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。

图13

程序如下:

library IEEE;

use IEEESTD_LOGIC_1164ALL;

use IEEESTD_LOGIC_ARITHALL;

use IEEESTD_LOGIC_UNSIGNEDALL;

entity x213 is

Port ( alarm : in std_logic;

y:out std_logic_vector(3 downto 0);

a,b: in std_logic_vector(3 downto 0));

end x213;

architecture one of x213 is

begin

process(alarm,a,b)

begin

if alarm='0' then y<=a;else y<=b;

end if;

end process;

end one;

仿真结果如下图14:

图14

8、整点报时及闹时:

模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。

图15

程序如下:

library IEEE;

use IEEESTD_LOGIC_1164ALL;

use IEEESTD_LOGIC_ARITHALL;

use IEEESTD_LOGIC_UNSIGNEDALL;

entity voice is

Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);

in_1000,in_500:in std_logic;

q : out std_logic);

end voice;

architecture one of voice is

begin

process(min1,min0,sec1,sec0)

begin

if min1="0101" and min0="1001" and sec1="0101" then

if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"

then q<=in_500;

elsif sec1="0101" and sec0="1001" then q<=in_1000;

else q<='0';

end if;

else q<='0';

end if;

if min1=mh and min0=ml and hou1=hh and huo0=hl then

q<=in_1000;

end if;

end process;

end one;

仿真波形如下图16

图16

9、顶层原理图:

三、感想

通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示

:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

四、

参考资料:

1、潘松,王国栋,VHDL实用教程〔M〕成都:电子科技大学出版社,2000(1)

2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004

3、李衍编著,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005

4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004

5、沈明山编著,EDA技术及可编程器件应用实训北京:科学出版社,2004

6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997

7、辛春艳编著,VHDL硬件描述语言北京:国防工业出版社,2002 就这些

可以呀,给时钟周期事件里的每个子程序加个判断,利用程序集变量来控制子程序是否运行,按钮事件中改变相应的变量,达到控制的目的,给你写的源码如下

在窗口中加三个标签 三个按钮 一个时钟

版本 2

程序集 窗口程序集1

程序集变量 cs1, 逻辑型

程序集变量 cs2, 逻辑型

程序集变量 cs3, 逻辑型

子程序 _按钮1_被单击

时钟1时钟周期 = 100

cs1 = 取反 (cs1)

判断开始 (cs1 = 真)

按钮1标题 = “停止”

默认

按钮1标题 = “运行”

判断结束

子程序 _按钮2_被单击

时钟1时钟周期 = 100

cs2 = 取反 (cs2)

判断开始 (cs2 = 真)

按钮2标题 = “停止”

默认

按钮2标题 = “运行”

判断结束

子程序 _按钮3_被单击

时钟1时钟周期 = 100

cs3 = 取反 (cs3)

判断开始 (cs3 = 真)

按钮3标题 = “停止”

默认

按钮3标题 = “运行”

判断结束

子程序 _时钟1_周期事件

判断开始 (cs1 = 真)

子程序1 ()

默认

判断结束

判断开始 (cs2 = 真)

子程序2 ()

默认

判断结束

判断开始 (cs3 = 真)

子程序3 ()

默认

判断结束

子程序 子程序1

标签1标题 = 标签1标题 + “1”

子程序 子程序2

标签2标题 = 标签2标题 + “2”

子程序 子程序3

标签3标题 = 标签3标题 + “3”

这里有一个时钟的类,你看一下吧,不明白你的 100毫秒的时钟 是什么意思。

import javaawtBasicStroke;

import javaawtBorderLayout;

import javaawtCanvas;

import javaawtColor;

import javaawtGraphics;

import javaawtGraphics2D;

import javaawteventActionEvent;

import javaawteventActionListener;

import javaawtgeomLine2D;

import javautilDate;

import javaxswingJButton;

import javaxswingJFrame;

import javaxswingJPanel;

import javaxswingTimer;

public class ClockAs extends Canvas implements ActionListener {

static JButton jb = new JButton("开始");

static JButton jb1 = new JButton("暂停");

Date date;

Timer secondTime;

int hour, munite, second;

Line2D secondLine, muniteLine, hourLine;

int a, b, c;

double pointSX[] = new double[60],// 用来表示秒针端点坐标的数组

pointSY[] = new double[60], pointMX[] = new double[60], // 用来表示分针端点坐标的数组

pointMY[] = new double[60], pointHX[] = new double[60], // 用来表示时针端点坐标的数组

pointHY[] = new double[60];

ClockAs() {

secondTime = new Timer(1000, this);

pointSX[0] = 0; // 12点秒针位置

pointSY[0] = -100;

pointMX[0] = 0; // 12点分针位置

pointMY[0] = -90;

pointHX[0] = 0; // 12点时针位置

pointHY[0] = -70;

double angle = 6 MathPI / 180; // 刻度为6度

for (int i = 0; i < 59; i++) // 计算出各个数组中的坐标

{

pointSX[i + 1] = pointSX[i] Mathcos(angle) - Mathsin(angle)

pointSY[i];

pointSY[i + 1] = pointSY[i] Mathcos(angle) + pointSX[i]

Mathsin(angle);

pointMX[i + 1] = pointMX[i] Mathcos(angle) - Mathsin(angle)

pointMY[i];

pointMY[i + 1] = pointMY[i] Mathcos(angle) + pointMX[i]

Mathsin(angle);

pointHX[i + 1] = pointHX[i] Mathcos(angle) - Mathsin(angle)

pointHY[i];

pointHY[i + 1] = pointHY[i] Mathcos(angle) + pointHX[i]

Mathsin(angle);

}

for (int i = 0; i < 60; i++) {

pointSX[i] = pointSX[i] + 120; // 坐标平移

pointSY[i] = pointSY[i] + 120;

pointMX[i] = pointMX[i] + 120; // 坐标平移

pointMY[i] = pointMY[i] + 120;

pointHX[i] = pointHX[i] + 120; // 坐标平移

pointHY[i] = pointHY[i] + 120;

}

secondLine = new Line2DDouble(0, 0, 0, 0);

muniteLine = new Line2DDouble(0, 0, 0, 0);

hourLine = new Line2DDouble(0, 0, 0, 0);

secondTimestart(); // 秒针开始计时

}

public void paint(Graphics g) {

for (int i = 0; i < 60; i++) // 绘制表盘上的小刻度和大刻度

{

int m = (int) pointSX[i];

int n = (int) pointSY[i];

if (i % 5 == 0) {

gsetColor(Colorred);

gfillOval(m - 4, n - 4, 8, 8);

} else {

gsetColor(Colorcyan);

gfillOval(m - 2, n - 2, 4, 4);

}

}

gfillOval(115, 115, 10, 10); // 钟表中心的实心圆

Graphics2D g_2d = (Graphics2D) g;

g_2dsetColor(Colorred);

g_2ddraw(secondLine);

BasicStroke bs = new BasicStroke(3f, BasicStrokeCAP_ROUND,

BasicStrokeJOIN_MITER);

g_2dsetStroke(bs);

g_2dsetColor(Colorblue);

g_2ddraw(muniteLine);

bs = new BasicStroke(6f, BasicStrokeCAP_BUTT, BasicStrokeJOIN_MITER);

g_2dsetStroke(bs);

g_2dsetColor(Colorgreen);

g_2ddraw(hourLine);

}

public void actionPerformed(ActionEvent e) {

if (egetSource() == secondTime) {

date = new Date();

String s = datetoString();

hour = IntegerparseInt(ssubstring(11, 13));

munite = IntegerparseInt(ssubstring(14, 16));

second = IntegerparseInt(ssubstring(17, 19)); // 获取时间中的秒

int h = hour % 12;

a = second; // 秒针端点的坐标

b = munite; // 分针端点的坐标

c = h 5 + munite / 12; // 时针端点的坐标

secondLinesetLine(120, 120, (int) pointSX[a], (int) pointSY[a]);

muniteLinesetLine(120, 120, (int) pointMX[b], (int) pointMY[b]);

hourLinesetLine(120, 120, (int) pointHX[c], (int) pointHY[c]);

repaint();

}

if (egetSource() == jb) {

secondTimestart();

}

if (egetSource() == jb1) {

secondTimestop();

}

}

public static void main(String args[]) {

JFrame win = new JFrame("时钟");

JPanel jp = new JPanel();

jpadd(jb);

jpadd(jb1);

ClockAs clock = new ClockAs();

jbaddActionListener(clock);

jb1addActionListener(clock);

winadd(clock, BorderLayoutCENTER);

winadd(jp, "South");

winsetVisible(true);

winsetSize(246, 300);

winsetDefaultCloseOperation(3);

winvalidate();

}

}

欢迎分享,转载请注明来源:表白网

原文地址:https://h5.hunlipic.com/biaobai/3362356.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-02-24
下一篇2024-02-24

发表评论

登录后才能评论

评论列表(0条)

    保存