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

📄 prmtvs_b.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 5 页
字号:
                GlitchData.CurrentValue := GlitchData.SchedValue;                IF (GlitchDelay <= 0 ns) THEN                    IF (NewValue = GlitchData.SchedValue) THEN RETURN; END IF;                    NoGlitchDet := TRUE;                END IF;                 -- Transaction currently scheduled - if glitch already happened            ELSIF GlitchData.GlitchTime <= NOW THEN                GlitchData.CurrentValue := 'X';                OldGlitch := TRUE;                IF (GlitchData.SchedValue = NewValue) THEN                    dly := Minimum( GlitchData.SchedTime-NOW, NewDelay );                END IF;                 -- Transaction currently scheduled (no glitch if same value)            ELSIF (GlitchData.SchedValue = NewValue) AND                  (GlitchData.SchedTime = GlitchData.GlitchTime) AND                  (GlitchDelay <= 0 ns) THEN                NoGlitchDet := TRUE;                Dly := Minimum( GlitchData.SchedTime-NOW, NewDelay );            END IF;                 GlitchData.SchedTime := NOW+Dly;            IF OldGlitch THEN                OutSignal <= NewValue AFTER Dly;            ELSIF NoGlitchDet THEN                GlitchData.GlitchTime := NOW+Dly;                OutSignal <= NewValue AFTER Dly;            ELSE -- new glitch                GlitchData.GlitchTime := GlitchMinTime ( GlitchData.GlitchTime,                                                          NOW+GlitchDelay );                IF (GlitchMode = MessagePlusX) OR                   (GlitchMode = MessageOnly) THEN                    ReportGlitch ( "VitalGlitchOnEvent", OutSignalName,                                   GlitchData.GlitchTime, GlitchData.SchedValue,                                   (Dly + NOW), NewValue,                                   MsgSeverity=>MsgSeverity );                END IF;                IF (GlitchMode = MessagePlusX) OR (GlitchMode = XOnly) THEN                    OutSignal <= 'X' AFTER GlitchData.GlitchTime-NOW;                    OutSignal <=  TRANSPORT NewValue AFTER Dly;                ELSE                    OutSignal <= NewValue AFTER Dly;                END IF;            END IF;            GlitchData.SchedValue := NewValue;        END IF;        RETURN;    END;     ----------------------------------------------------------------------------    PROCEDURE VitalGlitchOnEvent (            SIGNAL   OutSignal        : OUT   std_logic_vector;            CONSTANT OutSignalName    : IN    STRING;            VARIABLE GlitchData       : INOUT GlitchDataArrayType;            CONSTANT NewValue         : IN    std_logic_vector;            CONSTANT NewDelay         : IN    VitalTimeArray;            CONSTANT GlitchMode       : IN    VitalGlitchModeType := MessagePlusX;            CONSTANT GlitchDelay      : IN    VitalTimeArray;            CONSTANT MsgSeverity      : IN    SEVERITY_LEVEL := WARNING    ) IS        ALIAS GlDataAlias  : GlitchDataArrayType(1 TO GlitchData'LENGTH)                                  IS GlitchData;        ALIAS NewValAlias  : std_logic_vector(1 TO NewValue'LENGTH) IS NewValue;        ALIAS GlDelayAlias : VitalTimeArray(1 TO GlitchDelay'LENGTH)              IS GlitchDelay;        ALIAS NewDelAlias  : VitalTimeArray(1 TO NewDelay'LENGTH) IS NewDelay;         VARIABLE Index       : INTEGER := OutSignal'LEFT;        VARIABLE Direction   : INTEGER;        VARIABLE NoGlitchDet : BOOLEAN;        VARIABLE OldGlitch   : BOOLEAN;        VARIABLE Dly, GlDly  : TIME;    BEGIN        IF (OutSignal'LEFT > OutSignal'RIGHT) THEN            Direction := -1;        ELSE            Direction := 1;        END IF;        IF ( (OutSignal'LENGTH /=  GlitchData'LENGTH) OR             (OutSignal'LENGTH /=    NewValue'LENGTH) OR             (OutSignal'LENGTH /=    NewDelay'LENGTH) OR             (OutSignal'LENGTH /= GlitchDelay'LENGTH) ) THEN          VitalError ( "VitalGlitchOnEvent", ErrVctLng, OutSignalName );          RETURN;        END IF;        -- a call to the scalar function cannot be made since the actual         -- name associated with a signal parameter must be locally static      FOR n IN 1 TO OutSignal'LENGTH LOOP        NoGlitchDet := FALSE;        OldGlitch   := FALSE;        Dly := NewDelAlias(n);        -- If nothing to schedule, just skip to next loop iteration        IF NewDelAlias(n) < 0 ns THEN            IF (NewValAlias(n) /=  GlDataAlias(n).SchedValue) THEN                VitalError ( "VitalGlitchOnEvent", ErrNegDel, OutSignalName );            END IF;        ELSE            -- If nothing currently scheduled (i.e. last scheduled             -- transaction already occurred)            IF GlDataAlias(n).SchedTime <= NOW THEN                GlDataAlias(n).CurrentValue := GlDataAlias(n).SchedValue;                IF (GlDelayAlias(n) <= 0 ns) THEN                    -- Next iteration if no change in value                    IF (NewValAlias(n) = GlDataAlias(n).SchedValue) THEN                         Index := Index + Direction;                        NEXT;                     END IF;                     -- since last transaction already occurred there is no glitch                    NoGlitchDet := TRUE;                END IF;            -- Transaction currently scheduled - if glitch already happened            ELSIF GlDataAlias(n).GlitchTime <= NOW THEN                GlDataAlias(n).CurrentValue := 'X';                OldGlitch := TRUE;                IF (GlDataAlias(n).SchedValue = NewValAlias(n)) THEN                    dly := Minimum( GlDataAlias(n).SchedTime-NOW,                                    NewDelAlias(n) );                END IF;            -- Transaction currently scheduled            ELSIF (GlDataAlias(n).SchedValue = NewValAlias(n)) AND                  (GlDataAlias(n).SchedTime = GlDataAlias(n).GlitchTime) AND                  (GlDelayAlias(n) <= 0 ns) THEN                  NoGlitchDet := TRUE;                  Dly := Minimum( GlDataAlias(n).SchedTime-NOW,                                   NewDelAlias(n) );            END IF;            -- update last scheduled transaction            GlDataAlias(n).SchedTime := NOW+Dly;            IF OldGlitch THEN                OutSignal(Index) <= NewValAlias(n) AFTER Dly;            ELSIF NoGlitchDet THEN                -- if no glitch then update last glitch time                 -- and OutSignal(actual_index)                GlDataAlias(n).GlitchTime := NOW+Dly;                OutSignal(Index) <= NewValAlias(n) AFTER Dly;            ELSE   -- new glitch                GlDataAlias(n).GlitchTime := GlitchMinTime (                                                   GlDataAlias(n).GlitchTime,                                                  NOW+GlDelayAlias(n) );                IF (GlitchMode = MessagePlusX) OR                   (GlitchMode = MessageOnly) THEN                    ReportGlitch ( "VitalGlitchOnEvent", OutSignalName,                                   GlDataAlias(n).GlitchTime,                                    GlDataAlias(n).SchedValue,                                   (Dly + NOW), NewValAlias(n),                                    Index, TRUE, MsgSeverity );                END IF;                IF (GlitchMode = MessagePlusX) OR (GlitchMode = XOnly) THEN                    GlDly := GlDataAlias(n).GlitchTime - NOW;                    OutSignal(Index) <= 'X' AFTER GlDly;                    OutSignal(Index) <= TRANSPORT NewValAlias(n) AFTER Dly;                ELSE                    OutSignal(Index) <= NewValAlias(n) AFTER Dly;                END IF;            END IF; -- glitch / no-glitch            GlDataAlias(n).SchedValue := NewValAlias(n);        END IF; -- NewDelAlias(n) < 0 ns        Index := Index + Direction;      END LOOP;        RETURN;    END;    ---------------------------------------------------------------------------    -- ------------------------------------------------------------------------    --  PROCEDURE NAME  :  TruthOutputX01Z    --    --  PARAMETERS      :  table_out - output of table    --                     X01Zout   - output converted to X01Z    --                     err       - true if illegal character is encountered    --    --    --  DESCRIPTION     :  converts the output of a truth table to a valid    --                     std_ulogic    -- ------------------------------------------------------------------------    PROCEDURE TruthOutputX01Z (            CONSTANT TableOut : IN VitalTruthSymbolType;            VARIABLE X01Zout   : OUT std_ulogic;            VARIABLE Err       : OUT BOOLEAN    ) IS        VARIABLE TempOut : std_ulogic;    BEGIN        Err := FALSE;        TempOut := TruthTableOutMap(TableOut);        IF (TempOut = '-') THEN            Err := TRUE;            TempOut := 'X';            VitalError ( "VitalTruthTable", ErrOutSym, To_TruthChar(TableOut));        END IF;        X01Zout := TempOut;    END;    -- ------------------------------------------------------------------------    --  PROCEDURE NAME  :  StateOutputX01Z    --    --  PARAMETERS      :  table_out - output of table    --                     prev_out  - previous output value    --                     X01Zout   - output cojnverted to X01Z    --                     err       - true if illegal character is encountered    --    --  DESCRIPTION     :  converts the output of a state table to a    --                     valid std_ulogic    -- ------------------------------------------------------------------------    PROCEDURE StateOutputX01Z (            CONSTANT TableOut : IN VitalStateSymbolType;            CONSTANT PrevOut  : IN std_ulogic;            VARIABLE X01Zout   : OUT std_ulogic;            VARIABLE Err       : OUT BOOLEAN    ) IS        VARIABLE TempOut : std_ulogic;    BEGIN        Err := FALSE;        TempOut := StateTableOutMap(TableOut);        IF (TempOut = '-') THEN            Err := TRUE;            TempOut := 'X';            VitalError ( "VitalStateTable", ErrOutSym, To_StateChar(TableOut));        ELSIF (TempOut = 'W') THEN            TempOut := To_X01Z(PrevOut);        END IF;        X01Zout := TempOut;    END;    -- ------------------------------------------------------------------------    -- PROCEDURE NAME:  StateMatch    --    -- PARAMETERS    :  symbol       - symbol from state table    --                  in2          - input from VitalStateTble procedure    --                                 to state table    --                  in2LastValue - previous value of input    --                  state        - false if the symbol is from the input    --                                  portion of the table,    --                                 true if the symbol is from the state    --                                  portion of the table    --                  Err          - true if symbol is not a valid input symbol    --                  ReturnValue  - true if match occurred    --    -- DESCRIPTION   :  This procedure sets ReturnValue to true if in2 matches    --                  symbol (from the state table).  If symbol is an edge    --                  value edge is set to true and in2 and in2LastValue are    --                  checked against symbol.  Err is set to true if symbol    --                  is an invalid value for the input portion of the state    --                  table.    --    -- ------------------------------------------------------------------------    PROCEDURE StateMatch (            CONSTANT Symbol       : IN VitalStateSymbolType;            CONSTANT in2          : IN std_ulogic;            CONSTANT in2LastValue : IN std_ulogic;            CONSTANT State        : IN BOOLEAN;            VARIABLE Err          : OUT BOOLEAN;            VARIABLE ReturnValue  : OUT BOOLEAN    ) IS    BEGIN        IF (State) THEN            IF (NOT ValidStateTableState(Symbol)) THEN                VitalError ( "VitalStateTable", ErrStaSym, To_StateChar(Symbol));                Err := TRUE;                ReturnValue := FALSE;            ELSE                Err := FALSE;                ReturnValue := StateTableMatch(in2LastValue, in2, Symbol);            END IF;        ELSE            IF (NOT ValidStateTableInput(Symbol) ) THEN                VitalError ( "VitalStateTable", ErrInpSym, To_StateChar(Symbol));                Err := TRUE;                ReturnValue := FALSE;            ELSE                ReturnValue := StateTableMatch(in2LastValue, in2, Symbol);                Err := FALSE;            END IF;        END IF;    END;    -- -----------------------------------------------------------------------

⌨️ 快捷键说明

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