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

共1条 1/1 1 跳转至

时序电路清零程序

菜鸟
2015-01-09 09:09:32     打赏

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

LIBRARY IEEE;     

USE IEEE.STD_LOGIC_1164.ALL;    

ENTITY DFF1 IS       

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

      Q: OUT STD_LOGIC);    

 END DFF1;     

ARCHITECTURE bhv OF DFF1 IS       

SIGNAL Q1:STD_LOGIC;  --类似于在芯片内部定义一个数据的暂存节点    

  BEGIN        PROCESS (CLK,Q1,RST,EN)      

  BEGIN          IF RST='1' THEN Q1<='0';         

   ELSIF CLK'EVENT AND CLK='1' THEN           IF EN='1' THEN              Q1<=D;

       END IF;         END IF;      

     END PROCESS;        Q<=Q1;    --将内部的暂存数据向端口输出    

   END bhv;

  --2:含同步复位控制的D触发器    

LIBRARY IEEE;     

USE IEEE.STD_LOGIC_1164.ALL;    

ENTITY DFF1 IS       

PORT(CLK,RST,D: IN  STD_LOGIC;                   

     Q: OUT STD_LOGIC);    

     END DFF1;     

ARCHITECTURE bhv OF DFF1 IS     

  SIGNAL Q1:STD_LOGIC;  --类似于在芯片内部定义一个数据的暂存节点    

    BEGIN      

  PROCESS(CLK,Q1,RST)        

    BEGIN           

        IF CLK'EVENT AND CLK='1' THEN            

        IF RST='1' THEN Q1<='0';ELSE Q1<=D;END IF;          

         END IF;      

       END PROCESS;       

       Q<=Q1;    --将内部的暂存数据向端口输出   

 END bhv;  

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 跳转至

回复

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