您的当前位置:首页正文

数字秒表(vhdl)

2022-09-30 来源:钮旅网
一、概述

秒表的逻辑结构主要由显示译码器、分频器、十进制计数器、六进制计数器和报警器组成,同时有一个启动信号和一个归零信号,以便秒表能够随意停止及启动。在整个秒表设计过程中要得到一个精确的100HZ计时脉冲,以令秒表从百分之一秒开始计数,

秒表共有6个输出显示,分别为百分之一秒、十分之一秒、秒、分、十分,所以共有6个计数器与之相对应。四个10进制计数器用来分别对百分之一秒、十分之一秒、秒和分进行计数,两个6进制计数器用来分别对十秒和十分进行计数。6个计数器的输出全部为BCD码输出,便于与显示译码器连接。当计时达60分钟后,蜂鸣器报警。 根据秒表的电路特点,用层次设计概念,利用VHDL语言描述,将设计任务分成若干模块,规定每一模块的功能和各模块之间的接口,然后再将各模块合起来联试仿真下载,完成设计。

二、方案设计与论证

用VHDL语言描述,用层次设计概念,将设计任务分成七个子模块,规定每一模块的功能和各模块之间的接口,然后再将各模块合起来形成顶层文件联试。

分频器1:用来产生100HZ计时脉冲,令秒表从百分之一秒开始计数。 分频器2:产生高频率计时脉冲,用于时间扫描模块的扫描脉冲。

四个10进制计数器:用来分别对百分之一秒、十分之一秒、秒和分进行计数。 2两个6进制计数器:用来分别对十秒和十分进行计数。 时间扫描模块:完成对相应数码管显示秒表相应位的控制。 显示译码器:完成对显示的控制。

报警器控制模块:控制蜂鸣报警器的响与停。

三、底层模块设计

底层单元模块共有七个,全部由VHDL语言描述。

3.1.分频器1:将实验箱2.5MHz时钟信号变频为100Hz,产生0.01

秒时钟信号。 (1)编写程序如下:

library ieee;

1

use ieee.std_logic_1164.all; entity div is

port(clr,clk: in bit; q: buffer bit); end div;

architecture a of div is

signal counter:integer range 0 to 12499; begin

process(clr,clk) begin

if (clk='1' and clk'event) then if clr='0' then counter<=0;

elsif counter=12499 then counter<=0; q<= not q; else counter<=counter+1; end if; end if; end process; end a;

(2)仿真波形:

3.2.分频器2:将2.5MHz时钟信号变频为1000Hz接时间扫描模块。 (1)编写程序如下:

library ieee;

use ieee.std_logic_1164.all; entity div0 is

port(clk: in bit; q: buffer bit);

2

end div0;

architecture a of div0 is

signal counter:integer range 0 to 1249; begin

process(clk) begin

if (clk'event and clk='1') then if counter=1249 then counter<=0; q<= not q;

else counter<=counter+1; end if; end if;

end process; end a;

(2)仿真波形:

3.3.十进制计数器

(1)编写程序如下:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt10 is

port(clk:in std_logic;

3

clr:in std_logic; start:in std_logic;

daout:buffer std_logic_vector(3 downto 0); co:out std_logic); end entity cnt10;

architecture art of cnt10 is begin

process(clk,clr,start) begin

if clr='0' then daout<=\"0000\"; elsif (clk'event and clk='1')then if (start='1')then

if daout=\"1001\"then daout<=\"0000\";co<='1'; else daout<=daout+'1';co<='0'; end if; end if; end if;

end process; end art;

(2)仿真波形:

3.4.六进制计数器

(1)编写程序如下:

library ieee;

use ieee.std_logic_1164.all;

4

use ieee.std_logic_unsigned.all; entity cnt6 is

port(clk,clr,start:in std_logic;

daout:buffer std_logic_vector(3 downto 0); co:out std_logic); end entity cnt6;

architecture art of cnt6 is begin

process(clk,clr,start) begin

if clr='0' then daout<=\"0000\"; elsif (clk'event and clk='1')then if (start='1')then

if daout=\"0101\"then daout<=\"0000\";co<='1'; else daout<=daout+'1'; co<='0'; end if; end if; end if;

end process; end art;

(2)仿真波形:

5

3.5.时间扫描模块 (1)编写程序如下:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity seltime is port(

clk:in std_logic;

din1,din2,din3,din4,din5,din6:in std_logic_vector(3 downto 0);

dp:out std_logic;

sel: out std_logic_vector(2 downto 0);

daout:out std_logic_vector(3 downto 0)); end seltime;

architecture fun of seltime is

signal count:std_logic_vector(2 downto 0); begin

sel<=count; process(clk) begin

if(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\" =>daout<= din1 (3 downto 0); dp<='0'; when \"001\" =>daout<= din2 (3 downto 0); dp<='0'; when \"010\" =>daout<= din3 (3 downto 0); dp<='1'; when \"011\" =>daout<= din4 (3 downto 0); dp<='0'; when \"100\" =>daout<= din5 (3 downto 0); dp<='1'; when others =>daout<=din6 (3 downto 0); dp<='0'; end case; end process;

6

end fun;

(2)仿真波形:

3.6.显示译码器

(1)编写程序如下:

library ieee;

use ieee.std_logic_1164.all; entity deled is

port(num:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0)); end deled ;

architecture a of deled is begin

process(num) begin

case num is

when\"0000\"=>led<=\"1111110\"; when\"0001\"=>led<=\"0110000\"; when\"0010\"=>led<=\"1101101\"; when\"0011\"=>led<=\"1111001\"; when\"0100\"=>led<=\"0110011\"; when\"0101\"=>led<=\"1011011\"; when\"0110\"=>led<=\"1011111\";

7

when\"0111\"=>led<=\"1110000\"; when\"1000\"=>led<=\"1111111\"; when\"1001\"=>led<=\"1111011\"; when others=>led<=\"0000000\"; end case; end process; end a;

(2)仿真波形:

3.7.报警器控制模块 (1)编写程序如下:

library ieee;

use ieee.std_logic_1164.all; entity alarm is

port(I,clk: in bit; q: out bit); end alarm;

architecture a of alarm is

signal counter:integer range 0 to 49; signal q1:integer range 0 to 9; signal q0:bit; begin

process(I,clk)

8

begin

if (clk=’1’ and clk’event) then if (i=’1’)then

if counter=49 then counter<=0; q0<= not q0; q1<=q1+1; else counter<=counter+1; end if; q<=q0;

end if; end if; end process; end a;

(2)仿真波形:

9

四、顶层文件及器件清单

1.顶层文件

library ieee;

use ieee.std_logic_1164.all; entity sec_clock is

port(clk,stop,start:in std_logic;

sel:out std_logic_vector(2 downto 0); speaker:out bit;

a,b,c,d,e,f,g,dp:out std_logic); end sec_clock;

architecture behave of sec_clock is component div is

port(clk,clr:in std_logic; q:buffer std_logic); end component; component div0 is port(clk:in std_logic; q:buffer std_logic); end component; component cnt10 is

port(clk,clr,start:in std_logic; co:out std_logic;

daout:buffer std_logic_vector(3 downto 0)); end component; component cnt6 is

port(clk,clr,start:in std_logic; co:out std_logic;

daout:buffer std_logic_vector(3 downto 0)); end component;

component seltime is port(clk:in std_logic;

din1,din2,din3,din4,din5,din6:in std_logic_vector(3 downto 0);

10

dp:out std_logic;

sel:out std_logic_vector(2 downto 0); daout:out std_logic_vector(3 downto 0)); end component; component deled is

port(num:in std_logic_vector(3 downto 0);

led:out std_logic_vector(6 downto 0)); end component; component alarm is port(clk,i:in std_logic; q:out bit); end component;

signal co1,co2,co3,co4,co5,co6:std_logic;

signal do1,do2,do3,do4,do5,do6,do7:std_logic_vector(3 downto 0);

signal q1,q2:std_logic;

signal ledout:std_logic_vector(6 downto 0); begin

f1:div port map(clk=>clk, clr=>stop, Q=>q1); f2:div0 port map(clk=>clk, Q=>q2);

u1:cnt10 port map(clk=>q1, clr=>stop, start=>start, co=>co1, daout=>do1);

u2:cnt10 port map(clk=>co1, clr=>stop, start=>start, co=>co2, daout=>do2);

u3:cnt10 port map(clk=>co2, clr=>stop, start=>start, co=>co3, daout=>do3);

u4:cnt6 port map(clk=>co3,clr=>stop,start=>start,co=>co4, daout=>do4);

u5:cnt10 port map(clk=>co4,clr=>stop,start=>start,co=>co5,

daout=>do5);

u6:cnt6 port map(clk=>co5,clr=>stop,start=>start,co=>co6, daout=>do6);

st:seltime port map(clk=>q2,din1=>do1,din2=>do2, din3=>do3,din4=>do4,

11

din5=>do5,din6=>do6,dp, sel=>sel,daout=>do7); de:deled port map(num=>do7,led=>ledout);

al:alarm port map(clk=>q1,I=>co6,Q=>speaker);

a<=ledout(6);b<=ledout(5);c<=ledout(4);d<=ledout(3); e<=ledout(2);f<=ledout(1);g<=ledout(0); end behave;

2.器件清单

主芯片EPF10K10LC84-3 八段扫描共阴极数码显示管 按键开关 蜂鸣器 数量 1 6 2 1 备注 程序下载 秒表显示 用于控制归零及启动信号 秒表到60分钟报警

五、器件编程与硬件下载

(1)在MAX+plusⅡ软件中为顶层文件选择好芯片类型,选定引脚后进行编译。 (2)将实验箱端口与计算机相应端口连接,检测试验箱是否可以使用,经检测无误后,关闭实验箱,将主芯片标号对应顶层文件相应引脚标号连线到相应器件处。即输入时钟信号端接实验箱时钟发生电路CLK0输出端(用2.5MHz信号),启动信号端和归零信号端分别接两个拨码开关,输出端SEL[2..0]分别接显示模块的SEL2—SEL0端,输出a,b,c,d,e,f,g,dp端接八段显示译码器的相应输入端,输出SPEAKER端接蜂鸣器输入端。连接好连线后打开实验箱电源,将设计好的程序下载到实验箱的FLEX10K \\ EPF10K10LC84-3芯片中即可测试功能。

六、实验设备

计算机

MAX+plusⅡ软件 EDA实验箱

七、心得体会

通过本次课设,我不仅学到了关于EDA的许多专业知识,同时也让我感觉到团队合作的重要性。其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。另外,与他人交流思想是取得成功的关键,在交流中,不

12

仅强化了自己原有的知识体系也可以扩展自己的思维。通过思考、发问、自己解惑并动手、改进的过程,才能真正的完成课题。经过这次课程设计的过程,我相信在以后的课程设计中我们会吸取经验教训,做出更好的设计来。

八、参考文献

[1] 《可编程器件EDA技术与实践》——李国洪 沈明山著 机械工业出版社

[2] 《EDA技术与数字系统设计》——— 尹常永著 西安电子科技大学出版社 [3] 《EDA工程实践技术》—————— 付家才著

化学工业出版社 13

因篇幅问题不能全部显示,请点此查看更多更全内容