您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 计数计时器的VHDL设计
计数/计时器的VHDL设计本课要解决的问题:一般计时器的VHDL描述;六十进制计数器和计时器的VHDL设计;二十四进制计时器的VHDL设计;数字钟的VHDL设计。一、计数器的作用在时钟的驱动下,对输入脉冲进行计数;如果输入的脉冲为时钟脉冲,就成为计时器。当计数值达到一定数值,计数器产生进位输出,并复位。二、计数器的设计(P63-67)简单计时器的设计;六十进制计数器和计时器的设计;二十四进制计时器的设计;数字钟的设计。最简单的计时器ENTITYCNT4ISPORT(CLK:INBIT;Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ=Q+1;ENDIF;ENDPROCESS;ENDbhv;BUFFER模式才可以读取在时钟CLK信号的驱动下Q对时钟信号CLK进行计数;由于Q为BUFFER模式,所以可以读取Q的值【例3-19】表式Q=Q+1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q+1,需等待下一个时钟周期。时钟信号到来?Q计数加1结束TRUEFALSELIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREbhvOFCNT4ISSIGNALQ1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1=Q1+1;ENDIF;ENDPROCESS;Q=Q1;ENDbhv;【例3-20】std_logic_unsigned程序包包含对运算符的重载定义信号Q1Q1作为内部信号,可以进行改写和读取;对’+’进行运算符重载,标准逻辑类型可进行加法加上异步复位和置位的十进制计时器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT10;RST为复位端,EN为使能端;COUT为进位输出端;ARCHITECTUREbehavOFCNT10ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='1'THENCQI:=(OTHERS='0');ELSIFCLK'EVENTANDCLK='1'THENIFEN='1'THENIFCQI9THENCQI:=CQI+1;ELSECQI:=(OTHERS='0');ENDIF;ENDIF;ENDIF;IFCQI=9THENCOUT='1';ELSECOUT='0';ENDIF;CQ=CQI;ENDPROCESS;ENDbehav;异步复位,CQI:=(OTHERS=‘0’)为省略赋值方式,对CQI清零检测是否允许计数允许计数,检测是否小于9大于9,计数值清零计数大于等于9,输出进位信号将计数值向端口输出LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_unsigned.ALL;ENTITYbcd60countISPORT(clk,bcd1wr,bcd10wr,cin:INSTD_LOGIC;co:OUTSTD_LOGIC;datain:INSTD_LOGIC_VECTOR(3DOWNTO0);bcd10n:BUFFERSTD_LOGIC_VECTOR(2DOWNTO0);bcd1n:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDbcd60count;【六十进制计数器】实体六十进制计数器的设计clk:时钟端;bcd1wr,bcd10wr:计数初值的个位和十位允许写入端;datain:计数初值输入端;bcd1n,bcd10n:计数值的个位输出和十位输出;co:计数值进位输出。结构体ARCHITECTUREbehaveOFbcd60countISBEGINENDbehave;PROCESS(clk,bcd1wr)BEGINIF(bcd1wr='1')THENbcd1n=datain;ELSIF(clk'EVENTANDclk='1')THENIF(cin='1')THENIF(bcd1n=“1001”)THENbcd1n=0000;ELSEbcd1n=bcd1n+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(bcd10n,bcd1n,cin)BEGINIF(cin='1'ANDbcd1n=“1001”ANDbcd10n=“101”)THENco='1';ELSEco='0';ENDIF;ENDPROCESS;PROCESS(clk,bcd10wr)BEGINIF(bcd10wr='1')THENbcd10n=datain(2DOWNTO0);ELSIF(clk'EVENTANDclk='1')THENIF(cin='1'ANDbcd1n=“1001”)THENIF(bcd10n=“101”)THENbcd10n=000;ELSEbcd10n=bcd10n+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,bcd1wr)BEGINIF(bcd1wr='1')THENbcd1n=datain;ELSIF(clk'EVENTANDclk='1')THENIF(cin='1')THENIF(bcd1n=“1001”)THENbcd1n=0000;ELSEbcd1n=bcd1n+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;进程处理个位计数bcd1wr为’1’时,对个位bcd1n进行置位在时钟信号驱动下,当进位输入cin为1时,若bcd1n为9则归零;否则bcd1n加1计数PROCESS(clk,bcd10wr)BEGINIF(bcd10wr='1')THENbcd10n=datain(2DOWNTO0);ELSIF(clk'EVENTANDclk='1')THENIF(cin='1'ANDbcd1n=“1001”)THENIF(bcd10n=“101”)THENbcd10n=000;ELSEbcd10n=bcd10n+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;进程处理十位计数bcd10wr为’1’时,对十位bcd10n进行置位在时钟信号驱动下,当进位输入cin为1时,个位bcd1n为9,若十位bcd10n为5,则bcd10n归零;否则bcd1n加1计数PROCESS(bcd10n,bcd1n,cin)BEGINIF(cin='1'ANDbcd1n=“1001”ANDbcd10n=“101”)THENco='1';ELSEco='0';ENDIF;ENDPROCESS;进程处理进位输出当个位bcd1n为9,十位bcd10为5,即计数值为59时,若cin为1表示再来一个进位输入需要计数,则计数器有进位要输出六十进制计时器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYclk_sISPORT(clk:INSTD_LOGIC;q1:BUFFERINTEGERRANGE0TO9;qt:BUFFERINTEGERRANGE0TO6;co:OUTSTD_LOGIC);ENDclk_s;ARCHITECTUREbehavOFclk_sISBEGINPROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIF(q1=9)THENq1=0;ELSEq1=q1+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,q1)BEGINIF(clk'EVENTANDclk='1')THENIF(q1=9)THENIF(qt=5)THENqt=0;ELSEqt=qt+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,q1,qt)BEGINIF(clk'EVENTANDclk='1')THENIF(qt=5ANDq1=9)THENco='1';ELSEco='0';ENDIF;ENDIF;ENDPROCESS;ENDbehav;二十四进制计数器ENTITYclk_hISPORT(clk:INBIT;q1:BUFFERINTEGERRANGE0TO9;qt:BUFFERINTEGERRANGE0TO2;co:OUTBIT);ENDclk_h;二十四进制计数器的设计ARCHITECTUREa_clk_hOFclk_hISBEGINPROCESS(clk,qt)BEGINIF(clk'EVENTANDclk='1')THENIF(qt=2andq1=3)THENq1=0;ELSIF(q1=9)THENq1=0;ELSEq1=q1+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(q1,clk)BEGINIF(clk'EVENTANDclk='1')THENIF(q1=3)THENIF(qt=2)THENqt=0;ENDIF;ELSIF(q1=9)THENqt=qt+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(q1,qt,clk)BEGINIF(clk'EVENTANDclk='1')THENIF(q1=3ANDqt=2)THENco='1';ELSEco='0';ENDIF;ENDIF;ENDPROCESS;ENDa_clk_h;实验:数字钟的设计六十进制计数器(秒)六十进制计数器(分)二十四进制计数器(小时)基准脉冲秒进位分进位秒显示分显示小时显示三、分频器分频器以计数器为基础实现;对输入脉冲进行计数,输入为N个脉冲时,输出为1个脉冲,输出信号即对输入信号进行N分频。…输入N个脉冲输出1个脉冲ENTITYCNT4ISPORT(CLK:INBIT;Q:BUFFERINTEGERRANGE15DOWNTO0;COUT:OUTBIT);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENIFQ=4THENQ=0;ELSEQ=Q+1;ENDIF;ENDIF;IFQ=4THENCOUT='1';ELSECOUT='0';ENDIF;ENDPROCESS;ENDbhv;分频器还可以设置占空比;占空比为P/Q,其中P+Q=N,………输入脉冲数小于等于P输入脉冲数大于等于PENTITYCNT4ISPORT(CLK:INBIT;P:ININTEGERRANGE15DOWNTO0;COUT:OUTBIT);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)VARIABLEQ:INTEGERRANGE15DOWNTO0;BEGINIFCLK'EVENTANDCLK='1'THENIFQ=4THENQ:=0;ELSEQ:=Q+1;ENDIF;ENDIF;IFQPTHENCOUT='1';ELSECOUT='0';ENDIF;ENDPROCESS;ENDbhv;占空比为50%的偶数倍分频
本文标题:计数计时器的VHDL设计
链接地址:https://www.777doc.com/doc-5935449 .html