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

共1条 1/1 1 跳转至

第七次作业

菜鸟
2014-12-22 12:50:16     打赏

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

答:在VHDL设计中,给时序电路清0(复位)有两种方法,设Q定义成信号:

方法一:Q<=”000…000”;其中“000…000”反映出信号Q的位宽。

方法二:Q<=(OTHERS=>’0’);其中OTHERS=>’0’不需要给出信号Q的位宽,即可对Q清零。

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 ENTITY CNT10;
ARCHITECTURE BHV 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 ARCHITECTURE BHV; 
 





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(15DOWNTO0)  ;                                                      
             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);
       BEGIN              
          IF RST = '1' THEN CQI:=(OTHERS => '0');--计数器异步复位
         ELSIF LOAD = '1' THEN CQI:=DATA;   --计数器异步复位
         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 跳转至

回复

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