定时器VHDL设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定时器

1.实验任务

设计要求:整体清零;可以定时最高到99min;以秒速度递增至预定时间,以分速度递减至零。

总体框图如下图所示:

clr 用来整体复位清零;clk 提供了秒信号,频率为1HZ(在仿真中取10MHZ);clky 是用来扫描输出的,选用频率大于50HZ的方波(为便于观察结果,在仿真中取10MHZ);set 是用来置位的,低电平时有效,将以秒的速度,从零递增到所需定时的时间,为高电平时以分的速度递减,实现定时,直到零,定时结束;alm 输出高电平,可启动各种电路或发出警报。时间的变化都将在数码管上显示出来。

2.模块及模块功能

模块AAA见下图示。它是核心模块,用来实现定时器的逻辑功能,计数结果用十进制数输出。

LIBRARY ieee;

USE

USE aaa IS

PORT(clk, clr, set: in std_logic;

alm: out std_logic;

q1,q0: out std_logic_vector(3 downto 0));

END aaa;

ARCHITECTURE aaa_arc OF aaa IS

BEGIN

PROCESS (clk,clr)

variable cnt1,cnt0:std_logic_vector(3 downto 0);

variable cnt: integer range 0 to 59;

BEGIN

IF clr='0' THEN --整体复位alm<='0';

cnt:=0;

cnt1:="0000";

cnt0:="0000";

ELSIF clk'EVENT AND clk='1' THEN --设计数初值IF set='0' THEN

cnt:=0;

IF cnt0<"1001" THEN

cnt0:=cnt0+1;

ELSE

cnt0:="0000";

IF cnt1<"1001" THEN

cnt1:=cnt1+1;

ELSE

cnt1:="0000";

END IF;

END IF;

ELSE

IF cnt<59 THEN --60分频

cnt:=cnt+1;

ELSE

cnt:=0;

IF cnt0>"0000" THEN

cnt0:=cnt0-1;

IF cnt1="0000" AND cnt0="0000" THEN --判断计时是否结束

alm<='1';

END IF;

ELSE

cnt0:="1001";

IF cnt1>"0000" THEN

cnt1:=cnt1-1;

ELSE

cnt1:="1001";

END IF;

END IF;

END IF;

END IF;

END IF;

q0<=cnt0;

q1<=cnt1;

END PROCESS;

END aaa_arc;

模块CH如下图示。由于只用了两个数码管,所以片选信号直接接一个较快的时钟。此模块的功能是对应片选信号,送出要显示的数据。

LIBRARY ieee;

USE ch IS

PORT(sel:in std_logic;

a1,a0:in std_logic_vector(3 downto 0);

q:out std_logic_vector(3 downto 0));

END ch;

ARCHITECTURE ch_arc OF ch IS

BEGIN

PROCESS(sel,a0,a1)

BEGIN

IF sel='0' THEN

q<=a0;

ELSE

q<=a1;

END IF;

END PROCESS;

END ch_arc;

模块DISP如下图示。该模块为七段译码器。

LIBRARY ieee;

USE disp IS

PORT(a:in std_logic_vector(3 downto 0);

q:out std_logic_vector(6 downto 0)); END disp;

ARCHITECTURE disp_arc OF disp IS

BEGIN

PROCESS(a)

BEGIN

CASE a IS

WHEN "0000"=>q<="0111111";

WHEN "0001"=>q<="0000110";

WHEN "0010"=>q<="1011011";

WHEN "0011"=>q<="1001111";

WHEN "0100"=>q<="1100110";

WHEN "0101"=>q<="1101101";

WHEN "0110"=>q<="1111101";

WHEN "0111"=>q<="0000111";

WHEN "1000"=>q<="1111111";

WHEN "1001"=>q<="1101111";

WHEN others=>q<="0000000";

END CASE;

END PROCESS;

END disp_arc;

相关文档
最新文档