《计数计时器的VHDL设计.ppt》由会员分享,可在线阅读,更多相关《计数计时器的VHDL设计.ppt(31页珍藏版)》请在优知文库上搜索。
1、计数/计时器的VHDL设计本课要解决的问题:n一般计时器的VHDL描述;n六十进制计数器和计时器的VHDL设计;n二十四进制计时器的VHDL设计;n数字钟的VHDL设计。一、计数器的作用n在时钟的驱动下,对输入脉冲进行计数;如果输入的脉冲为时钟脉冲,就成为计时器。n当计数值达到一定数值,计数器产生进位输出,并复位。二、计数器的设计(P63-67)n简单计时器的设计;n六十进制计数器和计时器的设计;n二十四进制计时器的设计;n数字钟的设计。n最简单的计时器ENTITY CNT4 IS PORT(CLK:IN BIT;Q :BUFFER INTEGER RANGE 15 DOWNTO 0 );EN
2、D;ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN Q=Q+1;END IF;END PROCESS;END bhv;BUFFER模式才可以读取在时钟CLK信号的驱动下Q对时钟信号CLK进行计数;由于Q为BUFFER模式,所以可以读取Q的值【例3-19】表式表式Q=Q+1Q=Q+1的右项与左项并非处于相同的时刻内,对于时序电的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即左项
3、要获得当前的左项要获得当前的Q+1Q+1,需等待下一个时钟周期。,需等待下一个时钟周期。时钟信号到来?时钟信号到来?Q计数加计数加1结束结束 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 IS PORT(CLK:IN STD_LOGIC;Q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END;ARCHITECTURE bhv OF CNT4 ISSIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS
4、(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN Q1=Q1+1;END IF;END PROCESS;Q 0);ELSIF CLKEVENT AND CLK=1 THEN IF EN=1 THEN IF CQI 0);END IF;END IF;END IF;IF CQI=9 THEN COUT=1;ELSE COUT=0;END IF;CQ 0)为省略赋值方式,对CQI清零检测是否允许计数允许计数允许计数,检测是否小于检测是否小于9大于大于9,计数值清零,计数值清零计数大于等于9,输出进位信号将计数值向端口输出LIBRARY IEEE;USE IEEE.STD_L
5、OGIC_1164.ALL;USE IEEE.STD_LOGIC_unsigned.ALL;ENTITY bcd60count ISPORT(clk,bcd1wr,bcd10wr,cin:IN STD_LOGIC;co:OUT STD_LOGIC;datain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);bcd10n:BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);bcd1n:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);END bcd60count;【六十进制计数器】|实体n 六十进制计数器的设计clk:时钟端;bcd1w
6、r,bcd10wr:计数初值的个位和十位允许写入端;datain:计数初值输入端;bcd1n,bcd10n:计数值的个位输出和十位输出;co:计数值进位输出。|结构体ARCHITECTURE behave OF bcd60count ISBEGINEND behave;PROCESS(clk,bcd1wr)BEGINIF(bcd1wr=1)THEN bcd1n=datain;ELSIF(clkEVENT AND clk=1)THEN IF(cin=1)THEN IF(bcd1n=“1001”)THEN bcd1n=0000;ELSE bcd1n=bcd1n+1;END IF;END IF;EN
7、D IF;END PROCESS;PROCESS(bcd10n,bcd1n,cin)BEGINIF(cin=1 AND bcd1n=“1001”AND bcd10n=“101”)THEN co=1;ELSE co=0;END IF;END PROCESS;PROCESS(clk,bcd10wr)BEGINIF(bcd10wr=1)THEN bcd10n=datain(2 DOWNTO 0);ELSIF(clkEVENT AND clk=1)THEN IF(cin=1 AND bcd1n=“1001”)THEN IF(bcd10n=“101”)THEN bcd10n=000;ELSE bcd10
8、n=bcd10n+1;END IF;END IF;END IF;END PROCESS;PROCESS(clk,bcd1wr)BEGINIF(bcd1wr=1)THEN bcd1n=datain;ELSIF(clkEVENT AND clk=1)THEN IF(cin=1)THEN IF(bcd1n=“1001”)THEN bcd1n=0000;ELSE bcd1n=bcd1n+1;END IF;END IF;END IF;END PROCESS;进程处理个位计数bcd1wr为1时,对个位bcd1n进行置位在时钟信号驱动下,当进位输入cin为1时,若bcd1n为9则归零;否则bcd1n加1计数
9、PROCESS(clk,bcd10wr)BEGINIF(bcd10wr=1)THEN bcd10n=datain(2 DOWNTO 0);ELSIF(clkEVENT AND clk=1)THEN IF(cin=1 AND bcd1n=“1001”)THEN IF(bcd10n=“101”)THEN bcd10n=000;ELSE bcd10n=bcd10n+1;END IF;END IF;END IF;END PROCESS;进程处理十位计数bcd10wr为1时,对十位bcd10n进行置位在时钟信号驱动下,当进位输入cin为1时,个位bcd1n为9,若十位bcd10n为5,则bcd10n归零
10、;否则bcd1n加1计数PROCESS(bcd10n,bcd1n,cin)BEGINIF(cin=1 AND bcd1n=“1001”AND bcd10n=“101”)THEN co=1;ELSE co=0;END IF;END PROCESS;进程处理进位输出当个位bcd1n为9,十位bcd10为5,即计数值为59时,若cin为1表示再来一个进位输入需要计数,则计数器有进位要输出六十进制计时器六十进制计时器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY clk_s ISPORT(clk:IN STD_LOGIC;q1:BUFFER INTEGE
11、R RANGE 0 TO 9;qt:BUFFER INTEGER RANGE 0 TO 6;co:OUT STD_LOGIC);END clk_s;ARCHITECTURE behav OF clk_s ISBEGINPROCESS(clk)BEGINIF(clkEVENT AND clk=1)THEN IF(q1=9)THEN q1=0;ELSE q1=q1+1;END IF;END IF;END PROCESS;PROCESS(clk,q1)BEGINIF(clkEVENT AND clk=1)THEN IF(q1=9)THEN IF(qt=5)THEN qt=0;ELSE qt=qt+1
12、;END IF;END IF;END IF;END PROCESS;PROCESS(clk,q1,qt)BEGINIF(clkEVENT AND clk=1)THEN IF(qt=5 AND q1=9)THEN co=1;ELSE co=0;END IF;END IF;END PROCESS;END behav;二十四进制计数器ENTITY clk_h ISPORT(clk:IN BIT;q1:BUFFER INTEGER RANGE 0 TO 9;qt:BUFFER INTEGER RANGE 0 TO 2;co:OUT BIT);END clk_h;n二十四进制计数器的设计ARCHITEC
13、TURE a_clk_h OF clk_h ISBEGINPROCESS(clk,qt)BEGINIF(clkEVENT AND clk=1)THEN IF(qt=2 and q1=3)THEN q1=0;ELSIF(q1=9)THEN q1=0;ELSE q1=q1+1;END IF;END IF;END PROCESS;PROCESS(q1,clk)BEGINIF(clkEVENT AND clk=1)THEN IF(q1=3)THEN IF(qt=2)THEN qt=0;END IF;ELSIF(q1=9)THEN qt=qt+1;END IF;END IF;END PROCESS;PR
14、OCESS(q1,qt,clk)BEGINIF(clkEVENT AND clk=1)THEN IF(q1=3 AND qt=2)THEN co=1;ELSE co=0;END IF;END IF;END PROCESS;END a_clk_h;n实验:数字钟的设计六十进制计数器 (秒)六十进制计数器 (分)二十四进制计数器 (小时)基准脉冲秒进位分进位秒显示分显示小时显示三、分频器n 分频器以计数器为基础实现;n 对输入脉冲进行计数,输入为N个脉冲时,输出为1个脉冲,输出信号即对输入信号进行N分频。输入N个脉冲输出1个脉冲ENTITY CNT4 IS PORT(CLK:IN BIT;Q :B
15、UFFER INTEGER RANGE 15 DOWNTO 0;COUT:OUT BIT);END;ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN IF Q=4 THEN Q=0;ELSE Q=Q+1;END IF;END IF;IF Q=4 THEN COUT=1;ELSE COUT=4 THEN Q:=0;ELSE Q:=Q+1;END IF;END IF;IF QP THEN COUT=1;ELSE COUT=0;END IF;END PROCESS;END bhv;n占空比为5
16、0%的偶数倍分频器:n方案一:当计数器计数到N/2-1时,输出信号翻转,同时计数器复位;n方案二:计数器为0N/2-1时,输出信号为0;计数器为N/2N-1时,输出信号为1。50%占空比的6分频器Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clk_div1 isport(clk_in:in std_logic;clk_out:out std_logic);end clk_div1;第一种方案:architecture a of clk_div1 issignal clk_outQ:std_logic:=0;signal countQ:std_logic_vector(2 downto 0):=“000”;begin process(clk_in)begin if(clk_inevent and clk_in=1)then if(countQ/=2)then countQ=countQ+1;else clk_outQ