计数器的设计
合集下载
相关主题
- 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=9) THEN bcd1n<="0000"; ELSE bcd1n<=bcd1n+1; END IF; END IF; END IF; END PROCESS;
六十进制计数器的设计
【例5-30 六十进制计数器】
实体
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=9 AND bcd10n=5) THEN co<='1'; ELSE co<='0'; END IF; END PROCESS;
最简单的计数器
ENTITY counter8c IS 加上计数脉 PORT(clk: IN BIT; 冲输入端cin cin: IN BIT; num: BUFFER INTEGER RANGE 0 TO 255); END counter8c; ARCHITECTURE a_counter8c OF counter8c IS BEGIN PROCESS(clk) BEGIN IF (clk’EVENT AND clk=‘1’) THEN IF (cin=‘1’) THEN num<=num+1; 在时钟驱动下,当cin END IF; 为高电平时,对cin端 END IF; 输入的脉冲计数 END PROCESS; END a_counter8c;
num为整数类型才 ARCHITECTURE a_counter8b OF counter8b IS 能进行加法运算 BEGIN PROCESS(clk) FALSE 时钟信号到来? BEGIN IF (clk’EVENT AND clk=‘1’) THEN num<=num+1; TRUE END IF; END PROCESS; END a_counter8b; num计数加1
【例5-28 带允许端的同步十二进制计数器】
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY counter12en IS PORT(clk, clr, en: IN STD_LOGIC; qa, qb, qc, qd: OUT STD_LOGIC); END counter12en; std_logic_arith 程序包包含对 运算符的重载 ELSIF (clk’EVENT AND clk=‘1’) THEN IF en=‘1’ THEN IF count_4=“1011” THEN
二十四进制计数器的设计
二十四进制计数器
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;
结束
加上异步复位和置位
ENTITY counter8b IS PORT(clk, reset, set: IN BIT; data: IN INTEGER RANGE 0 TO 255; num: BUFFER INTEGER RANGE 0 TO 255); END counter8b; ARCHITECTURE a_counter8b OF counter8b IS BEGIN PROCESS(clk) BEGIN IF (reset=‘1’) THEN num<=0; ELSIF (set=‘1’) THEN num<=data; ELSIF (clk’EVENT AND clk=‘1’) THEN num<=num+1; END IF; END PROCESS; END a_counter8b;
结构体
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(bcd1n=9) THEN bcd1n<="0000"; ELSE bcd1n<=bcd1n+1; PROCESS (bcd10n, bcd1n, END IF; cin) END IF; BEGIN END IF; IF(cin='1' AND bcd1n=9 AND END PROCESS; bcd10n=5) 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=9) THEN IF(bcd10n=5) THEN bcd10n<="000"; ELSE bcd10n<=bcd10n+1; END IF; END IF; END IF; END PROCESS;
二、计数器的设计
简单计时器的设计; 六十进制计数器和计时器的设计; 二十四进制计时器的设计; 数字钟的设计。
最简单的计时器
输出模式设为 BUFFER才能读 取num的值
ENTITY counter8b IS PORT(clk: IN BIT; num: BUFFER INTEGER RANGE 0 TO 255); END counter8b;
计时/计数器的VHDL 设计
本课要解决的问题:
一般计时器的VHDL描述; 六十进制计数器和计时器的VHDL设计; 二十四进制计时器的VHDL设计; 数字钟的VHDL设计。
一、 计数ቤተ መጻሕፍቲ ባይዱ的作用
在时钟的驱动下,对输入脉冲进行计数;如 果输入的脉冲为时钟脉冲,就成为计时器。 当计数值达到一定数值,计数器产生进位输 出,并复位。
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;
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;
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;
进程处理进位输出
当个位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(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;
count_4<=“0000”;
ELSE count_4<=count_4+’1’; END IF; END IF; END IF; END PROCESS; END behave; 当count_4为12时, 在脉冲驱动下 count_4归零
ARCHITECTURE behave OF counter12en IS SIGNAL count_4: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN qa<=count_4(0); qb<=count_4(1); qc<=count_4(2); qd<=count_4(3); PROCESS(clk) BEGIN IF (clr=‘1’) THEN count_4<=“0000”;
进程处理个位计数 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=9) THEN IF(bcd10n=5) THEN bcd10n<="000"; ELSE bcd10n<=bcd10n+1; END IF; END IF; END IF; END PROCESS;