秒表的逻辑结构主要由显示译码器、分频器、十进制计数器、六进制计数器和报警器组成,同时有一个启动信号和一个归零信号,以便秒表能够随意停止及启动。在整个秒表设计过程中要得到一个精确的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
因篇幅问题不能全部显示,请点此查看更多更全内容