数字系统课程设计报告-

数字系统课程设计

(数字电子钟)

班级:电信 081

姓名:徐镇江

学号:0840*******

一、系统设计要求:

本设计要求掌握数码管的显示原理、数字钟的VHDL编程方法。具体要求:(1)采用EDA实验箱上的共阴极数码管显示时间,从00:00:00~23:59:59,依此循环。

(2)整点报时。

二、系统设计思路:

根据系统的设计要求可知,本系统设计本设计可分为三个主要部分电路。

(1)计时:

主要是通过标准秒脉冲的输入,采集秒脉冲的上升沿,从而触发秒计时信号,从而达到秒计时的目的。当到达“59”时,产生分进位脉冲信号,激发计分电路,同理,从而实现计分。整体就实现了计时的功能。

(2)显示:

通过对计秒、计分、计时电路的BCD码输出,进行译码操作,输出给8段数码显示,并进行动态扫描,即可实现多位数码管的显示。

(3)整点报时

整点报时电路在该设计当中只是给出了一个整点的信号,该信号是低电平有效,持续时间是1分钟。通过外部的设计电路,该信号对“蜂鸣器”电路起一个控制的作用。

1.计时电路的设计

主要VHDL程序段如下:

process(clk_time)

begin

if (clk_time'event and clk_time = '1') then

if(sec_1 = "1001") then

sec_1<="0000";

if(sec_2 = "0101") then

sec_2 <= "0000";

co1 <= '1';

else

sec_2 <= sec_2 +'1';

co1<='0';

end if;

else sec_1<= sec_1 + '1';

end if;

end if;

sec <= sec_2 & sec_1;

end process;

上面的代码是计秒部分,它为计分电路提供一个分脉冲进位信号,“co1”当co1 = '1'时,触发计分电路

process(co1)

begin

if co1'event and co1 = '1' then

if(min_1 = "1001") then

min_1<="0000";

if(min_2 = "0101") then

min_2 <= "0000";

co2 <= '1';

else

min_2 <= min_2 +'1';

co2<='0';

end if;

else

min_1 <= min_1 +1;

end if;

end if;

min <= min_2 & min_1;

alter<='1';

end process;

同理,底下的代码是计时部分。

process(co2)

begin

if co2'event and co2 = '1' then

if (hour_1 = "0011" and hour_2 = "0010") then

hour_1 <="0000";

hour_2 <="0000";

elsif hour_1 = "1001" then

hour_2 <= hour_2 + '1';

hour_1 <= "0000";

else

hour_1 <= hour_1 + '1';

end if;

end if;

hour <= hour_2 & hour_1;

alter<='0';

end process;

2.显示控制电路的设计

本设计显示需要使用的是6个7段数码管,在计时结果显示电路中,6个7段数码管显示部分采用的是动态显示,由时钟信号clk_scan作为扫描信号,每来一次上升沿转换一个数码管显示,并显示对应的信息.

显示控制模块的主要VHDL程序段如下:

process(clk_scan)

begin

if clk_scan'event and clk_scan = '1' then

if cnt = "101" then

cnt <= "000";

else

cnt <= cnt +'1';

end if;

end if;

end process;

process(cnt)

begin

case cnt is

when "000" => bcd <=sec(3 downto 0);com <="111110";

when "001" => bcd <=sec(7 downto 4);com <="111101";

when "010" => bcd <=min(3 downto 0);com <="111011";

when "011" => bcd <=min(7 downto 4);com <="110111";

when "100" => bcd <=hour(3 downto 0);com <="101111";

when "101" => bcd <=hour(7 downto 4);com <="011111";

when others => bcd <= "0000";com <= "111111";

end case;

case bcd is

when "0000" => seg7 <= "00111111";

when "0001" => seg7 <= "00000110";

when "0010" => seg7 <= "00011011";

when "0011" => seg7 <= "01001111";

when "0100" => seg7 <= "01100110";

when "0101" => seg7 <= "01101101";

when "0110" => seg7 <= "01111101";

when "0111" => seg7 <= "00000111";

when "1000" => seg7 <= "01111111";

when "1001" => seg7 <= "01101111";

when others => seg7 <= "00000000";

end case;

end process;

系统的VHDL源程序

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

entity digclk is

port(

clk_scan: in std_logic;

clk_time: in std_logic;

com: out std_logic_vector(5 downto 0);

seg: out std_logic_vector(7 downto 0)

);

end entity digclk;

architecture art of digclk is

signal co1,co2:std_logic;

signal hour_1,hour_2:std_logic_vector(3 downto 0);

signal min_1,min_2:std_logic_vector(3 downto 0);

signal sec_1,sec_2:std_logic_vector(3 downto 0);

signal sec,min,hour,seg7:std_logic_vector(7 downto 0);

signal cnt:std_logic_vector(2 downto 0);

signal bcd:std_logic_vector(3 downto 0);

begin

process(clk_time)

begin

if (clk_time'event and clk_time = '1') then

if(sec_1 = "1001") then

sec_1<="0000";

if(sec_2 = "0101") then

sec_2 <= "0000";

co1 <= '1';

else

sec_2 <= sec_2 +'1';

co1<='0';

end if;

else sec_1<= sec_1 + '1';

end if;

end if;

sec <= sec_2 & sec_1;

end process;

process(co1)

begin

if co1'event and co1 = '1' then

if(min_1 = "1001") then

min_1<="0000";

if(min_2 = "0101") then

min_2 <= "0000";

co2 <= '1';

else

min_2 <= min_2 +'1';

co2<='0';

end if;

else

min_1 <= min_1 +1;

end if;

end if;

min <= min_2 & min_1;

end process;

process(co2)

begin

if co2'event and co2 = '1' then

if (hour_1 = "0011" and hour_2 = "0010") then hour_1 <="0000";

hour_2 <="0000";

elsif hour_1 = "1001" then

hour_2 <= hour_2 + '1';

hour_1 <= "0000";

else

hour_1 <= hour_1 + '1';

end if;

end if;

hour <= hour_2 & hour_1;

end process;

process(clk_scan)

begin

if clk_scan'event and clk_scan = '1' then

if cnt = "101" then

cnt <= "000";

else

cnt <= cnt +'1';

end if;

end if;

end process;

process(cnt)

begin

case cnt is

when "000" => bcd <=sec(3 downto 0);com <="111110";

when "001" => bcd <=sec(7 downto 4);com <="111101";

when "010" => bcd <=min(3 downto 0);com <="111011";

when "011" => bcd <=min(7 downto 4);com <="110111";

when "100" => bcd <=hour(3 downto 0);com <="101111";

when "101" => bcd <=hour(7 downto 4);com <="011111";

when others => bcd <= "0000";com <= "111111";

end case;

case bcd is

when "0000" => seg7 <= "00111111";

when "0001" => seg7 <= "00000110";

when "0010" => seg7 <= "00011011";

when "0011" => seg7 <= "01001111";

when "0100" => seg7 <= "01100110";

when "0101" => seg7 <= "01101101";

when "0110" => seg7 <= "01111101";

when "0111" => seg7 <= "00000111";

when "1000" => seg7 <= "01111111";

when "1001" => seg7 <= "01101111";

when others => seg7 <= "00000000";

end case;

end process;

seg<=seg7;

end architecture art;

6.系统的有关仿真

(1)计秒显示部分。

计分仿真图

计时仿真图

相关文档
最新文档