计数计时器的VHDL设计.ppt

上传人:rrsccc 文档编号:8870968 上传时间:2021-01-21 格式:PPT 页数:31 大小:268KB
返回 下载 相关 举报
计数计时器的VHDL设计.ppt_第1页
第1页 / 共31页
计数计时器的VHDL设计.ppt_第2页
第2页 / 共31页
计数计时器的VHDL设计.ppt_第3页
第3页 / 共31页
计数计时器的VHDL设计.ppt_第4页
第4页 / 共31页
计数计时器的VHDL设计.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《计数计时器的VHDL设计.ppt》由会员分享,可在线阅读,更多相关《计数计时器的VHDL设计.ppt(31页珍藏版)》请在三一文库上搜索。

1、计数/计时器的VHDL设计,本课要解决的问题:,一般计时器的VHDL描述; 六十进制计数器和计时器的VHDL设计; 二十四进制计时器的VHDL设计; 数字钟的VHDL设计。,一、 计数器的作用,在时钟的驱动下,对输入脉冲进行计数;如果输入的脉冲为时钟脉冲,就成为计时器。 当计数值达到一定数值,计数器产生进位输出,并复位。,二、计数器的设计(P63-67),简单计时器的设计; 六十进制计数器和计时器的设计; 二十四进制计时器的设计; 数字钟的设计。,最简单的计时器,ENTITY CNT4 IS PORT ( CLK : IN BIT ; Q : BUFFER INTEGER RANGE 15 D

2、OWNTO 0 ) ; END ; 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 + 1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q + 1,需等待下一个时钟

3、周期。,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 IS SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN Q1

4、 = Q1 + 1 ; END IF; END PROCESS ; Q = Q1 ; END bhv;,【例3-20】,std_logic_unsigned程序包包含对运算符的重载,定义信号Q1,Q1作为内部信号,可以进行改写和读取;,对+进行运算符重载,标准逻辑类型可进行加法,加上异步复位和置位的十进制计时器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT (CLK,RST,EN : IN STD_LOGIC; CQ : OUT STD_LOGIC

5、_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT10;,RST为复位端,EN为使能端;,COUT为进位输出端;,ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK, RST, EN) VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST = 1 THEN CQI := (OTHERS =0) ; ELSIF CLKEVENT AND CLK=1 THEN IF EN = 1 THEN IF CQI 0); END IF; END I

6、F; END IF; IF CQI = 9 THEN COUT = 1; ELSE COUT = 0; END IF; CQ = CQI; END PROCESS; END behav;,异步复位, CQI := (OTHERS =0) 为省略赋值方式,对CQI清零,检测是否允许计数,允许计数, 检测是否小于9,大于9,计数值清零,计数大于等于9,输出进位信号,将计数值向端口输出,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY bcd60count IS PORT(clk, b

7、cd1wr, 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;,【六十进制计数器】,实体,六十进制计数器的设计,clk: 时钟端; bcd1wr, bcd10wr: 计数初值的个位和十位允许写入端; datain: 计数初值输入端; bcd1n, bcd10n:

8、计数值的个位输出和十位输出; co: 计数值进位输出。,结构体,ARCHITECTURE behave OF bcd60count IS BEGIN END behave;,PROCESS(clk, bcd1wr) BEGIN IF(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;,PROCESS (bcd10n,

9、bcd1n, cin) BEGIN IF(cin=1 AND bcd1n=“1001” AND bcd10n=“101”) THEN co=1; ELSE co=0; END IF; END PROCESS;,PROCESS(clk, bcd10wr) BEGIN IF(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; EN

10、D IF; END IF; END IF; END PROCESS;,PROCESS(clk, bcd1wr) BEGIN IF(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则归零;否则bc

11、d1n加1计数,PROCESS(clk, bcd10wr) BEGIN IF(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时, 个位bcd1

12、n为9,若十位bcd10n为5, 则bcd10n归零;否则bcd1n加1计数,PROCESS (bcd10n, bcd1n, cin) BEGIN IF (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 I

13、S PORT(clk: IN STD_LOGIC; q1: BUFFER INTEGER RANGE 0 TO 9; qt: BUFFER INTEGER RANGE 0 TO 6; co: OUT STD_LOGIC); END clk_s;,ARCHITECTURE behav OF clk_s IS BEGIN PROCESS(clk) BEGIN IF(clkEVENT AND clk=1) THEN IF(q1=9) THEN q1=0; ELSE q1=q1+1; END IF; END IF; END PROCESS; PROCESS(clk,q1) BEGIN IF(clkEV

14、ENT AND clk=1) THEN IF(q1=9) THEN IF(qt=5) THEN qt=0; ELSE qt=qt+1; END IF; END IF; END IF; END PROCESS;,PROCESS(clk, q1, qt) BEGIN IF(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 IS PORT(clk: IN BIT; q1: BUFFER INTEGE

15、R RANGE 0 TO 9; qt: BUFFER INTEGER RANGE 0 TO 2; co: OUT BIT); END clk_h;,二十四进制计数器的设计,ARCHITECTURE a_clk_h OF clk_h IS BEGIN PROCESS(clk, qt) BEGIN IF (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) BEGIN IF

16、(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; PROCESS(q1, qt, clk) BEGIN IF (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;,实验: 数字钟的设计,三、分频器,分频器以计数器为基础实现; 对输入脉冲

17、进行计数,输入为N个脉冲时,输出为1个脉冲,输出信号即对输入信号进行N分频。,输入N个脉冲,输出1个脉冲,ENTITY CNT4 IS PORT ( CLK : IN BIT ; Q : BUFFER 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 C

18、OUT = 1; ELSE COUT = 0; END IF; END PROCESS ; END bhv;,分频器还可以设置占空比; 占空比为P/Q,其中P+Q=N,输入脉冲数小于等于P,输入脉冲数大于等于P,ENTITY CNT4 IS PORT ( CLK : IN BIT ; P: IN INTEGER RANGE 15 DOWNTO 0; COUT: OUT BIT ) ; END ; ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS (CLK) VARIABLE Q : INTEGER RANGE 15 DOWNTO 0; BEGIN IF CLK

19、EVENT AND CLK = 1 THEN IF Q=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;,占空比为50%的偶数倍分频器: 方案一:当计数器计数到N/2-1时,输出信号翻转,同时计数器复位; 方案二:计数器为0N/2-1时,输出信号为0;计数器为N/2N-1时,输出信号为1。,50%占空比的6分频器,Library ieee; use ieee.std_logic_1164.all; use ieee.s

20、td_logic_arith.all; use ieee.std_logic_unsigned.all; entity clk_div1 is port(clk_in:in std_logic; clk_out:out std_logic); end clk_div1;,第一种方案:,architecture a of clk_div1 is signal clk_outQ: std_logic:=0; signal countQ:std_logic_vector(2 downto 0):=“000”; begin process(clk_in) begin if(clk_inevent an

21、d clk_in=1) then if(countQ/=2)then countQ0); end if; end if; end process; clk_out=clk_outQ; end a;,第二种方案:,architecture b of clk_div1 is signal countQ:std_logic_vector(2 downto 0); begin process(clk_in) begin if(clk_inevent and clk_in=1) then if(countQ0); end if; end if; end process; process(countQ)

22、begin if (countQ3) then clk_out=0; else clk_out=1; end if; end process; end b;,占空比50%的奇数倍分频器: 欲实现占空比为50%的2N+1分频器,则需要对待分频时钟上升沿和下降沿分别进行N分频,然后将两个分频所得的时钟信号相或得到占空比为50%的2N+1分频器。,library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity clk_div3 is por

23、t(clk_in:in std_logic; clk_out:out std_logic); end clk_div3; architecture a of clk_div3 is signal cnt1,cnt2:integer range 0 to 6; signal clk1, clk2:std_logic; begin,50%占空比的5分频器:,process(clk_in)-上升沿 begin if(rising_edge(clk_in)then if(cnt16) then cnt1=cnt1+1; else cnt1=0; end if; if(cnt13) then clk1=1; else clk1=0; end if; end if; end process;,process(clk_in)-下降沿 begin if(falling_edge(clk_in)then if(cnt26) then cnt2=cnt2+1; else cnt2=0; end if; if(cnt23) then clk2=1; else clk2=0; end if; end if; end process; clk_out=clk1 or clk2; end a;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1