⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gray.tdf

📁 一些vhdl源代码 一些vhdl代码
💻 TDF
字号:
%---------------------------------------------------------------------------
 Description : Gray code counter
 Edit history...
   Date        Engineer  Rev   Changes
   4/24/1997   SBJ       1.0	 Initial stab

 This module implements a variable parameterized width gray code counter.
 ---------------------------------------------------------------------------%

%- constants -%

TITLE "Gray code counter";

%- include files -%

%- parameters -%
PARAMETERS
%---------------------------------------------------------------------------
 LPM_WIDTH           Number of bits in counter output.
 ---------------------------------------------------------------------------%
(
   LPM_WIDTH = 4,
   DEVICE_FAMILY,
   CARRY_CHAIN = "IGNORE",
   CARRY_CHAIN_LENGTH = 32
);

SUBDESIGN gray
%---------------------------------------------------------------------------
 clock               Positive-edge-triggered Clock.
 cnt_en              Count Enable input. Disables count when low (0).
                     Default = 1.
 aclr                Asynchronous Clear input.  Default = 0.
 q[]                 Data output from the counter, LPM_WIDTH wide.
 ---------------------------------------------------------------------------%
(
   clock             : INPUT;
   cnt_en            : INPUT = VCC;
   aclr              : INPUT = GND;
	q[LPM_WIDTH-1..0]	: OUTPUT;
)

VARIABLE
%---------------------------------------------------------------------------
 dd[]                Counter output flip flops.
 dummy               LSB toggle dummy flip flop.
 dcarry[]            Next higher bit "carry" term.
 ---------------------------------------------------------------------------%
   dd[LPM_WIDTH-1..0]        	: DFFE;
   dummy                      : TFFE;
   IF ( ( DEVICE_FAMILY == "FLEX8000" # DEVICE_FAMILY == "FLEX10K" )
      & ( CARRY_CHAIN != "IGNORE" )
      & CARRY_CHAIN_LENGTH > 3 ) GENERATE
      dcarry[LPM_WIDTH-2..0]  : CARRY;
   ELSE GENERATE
      dcarry[LPM_WIDTH-2..0]  : NODE;
   END GENERATE;

BEGIN
   ASSERT LPM_WIDTH > 1
      REPORT "LPM_WIDTH (%) must be greater than 1." LPM_WIDTH   -- %
      SEVERITY ERROR;

--
-- dummy - Just toggle every (enabled) clock.
--
   dummy.clk         = clock;
	IF ( USED( aclr ) ) GENERATE
   	dummy.clrn        = !aclr;
	END GENERATE;
   dummy.ena         = cnt_en;
   dummy.t           = VCC;

--
-- dcarry[] - These are just terms used to simplify the dd[] eqs.
--
   dcarry[0]         = dummy;
   FOR bit in 1 to ( LPM_WIDTH - 2 ) GENERATE
      dcarry[bit]    = dcarry[bit - 1] & !dd[bit - 1];
   END GENERATE;

--
-- dd[] - Flip flops for the counter.  See App Brief 135.
--
   dd[].clk          = clock;
	IF ( USED( aclr ) ) GENERATE
   	dd[].clrn      = !aclr;
	END GENERATE;
   dd[].ena          = cnt_en;
   dd[0]             = !dummy $ q[0];
   FOR bit IN 1 TO ( LPM_WIDTH - 1 ) GENERATE
		IF ( bit < LPM_WIDTH - 1 ) GENERATE
	      dd[bit]     = ( ( dd[bit - 1] & dcarry[bit - 1] )
                       $ dd[bit] );
		ELSE GENERATE
	      dd[bit]     = ( ( ( dd[bit] $ dd[bit - 1] ) & dcarry[bit - 1] )
                       $ dd[bit] );
		END GENERATE;
   END GENERATE;

	q[]					= dd[].q;
END;  %- gray.tdf -%


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -