PLD棋钟设计 下载本文

一.总体功能介绍:

本系统是一个用于棋类比赛的计时钟系统,该计时钟可分别完成甲乙对规定用时的计时和规定时间用完后的读秒计时。规定甲乙双方各有2小时比赛规定用时,分别设计各方的用时定时器,并用数码管显示各方已用的时、分从0:00~1:59计时间隔为1S。 2小时规定时间用完后,每方限定在30秒内必须下出一步棋,此时定时器将完成对读秒时间的30S倒计时,并数码管显示此时过程30~00。若计时到零,则发生警报信号该方超时负。各定时器设置计时暂停/继续键,在规定时间计时时,该键的作用为暂停本方计时,并继续对方计时;在读秒时间计时时,该键的作用为复位本方计时起始点29S,并启动对方定时器。设置系统复位键,比赛结束时,按该键使各方的定时器均复位到规定时间的零点0:00,以便重新开始比赛。

二.系统的主要特色:

首先在如它能完美地解决显示管数量的不足问题,在选择显示模块作用下,甲乙双方的比赛时间能有条不紊地显示!

其次在于设计的原理图(顶层文件)结构非常简单,在连接各模块工作时,没有任何的门和看上去很复杂的连线,整个图显得简单,清晰,给人以简单美的享受!这其中的来由要归功于设计者特意地将各模块全部使用VHDL语言编写!

再次,本系统的输出既有发光二极管带来的视觉上的报警信号,也有扬声器发出的听觉上的报警信号!

总之,本系统在完美完成设计要求的基础上,还特意地优化系统功能,在设计者的不懈努力下,一个简单、完美的棋类比赛计时系统诞生了!

1

三.总体设计思路:

甲30秒 报警 模块 甲2小时 计数器 控 制输入 模选乙2小时 块 择 计数器 模块 乙30秒

总体设计框图

输出 按照设计要求,分别设置甲乙各方规定时2小时计时器和30秒倒记时器,如上图。

在控制模块的作用下,相互协调工作:在规定时内,30秒计时器不工作,输入继续\\暂停端能暂停其中一方计时器的同时继续另一方的计时。当甲或乙归定时两小时用完后,启动各自的30秒倒计时!这时的输入继续\\暂停开关能复位其中一方的30秒到29,并开始另一方的记时。当比赛结束时,输入清零端复位信号,各计时器回到开始,重新开始下场比赛!

计时器的输出同时也控制着报警模块的工作,当甲乙任一方所有时间都用完时,报警模块输出报警信号,宣布比赛结束,谁的时间先用完谁就输了这场比赛。

选择模块的设置,是为了很好解决显示管数量不足的问题。在输入暂停\\继续开关的作用下,轮流显示甲乙双方所用时间情况给显示模块!

显示模块是一个动态扫描显示电路。在一个人眼观察不出的扫描频率下,轮流在相对应的显示管上显示八个输入端口的输入的数据。

2

显示模块 输出 四.模块设计及介绍:

1. 计时器模块:分为2小时的规定时计时器,30秒的倒计时器。

输出特点:<1>各数权位分别输出4位的二进制数,如1:25:46输出为“y31=0001”:“y210=0010 q21 = 0101”:“y11=0100 q11=0110”。

<2>进位输出一个进位信号co为高电平1,直到有清零端复位有效时才回到0。

(1) 30秒倒计时器

功能:本质是一个减法计数器。完成甲和乙对用完归定时间的读秒计时。

工作原理:

仿真波形图

可以看出,该计数器从29开始,如果清零端无效,每来一个秒脉冲,在继续使能端有效下,减少1,到28。依次到00,此时输出一个进位信号co为高电平1,直到有清零端复位有效时才回到0,此时计数器复位到29,重新开始计时。

3

(2) 2小时规定计时器

功能:本质为两个60进制的加法计数器和一个16进制计数器联级构成。完成2个小时的计时。

原理框图:

秒信号

60秒 计数器 Co 60秒 计数器 Co1 60秒 计数器 Count 在复位端cir无效,计数使能端en有效时,每来一个秒的时钟脉冲,秒60计数器加一。计到60时,发出一个进位信号co去作为60分计数器的时钟脉冲,即每来一个co,分60计数器加1。当计数到60时,也发出个进位信号co1,该信号去作为时计数器的时钟脉冲,每来一个co1,即计完了60分钟,时计数器加1。当这个2小时计数器计到两个小时时,发出个进为信号(高电平有效)count,直到有复位信号有效(cir='1')时回到低电平0。计数时,如果计数使能端无效,则计数暂停,恢复有效时继续计数。这样完成了两小时的计时!

2.控制模块

功能:控制各计数器协调工作,完成系统的各项功能。是该系统的核心部分。

<1> Ena 控制甲方2小时规定时计数器的暂停\\继续。

Ena工作真值表

4

其中S为输入暂停\\继续信号,counta为该计数器的进位输出。 按照设计要求,规定时用完后,counta输出为‘1’, 规定时计数器停止计时,即ena=‘0’,S为零时,设置规定时计数器不工作,即ena=‘0’,所以只有当S=‘1’和counta=‘0’时,规定时计数器工作,即ena=‘1’。

<2> Enb 控制乙方2小时规定时计数器的暂停\\继续。

Enb工作真值表

其中S为输入暂停\\继续信号,countb为该计数器的进位输出。按照设计要求,规定时用完后,countb输出为‘1’, 规定时计数器停止计时,即enb=‘0’,S为高电平‘1’时,设置规定时计数器不工作,即enb=‘0’,所以只有当S=‘0’和countb=‘0’时,规定时计数器工作,即enb=‘1’。

<3> En3a 控制甲方30秒计数器的暂停\\继续。

En3a工作真值表

其中S为输入暂停\\继续信号,counta为规定时2小时计数器的

进位输出,count3a为甲方30秒进位输出。

按照设计要求,规定时用完后,counta输出为‘1’, 规定时计数器停止计时,启动甲方30秒倒计时,即en3a=‘1’,否则en3a='0'。S为零时,设置规定时计数器不工作,即en3a=‘0’。当30秒倒计时计时守毕,即count3a输出为‘1’时,30秒计时器也不工作,

5

此时en3a=‘0’。所以只有当S=‘1’和counta=‘1’和count3a=‘0’时,该计时器工作,即en3a=‘1’。

<4> En3b 控制乙方30秒计数器的暂停\\继续。

En3b工作真值表

其中S为输入暂停\\继续信号,countb为规定时2小时计数器

的进位输出,count3b为乙方30秒进位输出。按照设计要求,规定时用完后,countb输出为‘1’, 规定时计数器停止计时,启动乙方30秒倒计时,即en3b=‘1’,否则en3a='0'。S为高电平‘1’时,设置规定时计数器不工作,即en3a=‘0’。当30秒倒计时计时守毕,即count3b输出为‘1’时,30秒计时器也不工作,此时en3b=‘0’。所以只有当S=‘0’和counta=‘1’和count3a=‘0’时,该计时器工作,即en3b=‘1’。

<5> cr3a、 cr3b 控制甲乙双方30秒倒计数器的清零复位。

Cr3a和 cr3b工作真值表(低有效)

其中S为输入暂停\\继续信号,cr为系统输入清零复位信号。 按照设计要求,当cr为‘1’时,系统发出清零信号,系统清零复位,所以此时cr3a、cr3b都为‘1’。当S=‘0’时,规定甲方30秒复位,即cr3a输出为‘1’, 否则规定乙方30秒计数器复位,即cr3b=‘1’。

6

3.选择器模块

功能:实质就是一个选择性开关!在系统设置的暂停\\继续端的作用下,设当s='1'时,选择甲方所用时间情况给输出,当s='0'时,并用A=1010为甲方的名称,选择乙方所用时间情况给输出,并b=1011代表乙方的名称。

原理框图: S='1' 甲方比赛用时情况 给显示模块

比赛用时情况 乙方比赛用时情况 S='0'

输入端口a、b、c、d、e代表着甲方用时情况,分别为30秒个位、30秒十位、2小时分个位、2小时分十位、2小时时个位。输入端口f、g、h、i、k代表着乙方用时情况,分别为30秒个位、30秒十位、2小时分个位、2小时分十位、2小时时个位。输出端口M30s1,M30,Fg,F10n,S,DK分别为30秒个位、30秒十位、小时分个位、分十位、时位、端口。

7

4.显示模块:

功能:六个输入端口分别接选择模块的输入,在一个较高的时钟脉冲钟用下,从第一个输入端口的情况依次扫描到第六个,并在显示管上显示。所以也称位动态扫描显示。

5.报警模块:

功能:输出听觉和视觉上的比赛结束信号,并且判断何方失败。

报警工作真值表

count3a、count3b分别代表甲乙方30秒倒计时的进位输出,a、b分别代表双方视觉上的信号输出(驱动发光二极管发光),warn位听觉上的报警信号,驱动喇叭发出声音!

只有当甲或者乙的时间全部用完,则比赛结束。即count3a='1' or count3b='1'成立时,warn信号位扫描频率,如果是甲先用完,a位零,甲灯亮宣告甲输掉这场比赛,反之,乙灯亮,乙输掉这场比赛!

8

五.总结与设计调试体会:

为期两周时间的EDA课程设计使我收获不少,无论在对软件的熟悉程度,还是在对数字电路的基本原理,都迫使我不断的前进!两个星期的艰苦奋斗,我和组友终于完美地完成了设计要求!这其中的感受,无法用语言来描叙,只有经历过的人,才真正体会设计的乐趣:不是在于设计结果,而是在于设计的过程!

过程是最美的,最有趣的。而设计的过程,实际上也是一个发现问题,然后去想办法解决的过程。

两个星期的设计,我和组友发现的问题层出不穷,通过我们的不懈努力,但最终,我们还是解决了!这其中,有些问题是解决不了,或者超出我们的能力之外的,我们通过议论,转化问题,使复杂的问题简单化,达到了非同寻常的效果!比如说显示管数量不足的问题,我们的设计要求要十个显示管,而实验箱上只有八个。这就使得我们寻找一钟方法去解决这一难题!最终,灵机一动,想到了选择显示的思想,从而诞生了选择显示模块!

在设计过程中,发现一个重要定律:EDA课程设计,只要你想得到,就能办得到!的确,程序是自己编的,就想说话一样,掌握了基本的语法、语句,想表达什么意思就表达什么意思!加上有编译器来检查错误,想错都难!打个比方,在制作协调计时器工作的时的控制器时,一般人会用与门和非门等等连接,于是原理图就显得乱和杂!而我采用的时集成的思想:把所有与端口使能的逻辑关系都集中在一个控制器模块里,用语言来描述清楚。一个控制器,控制着整个计数器的工作,使得电路图简单,清楚! 设计的过程中还发现:杂实的数电基本功,是设计游刃有余的动力!举个例子来说吧,在设计控制器时,各端口受哪些端口控制,各输出什么时候输出什么样的值,这些看似很复杂的问题,在我列出真值表后,一切都是那么的明朗!因此,我在大二的数电功低使我受益匪浅!

设计时,另一个教训值得我深深记在脑子里:理想与现实是有很大的差距的,时刻记得实事求是!比方说,如果不知道显示管只有八个的情况下,采用十个数码管显示的方法,其后果就是导致仿真不成功!在仿真过程中,就是由于实践时带来的问题层出不穷,但最终还是被一一解决了。

9

总之,两个星期的课程设计,有过酸、甜、苦、辣。这其中的滋味,相信每一个过来人都深有体会!感谢学校、谢谢老师给我这次机会!

六.附录

<一>相关程序参考 30秒倒计时: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY cnt30 IS PORT ( clk : IN STD_LOGIC; cir ,en : IN STD_LOGIC; co : OUT STD_LOGIC; q1 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); y10: OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END cnt30;

ARCHITECTURE a OF cnt30 IS

SIGNAL bcd1n : STD_LOGIC_VECTOR (3 DOWNTO 0);

SIGNAL vcd10n : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN

PROCESS (clk,cir,en) BEGIN

if(cir='1')then co<='0';

elsif(clk'EVENT AND clk = '1') then if( bcd1n=0 and vcd10n=0 )then co<='1'; END IF; END IF;

END PROCESS; PROCESS (clk,cir) BEGIN IF (cir='1') THEN bcd1n <= \

10

ELSIF (clk'EVENT AND clk = '1') THEN IF (en='1' ) THEN

IF (bcd1n=0 ) THEN

bcd1n <= \

ELSIF (bcd1n=0 and vcd10n=0) THEN bcd1n <= \ ELSE bcd1n <= bcd1n-1; END IF; END IF;

END IF; END PROCESS; q1 <= bcd1n; y10 <= vcd10n; PROCESS (clk, cir) BEGIN IF (cir ='1') THEN vcd10n <= \ ELSIF (clk'EVENT AND clk = '1') THEN IF (en='1' ) THEN

IF (bcd1n=0 AND vcd10n=0) THEN vcd10n <= \ ELSIF ( bcd1n=0) THEN

vcd10n <= vcd10n-1; ELSE

vcd10n <= vcd10n ; END IF; END IF; END IF; END PROCESS; end a;

11

2小时计时器 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY cntgds IS PORT ( clk : IN STD_LOGIC; cir : IN STD_LOGIC; en : IN STD_LOGIC;

count : OUT STD_LOGIC; q21 ,q31: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); y210 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END cntgds;

ARCHITECTURE a OF cntgds IS

SIGNAL bcd11n : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL vcd110n : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL bcd21n : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL vcd210n : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL bcd31n : STD_LOGIC_VECTOR (3 DOWNTO 0);

SIGNAL vcd310n : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL co, co1 : STD_LOGIC; BEGIN

PROCESS (co,cir) BEGIN IF (cir = '1') THEN bcd21n <= \ ELSIF (co'EVENT AND co = '1') THEN IF (bcd21n=9) THEN bcd21n<=\ ELSE

IF (en='1') THEN bcd21n <= bcd21n + 1; ELSE bcd21n <= bcd21n; END IF; END IF; END IF; END PROCESS;

12

PROCESS (co, cir) BEGIN IF cir = '1' THEN vcd210n <= \ ELSIF (co'EVENT AND co = '1') THEN IF (bcd21n=9) THEN

IF (vcd210n=5) THEN vcd210n<=\ ELSE

IF (en='1') THEN vcd210n <= vcd210n + 1; ELSE vcd210n <= vcd210n; END IF; END IF; END IF; END IF; END PROCESS; PROCESS (co) BEGIN

if(co'EVENT AND co = '1') then

if(bcd21n=9 and vcd210n=5 )then co1<='1'; else co1<='0'; END IF; END IF;

END PROCESS; q21 <= bcd21n; y210<=vcd210n; q31 <= bcd31n; PROCESS (clk,cir) BEGIN IF (cir = '1') THEN bcd11n <= \ ELSIF (clk'EVENT AND clk = '1') THEN IF (bcd11n=9) THEN bcd11n<=\ ELSE

13

IF (en='1') THEN bcd11n <= bcd11n + 1; ELSE bcd11n <= bcd11n; END IF; END IF; END IF; END PROCESS;

PROCESS (clk, cir) BEGIN IF cir = '1' THEN vcd110n <= \ ELSIF (clk'EVENT AND clk = '1') THEN IF (bcd11n=9) THEN

IF (vcd110n=5) THEN vcd110n<=\ ELSE

IF (en='1') THEN vcd110n <= vcd110n + 1; ELSE vcd110n <= vcd110n; END IF; END IF; END IF; END IF; END PROCESS; PROCESS (clk) BEGIN

if(clk'EVENT AND clk = '1') then

if(bcd11n=9 and vcd110n=5 )then co<='1'; else co<='0'; END IF; END IF;

END PROCESS; PROCESS (co1,cir) BEGIN

14

IF (cir = '1') THEN bcd31n <= \ ELSIF (co1'EVENT AND co1 = '1') THEN IF (bcd31n=1) THEN bcd31n<=\ ELSE

IF (en='1') THEN bcd31n <= bcd31n + 1; ELSE bcd31n <= bcd31n; END IF; END IF; END IF; END PROCESS; PROCESS (clk) BEGIN

if(clk'EVENT AND clk = '1') THEN

if(bcd21n=9 and vcd210n=5 and bcd31n=1 and bcd11n=9 and vcd110n=5)then

count<='1'; elsif(cir='1') then count<='0'; END IF; end if;

END PROCESS; end a;

15

控制器 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY kongzhiqi IS PORT

( counta,count3a,countb,count3b : IN STD_LOGIC; cr ,s : IN STD_LOGIC;

ena,en3a,enb,en3b,cr3a,cr3b :OUT END kongzhiqi;

ARCHITECTURE a OF kongzhiqi IS BEGIN

PROCESS (s,counta) BEGIN

if(s='0') then ena<='0';

elsif( counta='0' )then ena<='1'; else ena<='0'; END IF; END PROCESS;

PROCESS (s,counta,count3a) BEGIN

if(count3a='1') then en3a<='0';

elsif( counta='1' and s='1' )then en3a<='1'; else en3a<='0'; END IF; END PROCESS;

PROCESS (s,countb) BEGIN

if(s='1') then enb<='0';

elsif( countb='0' )then enb<='1'; else enb<='0'; END IF; END PROCESS;

16

STD_LOGIC ); PROCESS (s,countb,count3b) BEGIN

if(count3b='1') then en3b<='0';

elsif( countb='1' and s='0' )then en3b<='1';

else en3b<='0';END IF; END PROCESS; PROCESS (s,cr) BEGIN

if(cr='1') then cr3a<='1'; elsif( s='0' )then cr3a<='1';

else cr3a<='0'; END IF; END PROCESS; PROCESS (s,cr) BEGIN

if(cr='1') then cr3b<='1'; elsif(s='1' )then cr3b<='1'; else cr3b<='0'; END IF; END PROCESS;

end a;

17

显示器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SCAN_LED IS PORT ( CLK : IN STD_LOGIC;

d0,d1,d3,d4,d5,d7:in STD_LOGIC_VECTOR(3 DOWNTO 0); SG : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --段控制信号输出

BT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );--位控制信号输出 END;

ARCHITECTURE one OF SCAN_LED IS

SIGNAL CNT8 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL A : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

P1:PROCESS( CNT8 ) BEGIN

CASE CNT8 IS

WHEN \ BT <= \ WHEN \ BT <= \ WHEN \ BT <= \ WHEN \ BT <= \ WHEN \ BT <= \ WHEN \ BT <= \ WHEN OTHERS => NULL ; END CASE ; END PROCESS P1; P2:PROCESS(CLK) BEGIN

IF CLK'EVENT AND CLK = '1' THEN

CNT8 <= CNT8 + 1; END IF;

END PROCESS P2 ; P3:PROCESS( A ) BEGIN

CASE A IS

18

WHEN \ WHEN \SG <= \

WHEN \ WHEN \SG <= \

WHEN \ WHEN \SG <= \

WHEN \ WHEN \ => SG <= \

WHEN \ WHEN \<= \

WHEN \ WHEN \<= \

WHEN \ WHEN \SG <= \

WHEN \ WHEN \SG <= \

WHEN OTHERS => NULL ; END CASE ;

END PROCESS P3;

END; 报警器 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY warn IS PORT

( count3a,count3b : IN STD_LOGIC; cp : IN STD_LOGIC;

warn,a,b: OUT STD_LOGIC ); END warn;

ARCHITECTURE a OF warn IS BEGIN

PROCESS (count3a,count3b) BEGIN

if(count3a='1'or count3b='1') then warn<=CP; else warn<='0';

19

END IF; END PROCESS;

PROCESS (count3a,cp) BEGIN

if(count3a='1') then a<='0'; else a<='1'; END IF; END PROCESS;

PROCESS (count3b,cp) BEGIN

if(count3b='1') then b<='0'; else b<='1'; END IF; END PROCESS; end a;

选择器 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY xuanzeqi IS PORT ( start : IN STD_LOGIC;

a,b,c,d,e: in STD_LOGIC_VECTOR (3 DOWNTO 0);

f,g,h,i,j: in STD_LOGIC_VECTOR (3 DOWNTO 0);

M30s1,M30,Fg,F10n,S,DK : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END xuanzeqi;

ARCHITECTURE a OF xuanzeqi IS BEGIN

PROCESS (start,a,b,c,d,e,f,g,h,i,j) BEGIN

if(start='1') then

M30s1<=a;M30<=b;Fg<=c;F10n<=d;S<=e;DK<=\else M30s1<=f;M30<=g;Fg<=h;F10n<=i;S<=j;DK<=\ end if;

END PROCESS; end a;

20

<二>.相关仿真波形 2小时:

控制器:

21

选择器:

报警器:

22

总图仿真:

(1)

23

(2)

(3)

24

25