www.pudn.com > uart_v11.zip > shiftreg.tdf
%//////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// PROJECT: Parametized Shift Register with Asynchronous Load. //
// Keith Willis //
// Copyright © 1998. All Rights Reserved. //
// //
// You may use or distribute this module freely, provided you do not remove this //
// copyright notice or modify the contents of this file. //
// If you have questions or comments, feel free to contact me by email at //
// kcwillis@mech.eng.usyd.edu.au //
// //
// AUTHOR: Keith Willis //
// //
// MODULE: ShiftReg.tdf //
// //
// DESCRIPTION: AHDL File for a Parametized Shift Register with Asynchronous Load. //
// //
// VERSION: 1.0 //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////%
TITLE "Parametized Shift Register with Asynchronous Load";
%////////////////////////////
// USER-DEFINED PARAMETERS //
////////////////////////////%
PARAMETERS
(
WIDTH=1,
SHIFT_MODE="ON",
MSB_FIRST="YES",
SYNCHRONIZER="NO"
);
%/////////////////////
// INPUTS & OUTPUTS //
/////////////////////%
SUBDESIGN ShiftReg
(
CLK : INPUT;
D[(WIDTH-1)..0] : INPUT=GND;
CLEAR : INPUT=GND;
LOAD : INPUT=GND;
ENABLE : INPUT=VCC;
DIN : INPUT=GND;
Q[(WIDTH-1)..0], DOUT : OUTPUT;
)
%/////////////////////////
// VARIABLE DEFINITIONS //
/////////////////////////%
VARIABLE
IF (SYNCHRONIZER=="YES") GENERATE
FF[WIDTH..0] : DFFE;
ELSE GENERATE
FF[(WIDTH-1)..0] : DFFE;
END GENERATE;
%//////////////////
// LOGIC SECTION //
//////////////////%
BEGIN
ASSERT (WIDTH > 0)
REPORT "Value of WIDTH parameter must be greater than 0"
SEVERITY ERROR;
ASSERT !(SHIFT_MODE=="ON" & WIDTH <= 1)
REPORT "Value of WIDTH parameter must be greater than 1 if using Shift Register Mode"
SEVERITY ERROR;
ASSERT !(SHIFT_MODE!="ON" & USED(DIN))
REPORT "DIN is not required if not using Shift Register Mode"
SEVERITY WARNING;
ASSERT !(SHIFT_MODE!="ON" & USED(LOAD))
REPORT "LOAD is not required if not using Shift Register Mode"
SEVERITY WARNING;
FF[].ena=ENABLE;
FF[].clk=CLK;
IF (SHIFT_MODE=="ON") GENERATE
IF (SYNCHRONIZER=="YES") GENERATE
FF[WIDTH].clrn=!(LOAD # CLEAR);
END GENERATE;
FOR i IN 0 TO WIDTH-1 GENERATE
FF[i].prn=!(D[i] & LOAD);
FF[i].clrn=!(!D[i] & LOAD # CLEAR);
END GENERATE;
IF (MSB_FIRST=="YES") GENERATE
IF (SYNCHRONIZER=="YES") GENERATE
FF[0].d=DIN;
FOR i IN 1 TO WIDTH GENERATE
FF[i].d=FF[i-1].q;
END GENERATE;
DOUT=FF[WIDTH].q;
ELSE GENERATE
FF[0].d=DIN;
FOR i IN 1 TO WIDTH-1 GENERATE
FF[i].d=FF[i-1].q;
END GENERATE;
DOUT=FF[(WIDTH-1)].q;
END GENERATE;
ELSE GENERATE
IF (SYNCHRONIZER=="YES") GENERATE
FF[(WIDTH)].d=DIN;
FOR i IN 1 TO WIDTH GENERATE
FF[i-1].d=FF[i].q;
END GENERATE;
DOUT=FF[0].q;
ELSE GENERATE
FF[(WIDTH-1)].d=DIN;
FOR i IN 1 TO WIDTH-1 GENERATE
FF[i-1].d=FF[i].q;
END GENERATE;
DOUT=FF[0].q;
END GENERATE;
END GENERATE;
ELSE GENERATE
FF[(WIDTH-1)..0].d=D[];
FF[].clrn=!CLEAR;
IF (SYNCHRONIZER=="YES") GENERATE
DOUT=FF[WIDTH].q;
ELSE GENERATE
DOUT=FF[(WIDTH-1)].q;
END GENERATE;
END GENERATE;
Q[]=FF[(WIDTH-1)..0].q;
END;