3539
- 收藏
- 点赞
- 分享
- 举报
多种频率的增减计数器
多种频率的增减计数器
概要
本计数器,为模六十计数器,共有四当频率,可增可减,可起可停,并可单击。而这些功能的改变只通过两个按钮来实现。S1按钮包含双击、单击、长按三种动作。S2按钮包含单击、长按两种动作。S1双击可增频率,长按减频率,单击起停计数器。S2长按改变增减。
功能实现详解
一,多频。通过一个多路选择器,选择不同的计数频率。在本例中,通过一个模四的计数器来进行选择。S1双击该计数器加一,长按减一。
二,起停。时钟输入和起停标志位相与后作为计数器的时钟输入,每单击一次,标志位改变一次(1 TO 0,0 TO 1)。0 为停,1 为计数。
三,单标志位为0时,单击S2计数器置零。
四,加减。每长按一次S2,加减标志位就改变一次(1 TO 0,0 TO 1)。1为加,0为减。
五,按钮的实现。S1,S2各有一个状态机来实现。有时钟来控制时间。有S1,S2的状态机的转向。
六,有内部自动产生时钟,经分频后作显示和键盘的时钟输入。
原理
1.时钟的产生。利用门延迟,产生振荡,经八次分频,输出一频率为 24KHZ的方波。由于频率仍很高,还需要分频,本例共用14次分频,冲中选出最高的4位,作为计数时钟的选择器的输入端。根据键盘抖动情况的不同选择一合适的时钟输入(11,位)。最低两位为用于显示选择输入,选择显示数据,输出段选码。
2.显示。有一个四选一数选器,轮流选择显示数据,同时输出相应的位选码。选择的数据经过一译码器输出相对应的段选码。(选用7段数码管)
3、键盘。以S1为例;当键被按下时,启动以计数器。计数器未计满时,如按键松开则跳到另外一个状态,计数器置零,继续计数。当有键被按下,停止计数。这过程中计数器溢出则停止计数。根据状态的不同给出不同的动作。
VHDL源程序:
--THE IEEE STANDARD 1164 PACKAGE, DECLARES STD_LOGIC, RISING_EDGE(), ETC.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--THIS PACKAGE IS A VERSION OF THE SYNOPSYS PACKAGE AND HAS BEEN
-- OPTIMIZED FOR USE WITH THE EXPRESS COMPILER.
LIBRARY SYNOPSYS;
USE SYNOPSYS.ATTRIBUTES.ALL;
端口
ENTITY TEST IS
PORT (
CLL:IN STD_LOGIC;
CLR:IN STD_LOGIC;
POINT:OUT STD_LOGIC;
BEEP:OUT STD_LOGIC;
BCDB:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
SEG:INOUT STD_LOGIC_VECTOR(3 DOWNTO 0);
LED: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END TEST;
结构体和变量说明
ARCHITECTURE TEST_ARCH OF TEST IS
SIGNAL ZERO:STD_LOGIC;
SIGNAL COUNTA:STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL COUNTC:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTD:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL BCD:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTR:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL COUNTL:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL CLKK:STD_LOGIC;
SIGNAL CLKC:STD_LOGIC;
SIGNAL CLKD:STD_LOGIC;
SIGNAL CLKI:STD_LOGIC;
SIGNAL STATL:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL OUTL,STATT:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL FLAGL,FLAGR,R,JIA,STOP:STD_LOGIC;
时钟元件
COMPONENT CLK IS
PORT(CLKOUT:INOUT STD_LOGIC);
END COMPONENT;
BEGIN主程序体
LED(0)<=NOT CLR; 指示灯
LED(1)<=NOT JIA;
LED(2)<=NOT STOP;
LED(3)<='0' WHEN OUTL="10"ELSE '1';
BEEP<='1'WHEN ( CLL='1' OR CLR='1')ELSE '0';响声
U1:CLK PORT MAP(CLKK); 时钟输入
FB: PROCESS(CLKK,COUNTA,COUNTC,COUNTD) 计数器
BEGIN
IF(CLKK='1'AND CLKK'EVENT)THEN
COUNTA<=COUNTA+1;
END IF;
END PROCESS;
P34:PROCESS( COUNTA) 四选一输出
BEGIN
CASE COUNTA(9 DOWNTO 8) IS
WHEN"00"=>SEG<="1110";BCD<=COUNTC;POINT<='1';
WHEN"01"=>SEG<="1101";BCD(2 DOWNTO 0)<=COUNTD;BCD(3)<='0';POINT<='0';
WHEN"10"=>SEG<="1011";BCD<="0000";POINT<='1';
WHEN OTHERS=>SEG<="0111";BCD<="0000";POINT<='0';
END CASE;
CLKI<=COUNTA(12);
END PROCESS;
选择不同的速率
CLKC<=COUNTA(15) WHEN STATT="00"ELSE
COUNTA(14) WHEN STATT="01"ELSE
COUNTA(13) WHEN STATT="10"ELSE
COUNTA(12) ; 速度指示
LED(7 DOWNTO 4)<="1110"WHEN STATT="00"ELSE
"1101"WHEN STATT="01"ELSE
"1011"WHEN STATT="10"ELSE
"0111"; 模60计数
P1:PROCESS(CLKC,COUNTC)
BEGIN
IF(ZERO='1' AND STOP='0')THEN
COUNTC<="0000";
ELSE
IF(CLKC='0' AND CLKC'EVENT)THEN
IF(STOP='1')THEN
IF(JIA='1')THEN
IF(COUNTC=9 )THEN COUNTC<="0000";ELSE COUNTC<=COUNTC+1;END IF;
ELSE
IF(COUNTC=0 )THEN COUNTC<="1001";ELSE COUNTC<=COUNTC-1;END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
CLKD<='1'WHEN (COUNTC(3)='0') XOR (JIA='1') AND STOP='1' ELSE '0';
P2:PROCESS(CLKD,COUNTD)
BEGIN
IF(ZERO='1' AND STOP='0')THEN
COUNTD<="000";
ELSE
IF(CLKD='0' AND CLKD'EVENT)THEN
IF(JIA='1')THEN
IF(COUNTD=5)THEN COUNTD<="000";ELSE COUNTD<=COUNTD+1;END IF;
ELSE
IF(COUNTD=0)THEN COUNTD<="101";ELSE COUNTD<=COUNTD-1;END IF;
END IF;
END IF;
END IF;
END PROCESS;
键盘输入
P5:PROCESS(CLKI,CLL,CLR)
BEGIN
S1
IF(CLKI='1' AND CLKI'EVENT)THEN
IF(COUNTL="000")THEN
IF(CLL=‘1’) THEN
OUTL<="00";
COUNTL<=COUNTL+1;
END IF;
ELSIF (COUNTL<7 AND (OUTL="00" OR OUTL="01")) THEN
IF (CLL='0') THEN OUTL<=OUTL+1;COUNTL<="001";
ELSE COUNTL<=COUNTL+1;
END IF;
ELSIF (COUNTL<7 AND OUTL="10") THEN
IF (CLL='1') THEN
STATT<=STATT+1;OUTL<="00"; COUNTL<="111";
ELSE
COUNTL<=COUNTL+1;
END IF;
ELSIF (COUNTL=7) THEN
IF (OUTL="01" OR OUTL="10") THEN STOP<= NOT STOP; END IF;
IF (OUTL="00") THEN STATT<=STATT-1; END IF;
IF (CLL='1') THEN
OUTL<="11";
ELSE
COUNTL<="000"; OUTL<="00";
END IF;
END IF;
--S2
IF (COUNTR=0) THEN
IF (CLR='1') THEN
COUNT<=COUNT+1;
END IF;
ELSIF (COUNTR<6) THEN
IF (CLR=’1’) THEN
COUTNR<=COUNTR+1;
ELSE
COUNTR<=”111”;
ZERO<=’1’;
END IF;
ELSIF (COUNTR=6) THEN
COUNTR<=COUNTR+1;
IF (CLR='1') THEN JIA<=NOT JIA;
ELSE
ZERO<='1';
END IF;
ELSIF (COUNTR=7) THEN
IF (CLR='0') THEN ZERO<='0';COUNTR<=”000”;
ELSE
COUNTR<=COUNTR;
END IF;
END IF;
END PROCESS;
WITH BCD SELECT
BCDB<= "0000110" WHEN "0001", --1 BCD译码
"1011011" WHEN "0010", --2
"1001111" WHEN "0011", --3
"1100110" WHEN "0100", --4
"1101101" WHEN "0101", --5
"1111101" WHEN "0110", --6
"0000111" WHEN "0111", --7
"1111111" WHEN "1000", --8
"1101111" WHEN "1001", --9
"1110111" WHEN "1010", --A
"1111100" WHEN "1011", --B
"0111001" WHEN "1100", --C
"1011110" WHEN "1101", --D
"1111001" WHEN "1110", --E
"1110001" WHEN "1111", --F
"0111111" WHEN OTHERS; --0
END TEST_ARCH;
概要
本计数器,为模六十计数器,共有四当频率,可增可减,可起可停,并可单击。而这些功能的改变只通过两个按钮来实现。S1按钮包含双击、单击、长按三种动作。S2按钮包含单击、长按两种动作。S1双击可增频率,长按减频率,单击起停计数器。S2长按改变增减。
功能实现详解
一,多频。通过一个多路选择器,选择不同的计数频率。在本例中,通过一个模四的计数器来进行选择。S1双击该计数器加一,长按减一。
二,起停。时钟输入和起停标志位相与后作为计数器的时钟输入,每单击一次,标志位改变一次(1 TO 0,0 TO 1)。0 为停,1 为计数。
三,单标志位为0时,单击S2计数器置零。
四,加减。每长按一次S2,加减标志位就改变一次(1 TO 0,0 TO 1)。1为加,0为减。
五,按钮的实现。S1,S2各有一个状态机来实现。有时钟来控制时间。有S1,S2的状态机的转向。
六,有内部自动产生时钟,经分频后作显示和键盘的时钟输入。
原理
1.时钟的产生。利用门延迟,产生振荡,经八次分频,输出一频率为 24KHZ的方波。由于频率仍很高,还需要分频,本例共用14次分频,冲中选出最高的4位,作为计数时钟的选择器的输入端。根据键盘抖动情况的不同选择一合适的时钟输入(11,位)。最低两位为用于显示选择输入,选择显示数据,输出段选码。
2.显示。有一个四选一数选器,轮流选择显示数据,同时输出相应的位选码。选择的数据经过一译码器输出相对应的段选码。(选用7段数码管)
3、键盘。以S1为例;当键被按下时,启动以计数器。计数器未计满时,如按键松开则跳到另外一个状态,计数器置零,继续计数。当有键被按下,停止计数。这过程中计数器溢出则停止计数。根据状态的不同给出不同的动作。
VHDL源程序:
--THE IEEE STANDARD 1164 PACKAGE, DECLARES STD_LOGIC, RISING_EDGE(), ETC.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--THIS PACKAGE IS A VERSION OF THE SYNOPSYS PACKAGE AND HAS BEEN
-- OPTIMIZED FOR USE WITH THE EXPRESS COMPILER.
LIBRARY SYNOPSYS;
USE SYNOPSYS.ATTRIBUTES.ALL;
端口
ENTITY TEST IS
PORT (
CLL:IN STD_LOGIC;
CLR:IN STD_LOGIC;
POINT:OUT STD_LOGIC;
BEEP:OUT STD_LOGIC;
BCDB:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
SEG:INOUT STD_LOGIC_VECTOR(3 DOWNTO 0);
LED: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END TEST;
结构体和变量说明
ARCHITECTURE TEST_ARCH OF TEST IS
SIGNAL ZERO:STD_LOGIC;
SIGNAL COUNTA:STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL COUNTC:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTD:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL BCD:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUNTR:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL COUNTL:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL CLKK:STD_LOGIC;
SIGNAL CLKC:STD_LOGIC;
SIGNAL CLKD:STD_LOGIC;
SIGNAL CLKI:STD_LOGIC;
SIGNAL STATL:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL OUTL,STATT:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL FLAGL,FLAGR,R,JIA,STOP:STD_LOGIC;
时钟元件
COMPONENT CLK IS
PORT(CLKOUT:INOUT STD_LOGIC);
END COMPONENT;
BEGIN主程序体
LED(0)<=NOT CLR; 指示灯
LED(1)<=NOT JIA;
LED(2)<=NOT STOP;
LED(3)<='0' WHEN OUTL="10"ELSE '1';
BEEP<='1'WHEN ( CLL='1' OR CLR='1')ELSE '0';响声
U1:CLK PORT MAP(CLKK); 时钟输入
FB: PROCESS(CLKK,COUNTA,COUNTC,COUNTD) 计数器
BEGIN
IF(CLKK='1'AND CLKK'EVENT)THEN
COUNTA<=COUNTA+1;
END IF;
END PROCESS;
P34:PROCESS( COUNTA) 四选一输出
BEGIN
CASE COUNTA(9 DOWNTO 8) IS
WHEN"00"=>SEG<="1110";BCD<=COUNTC;POINT<='1';
WHEN"01"=>SEG<="1101";BCD(2 DOWNTO 0)<=COUNTD;BCD(3)<='0';POINT<='0';
WHEN"10"=>SEG<="1011";BCD<="0000";POINT<='1';
WHEN OTHERS=>SEG<="0111";BCD<="0000";POINT<='0';
END CASE;
CLKI<=COUNTA(12);
END PROCESS;
选择不同的速率
CLKC<=COUNTA(15) WHEN STATT="00"ELSE
COUNTA(14) WHEN STATT="01"ELSE
COUNTA(13) WHEN STATT="10"ELSE
COUNTA(12) ; 速度指示
LED(7 DOWNTO 4)<="1110"WHEN STATT="00"ELSE
"1101"WHEN STATT="01"ELSE
"1011"WHEN STATT="10"ELSE
"0111"; 模60计数
P1:PROCESS(CLKC,COUNTC)
BEGIN
IF(ZERO='1' AND STOP='0')THEN
COUNTC<="0000";
ELSE
IF(CLKC='0' AND CLKC'EVENT)THEN
IF(STOP='1')THEN
IF(JIA='1')THEN
IF(COUNTC=9 )THEN COUNTC<="0000";ELSE COUNTC<=COUNTC+1;END IF;
ELSE
IF(COUNTC=0 )THEN COUNTC<="1001";ELSE COUNTC<=COUNTC-1;END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
CLKD<='1'WHEN (COUNTC(3)='0') XOR (JIA='1') AND STOP='1' ELSE '0';
P2:PROCESS(CLKD,COUNTD)
BEGIN
IF(ZERO='1' AND STOP='0')THEN
COUNTD<="000";
ELSE
IF(CLKD='0' AND CLKD'EVENT)THEN
IF(JIA='1')THEN
IF(COUNTD=5)THEN COUNTD<="000";ELSE COUNTD<=COUNTD+1;END IF;
ELSE
IF(COUNTD=0)THEN COUNTD<="101";ELSE COUNTD<=COUNTD-1;END IF;
END IF;
END IF;
END IF;
END PROCESS;
键盘输入
P5:PROCESS(CLKI,CLL,CLR)
BEGIN
S1
IF(CLKI='1' AND CLKI'EVENT)THEN
IF(COUNTL="000")THEN
IF(CLL=‘1’) THEN
OUTL<="00";
COUNTL<=COUNTL+1;
END IF;
ELSIF (COUNTL<7 AND (OUTL="00" OR OUTL="01")) THEN
IF (CLL='0') THEN OUTL<=OUTL+1;COUNTL<="001";
ELSE COUNTL<=COUNTL+1;
END IF;
ELSIF (COUNTL<7 AND OUTL="10") THEN
IF (CLL='1') THEN
STATT<=STATT+1;OUTL<="00"; COUNTL<="111";
ELSE
COUNTL<=COUNTL+1;
END IF;
ELSIF (COUNTL=7) THEN
IF (OUTL="01" OR OUTL="10") THEN STOP<= NOT STOP; END IF;
IF (OUTL="00") THEN STATT<=STATT-1; END IF;
IF (CLL='1') THEN
OUTL<="11";
ELSE
COUNTL<="000"; OUTL<="00";
END IF;
END IF;
--S2
IF (COUNTR=0) THEN
IF (CLR='1') THEN
COUNT<=COUNT+1;
END IF;
ELSIF (COUNTR<6) THEN
IF (CLR=’1’) THEN
COUTNR<=COUNTR+1;
ELSE
COUNTR<=”111”;
ZERO<=’1’;
END IF;
ELSIF (COUNTR=6) THEN
COUNTR<=COUNTR+1;
IF (CLR='1') THEN JIA<=NOT JIA;
ELSE
ZERO<='1';
END IF;
ELSIF (COUNTR=7) THEN
IF (CLR='0') THEN ZERO<='0';COUNTR<=”000”;
ELSE
COUNTR<=COUNTR;
END IF;
END IF;
END PROCESS;
WITH BCD SELECT
BCDB<= "0000110" WHEN "0001", --1 BCD译码
"1011011" WHEN "0010", --2
"1001111" WHEN "0011", --3
"1100110" WHEN "0100", --4
"1101101" WHEN "0101", --5
"1111101" WHEN "0110", --6
"0000111" WHEN "0111", --7
"1111111" WHEN "1000", --8
"1101111" WHEN "1001", --9
"1110111" WHEN "1010", --A
"1111100" WHEN "1011", --B
"0111001" WHEN "1100", --C
"1011110" WHEN "1101", --D
"1111001" WHEN "1110", --E
"1110001" WHEN "1111", --F
"0111111" WHEN OTHERS; --0
END TEST_ARCH;
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2013-08-24 22:32:51
-
2015-11-04 12:05:37
-
2012-12-24 14:54:59
-
2018-10-29 11:56:13
-
2020-11-22 18:03:55
-
2023-01-29 08:59:34
-
2018-11-21 13:51:14
-
2020-10-10 17:53:41
-
2013-11-19 19:16:49
-
2008-10-02 20:18:52
-
2012-12-24 14:56:39
-
2020-09-24 17:46:27
-
2008-10-02 20:25:24
-
2008-11-16 15:58:56
-
2008-07-15 17:42:45
-
2008-10-02 20:51:40
-
2019-12-05 16:21:34
-
2020-09-03 17:21:57
-
2018-12-07 16:44:38
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认