zxj123

zxj123

0个粉丝

92

问答

0

专栏

0

资料

zxj123  发布于  2012-12-24 14:52:36
采纳率 0%
92个问答
3407

多种频率的增减计数器

 
                             多种频率的增减计数器

概要

       本计数器,为模六十计数器,共有四当频率,可增可减,可起可停,并可单击。而这些功能的改变只通过两个按钮来实现。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)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区