计数计时器的VHDL设计.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PROCESS(clk, bcd1wr) BEGIN IF(bcd1wr='1') THEN bcd1n<=datain; ELSIF(clk'EVENT 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;
加上异步复位和置位的十进制计时器
LIBRARY IEEE; RST为复位端,EN为 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_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); COUT为进位输出端; END CNT10;
二、计数器的设计(P63-67)
简单计时器的设计; 六十进制计数器和计时器的设计; 二十四进制计时器的设计; 数字钟的设计。
最简单的计时器
【例3-19】
ENTITY CNT4 IS PORT ( CLK : IN BIT ; Q : BUFFER INTEGER RANGE 15 DOWNTO 0 ) ; END ; BUFFER模式 ARCHITECTURE bhv OF CNT4 IS 才可以读取 BEGIN PROCESS (CLK) BEGIN 在时钟CLK信号的 IF CLK'EVENT AND CLK = '1' THEN 驱动下 Q <= Q + 1 ; Q对时钟信号CLK进行计 END IF; 数;由于Q为BUFFER模 END PROCESS ; 式,所以可以读取Q的值 END bhv; 表式Q <= Q + 1的右项与左项并非处于相同的时刻内,对于时序电 路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即 左项要获得当前的Q + 1,需等待下一个时钟周期。
进程处理进位输出
当个位bcd1n为9, 十位bcd10为 5, 即计数值为59时,若cin为1表 示再来一个进位输入需要计数, 则计数器有进位要输出
六十进制计时器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY clk_s IS 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;
PROCESS(clk,q1) BEGIN IF(clk'EVENT 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(clk'EVENT AND clk='1') THEN IF(qt=5 AND q1=9) THEN co<='1'; ELSE co<='0'; END IF; END IF; END PROCESS; END behav;
PROCESS(q1, qt, clk) BEGIN IF (clk'EVENT 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;
FALSE
时钟信号到来?
TRUE Q计数加1
结束
【例3-20】 LIBRARY IEEE ; std_logic_unsigned 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 定义信号Q1 SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= Q1 + 1 ; Q1作为内部信号,可 END IF; 以进行改写和读取; END PROCESS ; Q <= Q1 ; 对’+’进行运算符重载,标准 END bhv; 逻辑类型可进行加法
PROCESS(q1, clk) BEGIN IF (clk'EVENT 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;
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') ; CQI := (OTHERS =>‘0’) 为省 ELSIF CLK'EVENT AND CLK='1' THEN 略赋值方式,对CQI清零 IF EN = '1' THEN 检测是否允许计数 IF CQI < 9 THEN CQI := CQI + 1; ELSE CQI := (OTHERS =>'0'); END IF; 允许计数, 检测是否小于9 END IF; END IF; 大于9,计数值清零 IF CQI = 9 THEN COUT <= '1'; ELSE COUT <= '0'; 计数大于等于9,输出进位 END IF; 信号 CQ <= CQI; END PROCESS; 将计数值向端口输出 END behav;
二十四进制计数器的设计
二十四进制计数器
ENTITY clk_h IS PORT(clk: IN BIT; q1: BUFFER INTEGER 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 (clk'EVENT 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;
进程处理个位计数 bcd1wr为’1’时, 对个位bcd1n进行 置位 在时钟信号驱动下,当进位输入 cin为1时,若bcd1n为9则归零;否 则bcd1n加1计数
PROCESS(clk, bcd10wr) BEGIN IF(bcd10wr='1') THEN bcd10n<=datain(2 DOWNTO 0); ELSIF(clk'EVENT 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;
结构体
ARCHITECTURE behave OF bcd60count IS BEGIN PROCESS(clk, bcd1wr) BEGIN IF(bcd1wr='1') THEN bcd1n<=datain; ELSIF(clk'EVENT AND clk='1') THEN IF(cin='1') THEN IF(b34;0000"; ELSE bcd1n<=bcd1n+1; PROCESS (bcd10n, bcd1n, END IF; cin) END IF; BEGIN END IF; IF(cin='1' AND bcd1n=“1001” END PROCESS; AND bcd10n=“101”) THEN co<='1'; ELSE END behave; co<='0'; END IF; END PROCESS; PROCESS(clk, bcd10wr) BEGIN IF(bcd10wr='1') THEN bcd10n<=datain(2 DOWNTO 0); ELSIF(clk'EVENT 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;
六十进制计数器的设计
【六十进制计数器】
实体
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY bcd60count IS PORT(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; clk: 时钟端; bcd1wr, bcd10wr: 计数初值 的个位和十位允许写入端; datain: 计数初值输入端; bcd1n, bcd10n: 计数值的个 位输出和十位输出; co: 计数值进位输出。
进程处理十位计数 bcd10wr为’1’时, 对十位bcd10n进 行置位 在时钟信号驱动下,当进位输入 cin为1时, 个位bcd1n为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;
计数/计时器的VHDL 设计
本课要解决的问题:
一般计时器的VHDL描述; 六十进制计数器和计时器的VHDL设计; 二十四进制计时器的VHDL设计; 数字钟的VHDL设计。
一、 计数器的作用
在时钟的驱动下,对输入脉冲进行计数;如 果输入的脉冲为时钟脉冲,就成为计时器。 当计数值达到一定数值,计数器产生进位输 出,并复位。
ARCHITECTURE behav OF clk_s IS BEGIN PROCESS(clk) BEGIN IF(clk'EVENT AND clk='1') THEN IF(q1=9) THEN q1<=0; ELSE q1<=q1+1; END IF; END IF; END PROCESS;