这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 周师电子设计创新社区 » 作业7

共1条 1/1 1 跳转至

作业7

菜鸟
2015-01-04 17:58:35     打赏

5-1 在VHDL设计中,给时序电路清0(复位)有两种不同方法,它们是什么?如何实现?

答:两种方法为同步清零和异步清零。

    同步清零是指与时钟同步,即时钟触发条件满足时检测清零信号是否有效,有效则在下一个时间周期的触发条件下,执行清零。异步清零是清零信号有效时,无视触发脉冲,立即清零。同步清零信号必须在时钟边沿信号到来时,才能实现清零功能。同步复位是指与时钟同步,当复位信号有效之后,出现时钟有效边沿时才对电路模块进行复位操作;而异步复位与时钟信号无关,只要复位信号有效,无论这时时钟信号是什么样,都对电路模块进行复位操作。

5-7 用VHDL设计一个功能类似74LS160的计数器。

LIBRARY IEEE;

  USE IEEE.STD_LOGIC_1164.ALL;

  USE IEEE.STD_LOGIC_UNSIGNED.ALL;

 ENTITY CNT10 IS

  PORT(CLK,RST,EN,LOAD : IN STD_LOGIC;

       DATA : IN  STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数

        DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出

      COUT : OUT STD_LOGIC);        --计数进位输出 END CNT10;

 ARCHITECTURE BEHAV OF CNT10 IS

  BEGIN

   PROCESS(CLK,RST,EN,LOAD)

      VARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0);

    BEGIN

      IF RST='0' THEN Q:=(OTHERS =>'0');   --计数器异步复位

       ELSIF CLK'EVENT AND CLK='1' THEN     --检测时钟上升沿

        IF EN='1' THEN                     --检测是否允许计数或加载(同步使能)

         IF LOAD='0' THEN Q:=DATA;        --允许加载

         ELSE

            IF Q<9 THEN Q:=Q+1; --允许计数,检测是否小于9

            ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零

           END IF;

         END IF;

       END IF;

     END IF;

         IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号

     ELSE COUT<='0';

     END IF;

      DOUT<=Q;              --将计数值向端口输出

   END PROCESS;

 END BEHAV;


 

5-8 给出含有异步清0和计数使能的16位二进制加减可控计数器的VHDL描述。

 

LIBRARY IEEE;

  USE IEEE.STD_LOGIC_1164.ALL;

      USE IEEE.STD_LOGIC_UNSIGNED.ALL;

     ENTITY ADD_SUB_LOAD_16 IS

       PORT (CLK,RST,ADD_EN,SUB_EN,LOAD :  IN STD_LOGIC;                                            DATA :  IN STD_LOGIC_VECTOR(15  DOWNTO  0)  ;                                                 CQ : OUT STD_LOGIC_VECTOR(15  DOWNTO  0)  ;

              COUT : OUT STD_LOGIC);

      END ENTITY ADD_SUB_LOAD_16;

        ARCHITECTURE A_S_16 OF ADD_SUB_LOAD_16 IS

     BEGIN

       PROCESS(CLK,RST,ADD_EN,SUB_EN,LOAD)

          VARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0);

              --VARIABLE LS_LOAD : STD_LOGIC;

       BEGIN              --LS_LOAD:=LOAD;

          IF RST = '1' THEN CQI:=(OTHERS => '0');--计数器异步复位

         ELSIF LOAD = '1' THEN CQI:=DATA;--LS_LOAD:='0';     --计数器异步复位

         ELSIF CLK'EVENT AND CLK='1' THEN    --检测时钟上升沿

           IF ADD_EN='1'THEN    --检测是否允许计数(同步他能)

              IF CQI<16#FFFF# THEN  CQI:=CQI+1;    --允许计数,检测是否小于65535

             ELSE CQI:=(OTHERS => '0');    --大于65535,计数值清零

             END IF;

              IF CQI=16#FFFF# THEN COUT<='1';    --计数大于9,输出进位信号

              ELSE COUT <= '0';

             END IF;

           END IF;

            IF SUB_EN='1'THEN    --检测是否允许计数(同步他能)

              IF CQI>0 THEN  CQI:=CQI-1;    --允许计数,检测是否小于65535

             ELSE CQI:=(OTHERS => '1');    --大于65535,计数值清零

             END IF;

              IF CQI=0 THEN COUT<='1';    --计数大于9,输出进位信号

             ELSE COUT <= '0';

             END IF;

           END IF;

         END IF;

          CQ<=CQI;    --将计数值向端口输出

       END PROCESS;

      END ARCHITECTURE A_S_16;

 

 

 


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]