?? gray.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 + -