如何用VHDL设计一分钟的计时器(带毫秒显示)

如何用VHDL设计一分钟的计时器(带毫秒显示),第1张

LIBRARY IEEE

USEIEEE.STD_LOGIC_1164.ALL

USEIEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY CLOCK IS

PORT( CLK: IN STD_LOGIC

DOUT1:BUFFER STD_LOGIC_VECTOR( 3 DOWNTO 0) -----秒钟个位输出

DOUT2:BUFFER STD_LOGIC_VECTOR( 3 DOWNTO 0) -----秒钟时位输出

DOUT3:BUFFER STD_LOGIC_VECTOR( 3 DOWNTO 0) -----分钟个位输出

DOUT4:BUFFER STD_LOGIC_VECTOR( 3 DOWNTO 0) -----分钟时位输出

DOUT5:BUFFER STD_LOGIC_VECTOR( 3 DOWNTO 0) -----时钟个位输出

DOUT6: BUFFER STD_LOGIC_VECTOR( 3 DOWNTO 0) -----时钟十位输出

CO: OUT STD_LOGIC)

-- LED1: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)

-- LED2: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)

-- LED3: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)

-- LED4: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)

-- LED5: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)

-- LED6: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0))

END CLOCK

ARCHITECTURECK OF CLOCK IS

SIGNAL CO1: STD_LOGIC

SIGNAL CO2: STD_LOGIC

SIGNAL QOUT1: STD_LOGIC_VECTOR( 3 DOWNTO 0)

SIGNAL QOUT2: STD_LOGIC_VECTOR( 3 DOWNTO 0)

SIGNAL QOUT3: STD_LOGIC_VECTOR( 3 DOWNTO 0)

SIGNAL QOUT4: STD_LOGIC_VECTOR( 3 DOWNTO 0)

SIGNAL QOUT5: STD_LOGIC_VECTOR( 3 DOWNTO 0)

SIGNAL QOUT6: STD_LOGIC_VECTOR( 3 DOWNTO 0)

-- COMPONENT LED IS

--PORT( QIN: STD_LOGIC_VECTOR(3 DOWNTO 0)

--QOUT: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0))

--END COMPONENT

BEGIN

U1: PROCESS( CLK ) ---秒钟进程表

BEGIN

IF CLK'EVENT AND CLK='1' THEN

IF QOUT1 = 9 THEN

IF QOUT2=5 THEN

CO1 <= '1'

QOUT1 <="0000"

QOUT2 <="0000"

ELSE

QOUT1 <= "0000"

CO1 <='0'

QOUT2 <= QOUT2+1

END IF

ELSE

QOUT1 <= QOUT1+1

CO1 <= '0'

END IF

END IF

END PROCESS

DOUT1 <= QOUT1

DOUT2 <= QOUT2

U2: PROCESS(CO1) --分钟进程表

BEGIN

IF CO1'EVENT AND CO1='1' THEN

IF QOUT3 = 9 THEN

IF QOUT4=5 THEN

CO2 <= '1'

QOUT3 <="0000"

QOUT4 <="0000"

ELSE

QOUT3 <= "0000"

CO2 <='0'

QOUT4 <= QOUT4+1

END IF

ELSE

QOUT3 <= QOUT3+1

CO2 <= '0'

END IF

END IF

END PROCESS

DOUT3 <= QOUT3

DOUT4 <= QOUT4

U3: PROCESS(CO2) --分钟进程表

BEGIN

IF CO2'EVENT AND CO2='1' THEN

IF QOUT5 = 3 THEN

IF QOUT6=2 THEN

CO <= '1'

QOUT5 <="0000"

QOUT6 <="0000"

ELSE

QOUT5 <= "0000"

CO <='0'

QOUT6 <= QOUT6+1

END IF

ELSE

QOUT5 <= QOUT5+1

CO <= '0'

END IF

END IF

END PROCESS

DOUT5 <= QOUT5

DOUT6 <= QOUT6

--L1: LEDPORT MAP( DOUT1,LED1)

--L2: LEDPORT MAP( DOUT2,LED2)

--L3: LEDPORT MAP( DOUT3,LED3)

--L4: LEDPORT MAP( DOUT4,LED4)

--L5: LEDPORT MAP( DOUT5,LED5)

--L6: LEDPORT MAP( DOUT6,LED6)

END ARCHITECTURE CK

下面是共阴数码管的程序

LIBRARY IEEE

USEIEEE.STD_LOGIC_1164.ALL

USEIEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY LED IS ------共阴管

PORT( QIN: STD_LOGIC_VECTOR(3 DOWNTO 0)

QOUT: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0))

END LED

ARCHITECTURE DISPLAY OF LED IS

BEGIN

WITH QIN SELECT

QOUT <= "11111110" WHEN "0000",

"01100000" WHEN "0001",

"11011010" WHEN "0010",

"11110010" WHEN "0011",

"01100110" WHEN "0100",

"10110110" WHEN "0101",

"00111110" WHEN "0110",

"11100000" WHEN "0111",

"11111110" WHEN "1000",

"11100110" WHEN "1001",

"00000000" WHEN OTHERS

END ARCHITECTURE DISPLAY

这个是一个时钟程序;再加一个数码管显示就可以到数码管上显示出来了

这个电子钟是用六十进制和二十四进制写的

顶层文件:

LIBRARY IEEE

USEIEEE.STD_LOGIC_1164.ALL

USEIEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY CLOCK IS

PORT( CLK: IN STD_LOGIC

CLR: IN STD_LOGIC

RES: IN STD_LOGIC

RES1 : IN STD_LOGIC_VECTOR( 5 DOWNTO 0)--秒钟重调

RES2 : IN STD_LOGIC_VECTOR( 5 DOWNTO 0)--分钟重调

RES3 : IN STD_LOGIC_VECTOR( 4 DOWNTO 0)--时钟重调

QO1 : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0)-- 秒钟输出

QO2 : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0)--分钟输出

QO3 : OUT STD_LOGIC_VECTOR( 4 DOWNTO 0)--时钟输出

CO3 : OUT STD_LOGIC)

END ENTITY CLOCK

ARCHITECTURE TIME OF CLOCK IS

SIGNAL CO1: STD_LOGIC

SIGNAL CO2: STD_LOGIC

COMPONENT COUNT60 IS

PORT ( CLK : IN STD_LOGIC

CLR : IN STD_LOGIC

RES : IN STD_LOGIC

QIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0)

QOUT : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0)

CO : OUT STD_LOGIC )

END COMPONENT

COMPONENT COUNT24 IS

PORT ( CLK : IN STD_LOGIC

CLR : IN STD_LOGIC

RES : IN STD_LOGIC

QI : IN STD_LOGIC_VECTOR( 4 DOWNTO 0)

QO : OUT STD_LOGIC_VECTOR( 4 DOWNTO 0)

CO : OUT STD_LOGIC )

END COMPONENT

BEGIN

U1: COUNT60

PORT MAP( CLK,CLR,RES,RES1,QO1,CO1)

U2: COUNT60

PORT MAP( CO1,CLR,RES,RES2,QO2,CO2)

U3: COUNT24

PORT MAP( CO2,CLR,RES,RES3,QO3,CO3)

END ARCHITECTURE TIME

下面是二十四进制计数

LIBRARY IEEE

USEIEEE.STD_LOGIC_1164.ALL

USEIEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY COUNT24IS

PORT ( CLK : IN STD_LOGIC

CLR : IN STD_LOGIC

RES : IN STD_LOGIC

QI : IN STD_LOGIC_VECTOR( 4 DOWNTO 0)

QO : OUT STD_LOGIC_VECTOR( 4 DOWNTO 0)

CO : OUT STD_LOGIC )

END ENTITY COUNT24

ARCHITECTURE BHV OF COUNT24 IS

SIGNAL Q : STD_LOGIC_VECTOR( 4 DOWNTO 0)

BEGIN

PROCESS( CLK, CLR, RES)

BEGIN

IF CLR = '1' THEN

Q <="00000"

ELSIF CLK'EVENT AND CLK='1' THEN

IF RES ='1' THEN

Q <=QI

ELSIF Q = 23 THEN

Q <="00000"

CO <='1'

ELSE Q <= Q+1

CO<='0'

END IF

END IF

END PROCESS

QO <= Q

END ARCHITECTURE BHV

下面是六十进制计数

LIBRARY IEEE

USEIEEE.STD_LOGIC_1164.ALL

USEIEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY COUNT60 IS

PORT ( CLK : IN STD_LOGIC

CLR : IN STD_LOGIC

RES : IN STD_LOGIC

QIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0)

QOUT : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0)

CO : OUT STD_LOGIC )

END ENTITY COUNT60

ARCHITECTURE COUNT OF COUNT60 IS

SIGNAL Q : STD_LOGIC_VECTOR( 5 DOWNTO 0)

BEGIN

PROCESS (CLK,CLR,RES)

BEGIN

IF CLR = '1'THEN

Q <= "000000"

ELSIF CLK'EVENT AND CLK = '1' THEN

IF RES ='1' THEN

Q <= QIN

ELSIF Q = 59 THEN

Q <= "000000"

CO <='1'

ELSE

Q <=Q + 1

CO <= '0'

END IF

END IF

END PROCESS

QOUT <= Q

END ARCHITECTURE

这个是用两个60进制和一个24进制做的

图11

程序如下:

library IEEE

use IEEE.STD_LOGIC_1164.ALL

use IEEE.STD_LOGIC_ARITH.ALL

use IEEE.STD_LOGIC_UNSIGNED.ALL

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<=aelse y<=b

end if

end process

end one

仿真波形如下图12:

图12

(2)三位二选一:

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

图13

程序如下:

library IEEE

use IEEE.STD_LOGIC_1164.ALL

use IEEE.STD_LOGIC_ARITH.ALL

use IEEE.STD_LOGIC_UNSIGNED.ALL

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<=aelse 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 IEEE.STD_LOGIC_1164.ALL

use IEEE.STD_LOGIC_ARITH.ALL

use IEEE.STD_LOGIC_UNSIGNED.ALL

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 就这些

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_arith.all

use ieee.std_logic_unsigned.all

--------------------------------------------------------------------

entity digital is

port( Clk : in std_logic --时钟输入

Rst : in std_logic --复位输入

S1,S2 : in std_logic --时间调节输入

led : out std_logic_vector(3 downto 0) --整点输报时输出

spk : out std_logic

Display : out std_logic_vector(6 downto 0) --七段码管显示输出

SEG_SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动

)

end digital

--------------------------------------------------------------------

architecture behave of digital is

signal Disp_Temp : integer range 0 to 15

signal Disp_Decode : std_logic_vector(6 downto 0)

signal SEC1,SEC10: integer range 0 to 9

signal MIN1,MIN10: integer range 0 to 9

signal HOUR1,HOUR10 : integer range 0 to 9

signal Clk1kHz: std_logic--数码管扫描时钟

signal Clk1Hz: std_logic--时钟计时时钟

signal led_count : std_logic_vector(2 downto 0)

signal led_display : std_logic_vector(3 downto 0)

signal spkcout: std_logic

begin

PROCESS(clk) --产生1hz信号

variable cnt : INTEGER RANGE 0 TO 49999999--产生1Hz时钟的分频计数器

BEGIN

IF clk='1' AND clk'event THEN

IF cnt=49999999 THEN cnt:=0

ELSE

IF cnt<25000000 THEN clk1hz<='1'

ELSE clk1hz<='0'

END IF

cnt:=cnt+1

END IF

END IF

end process

PROCESS(clk) --产生1hz信号

variable cnt1 : INTEGER RANGE 0 TO 49999--产生1KHz时钟的分频计数器

BEGIN

IF clk='1' AND clk'event THEN

IF cnt1=49999 THEN cnt1:=0

ELSE

IF cnt1<25000 THEN clk1khz<='1'

ELSE clk1khz<='0'

END IF

cnt1:=cnt1+1

END IF

END IF

end process

process(Clk1Hz,Rst)

begin

if(Rst='0') then--系统复位

SEC1<=0

SEC10<=0

MIN1<=0

MIN10<=0

HOUR1<=0

HOUR10<=0

elsif(Clk1Hz'event and Clk1Hz='1') then--正常运行

if(S1='0') then --调节小时

if(HOUR1=9) then

HOUR1<=0

HOUR10<=HOUR10+1

elsif(HOUR10=2 and HOUR1=3) then

HOUR1<=0

HOUR10<=0

else

HOUR1<=HOUR1+1

end if

elsif(S2='0') then --调节分钟

if(MIN1=9) then

MIN1<=0

if(MIN10=5) then

MIN10<=0

else

MIN10<=MIN10+1

end if

else

MIN1<=MIN1+1

end if

elsif(SEC1=9) then

SEC1<=0

if(SEC10=5) then

SEC10<=0

if(MIN1=9) then

MIN1<=0

if(MIN10=5) then

MIN10<=0

if(HOUR1=9) then

HOUR1<=0

HOUR10<=HOUR10+1

elsif(HOUR10=2 and HOUR1=3) then

HOUR1<=0

HOUR10<=0

else

HOUR1<=HOUR1+1

end if

else

MIN10<=MIN10+1

end if

else

MIN1<=MIN1+1

end if

else

SEC10<=SEC10+1

end if

else

SEC1<=SEC1+1

end if

end if

end process

process(Clk)--整点报时

begin

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

if(MIN10=5 and MIN1=9 and SEC10=5 and sec1>3) then--在59分55秒开始提示

led_Count<=led_Count+1spkcout<=not spkcout

else

led_count<="000"

spkcout<='0'

end if

spk<=spkcout

end if

end process

process(led_count)--整点报时LED灯的闪烁

begin

case (led_count) is

when "000"=>led_display<="0000"

when "001"=>led_display<="1111"

when "010"=>led_display<="0111"

when "011"=>led_display<="0011"

when "100"=>led_display<="0001"

when "101"=>led_display<="1111"

when others=>led_display<="0000"

end case

led<=led_display

end process

process(SEG_SEL)

begin

case (SEG_SEL+1) is

when "111"=>Disp_Temp<=HOUR10

when "110"=>Disp_Temp<=HOUR1

when "101"=>Disp_Temp<=10

when "100"=>Disp_Temp<=MIN10

when "011"=>Disp_Temp<=MIN1

when "010"=>Disp_Temp<=10

when "001"=>Disp_Temp<=SEC10

when "000"=>Disp_Temp<=SEC1

end case

end process

process(Clk1khz)

begin

if(Clk1khz'event and Clk1khz='1') then--扫描累加

SEG_SEL<=SEG_SEL+1

Display<=Disp_Decode

end if

end process

process(Disp_Temp) --显示转换

begin

case Disp_Temp is

when 0=>Disp_Decode<="0111111" --0

when 1=>Disp_Decode<="0000110" --1

when 2=>Disp_Decode<="1011011" --2

when 3=>Disp_Decode<="1001111" --3

when 4=>Disp_Decode<="1100110" --4

when 5=>Disp_Decode<="1101101" --5

when 6=>Disp_Decode<="1111101" --6

when 7=>Disp_Decode<="0000111" --7

when 8=>Disp_Decode<="1111111" --8

when 9=>Disp_Decode<="1101111" --9

when 10=>Disp_Decode<="1000000" ---

when others=>Disp_Decode<="0000000" --全灭

end case

end process

end behave


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/12126042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存