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

📄 memory_b.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 5 页
字号:
TYPE EdgeSymbolMatchType IS ARRAY (X01,X01,VitalEdgeSymbolType) OF BOOLEAN;-- last value, present value, edge symbolCONSTANT EdgeSymbolMatch : EdgeSymbolMatchType :=    (  'X' =>    ( 'X'=>(                                 OTHERS => FALSE),      '0'=>('N'|'F'|'v'|'E'|'D'|'*' => TRUE, OTHERS => FALSE ),      '1'=>('P'|'R'|'^'|'E'|'A'|'*' => TRUE, OTHERS => FALSE )     ),  '0' =>    ( 'X'=>(    'r'|'p'|'R'|'A'|'*' => TRUE, OTHERS => FALSE ),      '0'=>(                                 OTHERS => FALSE ),      '1'=>(    '/'|'P'|'p'|'R'|'*' => TRUE, OTHERS => FALSE )     ),  '1' =>    ( 'X'=>(    'f'|'n'|'F'|'D'|'*' => TRUE, OTHERS => FALSE ),      '0'=>(    '\'|'N'|'n'|'F'|'*' => TRUE, OTHERS => FALSE ),      '1'=>(                                 OTHERS => FALSE )     )   );-- ----------------------------------------------------------------------------FUNCTION Minimum (  CONSTANT t1, t2 : IN TIME ) RETURN TIME ISBEGIN  IF (t1 < t2) THEN RETURN (t1); ELSE RETURN (t2); END IF;END Minimum;-- ----------------------------------------------------------------------------FUNCTION Maximum (  CONSTANT t1, t2 : IN TIME) RETURN TIME ISBEGIN  IF (t1 < t2) THEN RETURN (t2); ELSE RETURN (t1); END IF;END Maximum;-- ------------------------------------------------------------------------------ FUNCTION:    VitalMemoryCalcDelay-- Description: Select Transition dependent Delay. --              Used internally by VitalMemorySelectDelay.        -- ----------------------------------------------------------------------------FUNCTION VitalMemoryCalcDelay (  CONSTANT NewVal : IN STD_ULOGIC := 'X';  CONSTANT OldVal : IN STD_ULOGIC := 'X';  CONSTANT Delay  : IN VitalDelayType01ZX) RETURN VitalMemoryDelayType IS  VARIABLE Result : VitalMemoryDelayType;BEGIN  CASE Oldval IS  WHEN '0' | 'L' =>    CASE Newval IS      WHEN '0' | 'L' =>        Result.PropDelay := Delay(tr10);      WHEN '1' | 'H' =>        Result.PropDelay := Delay(tr01);      WHEN 'Z' =>        Result.PropDelay := Delay(tr0Z);      WHEN OTHERS =>        Result.PropDelay := Minimum(Delay(tr01), Delay(tr0Z));    END CASE;    Result.OutputRetainDelay := Delay(tr0X);  WHEN '1' | 'H' =>    CASE Newval IS      WHEN '0' | 'L' =>        Result.PropDelay := Delay(tr10);      WHEN '1' | 'H' =>        Result.PropDelay := Delay(tr01);      WHEN 'Z' =>        Result.PropDelay := Delay(tr1Z);      WHEN OTHERS =>        Result.PropDelay := Minimum(Delay(tr10), Delay(tr1Z));    END CASE;    Result.OutputRetainDelay := Delay(tr1X);  WHEN 'Z' =>    CASE Newval IS      WHEN '0' | 'L' =>        Result.PropDelay := Delay(trZ0);      WHEN '1' | 'H' =>        Result.PropDelay := Delay(trZ1);      WHEN 'Z' =>        Result.PropDelay := Maximum(Delay(tr1Z), Delay(tr0Z));      WHEN OTHERS =>        Result.PropDelay := Minimum(Delay(trZ1), Delay(trZ0));      END CASE;      Result.OutputRetainDelay := Delay(trZX);  WHEN OTHERS =>    CASE Newval IS      WHEN '0' | 'L' =>        Result.PropDelay := Maximum(Delay(tr10), Delay(trZ0));      WHEN '1' | 'H' =>        Result.PropDelay := Maximum(Delay(tr01), Delay(trZ1));      WHEN 'Z' =>        Result.PropDelay := Maximum(Delay(tr1Z), Delay(tr0Z));      WHEN OTHERS =>         Result.PropDelay := Maximum(Delay(tr10), Delay(tr01));    END CASE;    Result.OutputRetainDelay := Minimum(Delay(tr1X), Delay(tr0X));  END CASE;  RETURN Result;END VitalMemoryCalcDelay;-- ----------------------------------------------------------------------------FUNCTION VitalMemoryCalcDelay (  CONSTANT NewVal : IN STD_ULOGIC   := 'X';  CONSTANT OldVal : IN STD_ULOGIC   := 'X';  CONSTANT Delay  : IN VitalDelayType01Z) RETURN VitalMemoryDelayType IS  VARIABLE Result : VitalMemoryDelayType;BEGINCASE Oldval IS  WHEN '0' | 'L' =>    CASE Newval IS      WHEN '0' | 'L' => Result.PropDelay := Delay(tr10);      WHEN '1' | 'H' => Result.PropDelay := Delay(tr01);      WHEN OTHERS =>        Result.PropDelay := Minimum(Delay(tr01), Delay(tr10));    END CASE;    Result.OutputRetainDelay := Delay(tr0Z);  WHEN '1' | 'H' =>    CASE Newval IS      WHEN '0' | 'L' => Result.PropDelay := Delay(tr10);      WHEN '1' | 'H' => Result.PropDelay := Delay(tr01);      WHEN OTHERS =>         Result.PropDelay := Minimum(Delay(tr10), Delay(tr01));    END CASE;    Result.OutputRetainDelay := Delay(tr1Z);  WHEN OTHERS =>    Result.PropDelay := Maximum(Delay(tr10),Delay(tr01));    Result.OutputRetainDelay := Minimum(Delay(tr1Z),Delay(tr0Z));  END CASE;  RETURN Result;END VitalMemoryCalcDelay;-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryUpdateInputChangeTime (  VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT;  SIGNAL   InputSignal          : IN STD_LOGIC_VECTOR;  VARIABLE NumBitsPerSubword    : INTEGER) IS  VARIABLE LastInputValue : STD_LOGIC_VECTOR(InputSignal'LENGTH-1 downto 0);  VARIABLE InSignalNorm   : STD_LOGIC_VECTOR(InputSignal'LENGTH-1 downto 0);  VARIABLE ChangeTimeNorm : VitalTimeArrayT(InputSignal'LENGTH-1 downto 0);  VARIABLE BitsPerWord    : INTEGER;BEGIN  LastInputValue := InputSignal'LAST_VALUE;  IF NumBitsPerSubword = DefaultNumBitsPerSubword THEN    BitsPerWord := InputSignal'LENGTH;  ELSE    BitsPerWord := NumBitsPerSubword;  END IF;  FOR i IN InSignalNorm'RANGE LOOP    IF (InSignalNorm(i) /= LastInputValue(i)) THEN      ChangeTimeNorm(i/BitsPerWord) := NOW - InputSignal'LAST_EVENT;    ELSE      ChangeTimeNorm(i/BitsPerWord) := InputChangeTimeArray(i);    END IF;  END LOOP;  FOR i IN ChangeTimeNorm'RANGE LOOP    ChangeTimeNorm(i) := ChangeTimeNorm(i/BitsPerword);  END LOOP;  InputChangeTimeArray := ChangeTimeNorm;  -- for debug purpose only      PrintInputChangeTime(InputChangeTimeArray);END VitalMemoryUpdateInputChangeTime;-- ------------------------------------------------------------------------------ Procedure:   VitalMemoryUpdateInputChangeTime-- Description: Time since previous event for each bit of the input-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryUpdateInputChangeTime (  VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT;  SIGNAL   InputSignal          : IN STD_LOGIC_VECTOR) IS  VARIABLE LastInputValue  : STD_LOGIC_VECTOR(InputSignal'RANGE) ;BEGIN  LastInputValue := InputSignal'LAST_VALUE;          FOR i IN InputSignal'RANGE LOOP    IF (InputSignal(i) /= LastInputValue(i)) THEN      InputChangeTimeArray(i) := NOW - InputSignal'LAST_EVENT;    END IF;  END LOOP;  -- for debug purpose only      PrintInputChangeTime(InputChangeTimeArray);END VitalMemoryUpdateInputChangeTime;-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryUpdateInputChangeTime (  VARIABLE InputChangeTime      : INOUT TIME;  SIGNAL   InputSignal          : IN STD_ULOGIC) ISBEGIN  InputChangeTime := NOW - InputSignal'LAST_EVENT;  -- for debug purpose only      PrintInputChangeTime(InputChangeTime);END VitalMemoryUpdateInputChangeTime;-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryExpandPortFlag (  CONSTANT PortFlag             : IN  VitalPortFlagVectorType;  CONSTANT NumBitsPerSubword    : IN  INTEGER;  VARIABLE ExpandedPortFlag       : OUT VitalPortFlagVectorType) IS  VARIABLE PortFlagNorm : VitalPortFlagVectorType(            PortFlag'LENGTH-1 downto 0) := PortFlag;  VARIABLE ExpandedPortFlagNorm : VitalPortFlagVectorType(            ExpandedPortFlag'LENGTH-1 downto 0);  VARIABLE SubwordIndex : INTEGER;BEGIN  FOR Index IN INTEGER RANGE 0 to ExpandedPortFlag'LENGTH-1 LOOP    IF NumBitsPerSubword = DefaultNumBitsPerSubword THEN      SubwordIndex := 0;    ELSE      SubwordIndex := Index / NumBitsPerSubword;    END IF;    ExpandedPortFlagNorm(Index) := PortFlagNorm(SubWordIndex);  END LOOP;  ExpandedPortFlag := ExpandedPortFlagNorm;                               END VitalMemoryExpandPortFlag;-- ------------------------------------------------------------------------------ Procedure: VitalMemorySelectDelay-- Description : Select Propagation Delay. Used internally by --               VitalMemoryAddPathDelay.-- ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ VitalDelayArrayType01ZX-- ----------------------------------------------------------------------------PROCEDURE VitalMemorySelectDelay (  VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType;  VARIABLE InputChangeTimeArray : IN VitalTimeArrayT;  CONSTANT OutputSignalName     : IN STRING :="";  CONSTANT PathDelayArray       : IN VitalDelayArrayType01ZX;  CONSTANT ArcType              : IN VitalMemoryArcType;  CONSTANT PathConditionArray   : IN VitalBoolArrayT;  CONSTANT OutputRetainFlag     : IN BOOLEAN) IS  VARIABLE InputArrayLow      : INTEGER := 0;  VARIABLE InputArrayHigh     : INTEGER := 0;  VARIABLE DelayArrayIndex    : INTEGER := 0;  VARIABLE NumBitsPerSubWord  : INTEGER := DefaultNumBitsPerSubword;  VARIABLE NewValue           : STD_ULOGIC;  VARIABLE OldValue           : STD_ULOGIC;  VARIABLE OutputLength       : INTEGER := 0;  VARIABLE OutArrayIndex      : INTEGER;  VARIABLE PropDelay          : TIME;  VARIABLE RetainDelay        : TIME;  VARIABLE CurPropDelay       : TIME;  VARIABLE CurRetainDelay     : TIME;  VARIABLE InputAge           : TIME;  VARIABLE CurInputAge        : TIME;  VARIABLE InputChangeTimeNorm  : VitalTimeArrayT(     InputChangeTimeArray'LENGTH-1 downto 0):=InputChangeTimeArray;  VARIABLE DelayArrayNorm  : VitalDelayArrayType01ZX(     PathDelayArray'LENGTH-1 downto 0):= PathDelayArray;  VARIABLE ScheduleDataArrayNorm : VitalMemoryScheduleDatavectorType     (ScheduleDataArray'LENGTH-1 downto 0):= ScheduleDataArray;     -- for debug purpose  VARIABLE debugprop : VitalTimeArrayT(MaxNoInputBits-1 downto 0);  VARIABLE debugretain : VitalTimeArrayT(MaxNoInputBits-1 downto 0);BEGIN  -- for debug purpose  PrintArcType(ArcType);  OutputLength := ScheduleDataArray'LENGTH;          FOR OutBitPos IN 0 to (OutputLength -1) LOOP    NEXT WHEN PathConditionArray(OutBitPos) = FALSE;    NEXT WHEN ((ScheduleDataArrayNorm(OutBitPos).ScheduleValue       = ScheduleDataArrayNorm(OutBitPos).OutputData) AND       (ScheduleDataArrayNorm(OutBitPos).ScheduleTime <= NOW) AND       (OutputRetainFlag = FALSE ));    NewValue := ScheduleDataArrayNorm(OutBitPos).OutputData;    OldValue := ScheduleDataArrayNorm(OutBitPos).LastOutputValue;    PropDelay :=ScheduleDataArrayNorm(OutBitPos).PropDelay;    InputAge := ScheduleDataArrayNorm(OutBitPos).InputAge;    RetainDelay:=ScheduleDataArrayNorm(OutBitPos).OutputRetainDelay;    NumBitsPerSubWord:=ScheduleDataArrayNorm(OutBitPos).NumBitsPerSubWord;    CASE ArcType IS      WHEN ParallelArc =>        InputArrayLow := OutBitPos;        InputArrayHigh :=  OutBitPos;        DelayArrayIndex :=  OutBitPos;      WHEN CrossArc =>        InputArrayLow := 0;        InputArrayHigh := InputChangeTimeArray'LENGTH - 1 ;                      DelayArrayIndex := OutBitPos;       WHEN SubwordArc =>        InputArrayLow := OutBitPos / NumBitsPerSubWord;        InputArrayHigh := OutBitPos / NumBitsPerSubWord;        DelayArrayIndex := OutBitPos +             (OutputLength * (OutBitPos / NumBitsPerSubWord));      END CASE;    FOR i IN InputArrayLow TO InputArrayHigh LOOP      (CurPropDelay,CurRetainDelay) :=         VitalMemoryCalcDelay (          NewValue, OldValue, DelayArrayNorm(DelayArrayIndex)        );      IF (OutputRetainFlag = FALSE) THEN        CurRetainDelay := TIME'HIGH;      END IF;                    -- for debug purpose      debugprop(i) := CurPropDelay;      debugretain(i) := CurRetainDelay;      IF ArcType = CrossArc THEN        DelayArrayIndex := DelayArrayIndex + OutputLength;      END IF;      -- If there is one input change at a time, then choose the      -- delay from that input. If there is simultaneous input       -- change, then choose the minimum of propagation delays        IF (InputChangeTimeNorm(i) < 0 ns)THEN        CurInputAge := TIME'HIGH;      ELSE        CurInputAge := NOW - InputChangeTimeNorm(i);      END IF;                  IF (CurInputAge  < InputAge)THEN        PropDelay := CurPropDelay;        RetainDelay := CurRetainDelay;        InputAge := CurInputAge;      ELSIF (CurInputAge = InputAge)THEN        IF (CurPropDelay < PropDelay) THEN

⌨️ 快捷键说明

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