Registers is a collection of flipflops and latches. In the opposite to the Examples.Utilities models the Register models are a series of assignments in the algorithm part of the model. The model text is taken nearly identical from the standard logic text.
Extends from Modelica.Icons.Package (Icon for standard packages).
Name | Description |
---|---|
![]() | Edge triggered register bank with reset |
![]() | Edge triggered register bank with high active reset |
![]() | Edge triggered register bank with low active reset |
![]() | Edge triggered register bank with set and reset |
![]() | Edge triggered register bank with high active set and reset |
![]() | Edge triggered register bank with low active set and reset |
![]() | Level sensitive register bank with reset |
![]() | Level sensitive register bank with reset active high |
![]() | Level sensitive register bank with reset active low |
![]() | Level sensitive register bank with set and reset |
![]() | Level sensitive register bank with set and reset, active high |
![]() | Level sensitive register bank with set and reset, active low |
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities
Truth Table for high active reset:
DataIn | Clock | Reset | DataOut | Map |
* | * | U | U | 1 |
* | * | 1 | 0 | 2 |
* | 0-Trns | 0 | NC | 3 |
* | 1-Trns | 0 | DataIn | 3 |
* | X-Trns | 0 | X or U or NC | 3 |
* | * | X | X or U or 0 or NC | 4 |
Truth Table for low active reset:
DataIn | Clock | Reset | DataOut | Map |
* | * | U | U | 1 |
* | * | 0 | 0 | 2 |
* | 0-Trns | 1 | NC | 3 |
* | 1-Trns | 1 | DataIn | 3 |
* | X-Trns | 1 | X or U or NC | 3 |
* | * | X | X or U or 0 or NC | 4 |
* = don't care U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change Clock transition definitions: 1-Trns: 0 -> 1 0-Trns: ~ -> 0 or 1 -> * or X -> X|U or U -> X|U X-Trns: 0 -> X|U or X|U -> 1
Type | Name | Default | Description |
---|---|---|---|
Integer | ResetMap[9] | {1,4,3,2,4,4,3,2,4} | function selection, defaults for high active reset |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | reset | |
input DigitalInput | clock | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DFFR "Edge triggered register bank with reset" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Integer ResetMap[9] = {1, 4, 3, 2, 4, 4, 3, 2, 4} "function selection, defaults for high active reset"; parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width";D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput clock; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; protected Integer clock_flag(start=0); // 0: 0-Transition // 1: rising edge // 2: X-Transition Integer reset_flag(start=1); // 1: output := U // 2: output := 0 // 3: output := -dataInUX // 4: output := U-0X protected D.Interfaces.Logic nextstate[n](start=fill(L.'U',n)); D.Interfaces.Logic next_assign_val[n](start=fill(L.'U',n)); algorithm if change(clock) or change(reset) then if change(clock) then if initial() then clock_flag := T.ClockMap[L.'U',clock]; else clock_flag := T.ClockMap[pre(clock),clock]; end if; end if; reset_flag := ResetMap[reset]; for i in 1:n loop if reset_flag == 1 then nextstate[i] := L.'U'; elseif reset_flag == 2 then nextstate[i] := T.StrengthMap[L.'0', strength]; elseif reset_flag == 3 then if clock_flag == 0 then break; elseif clock_flag == 1 then nextstate[i] := T.StrengthMap[dataIn[i], strength]; else if (next_assign_val[i] == T.StrengthMap[dataIn[i], strength]) or (next_assign_val[i] == L.'U') then break; elseif dataIn[i] == L.'U' then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; end if; elseif reset_flag == 4 then if (next_assign_val[i] == T.StrengthMap[L.'0', strength]) and (dataIn[i] == L.'0' or dataIn[i] == L.'L' or clock_flag == 0) then break; elseif (dataIn[i] == L.'0' or dataIn[i] == L.'L') and (clock_flag == 1) then nextstate[i] := T.StrengthMap[L.'0', strength]; elseif ((next_assign_val[i] == L.'U') and not (clock_flag == 1)) or ((dataIn[i] == L.'U') and not (clock_flag == 0)) then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; end if; end for; end if; next_assign_val := nextstate; dataOut := nextstate;end DFFR;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Clock | Reset | DataOut |
* | * | U | U |
* | * | 1 | 0 |
* | 0-Trns | 0 | NC |
* | 1-Trns | 0 | DataIn |
* | X-Trns | 0 | X or U or NC |
* | * | X | X or U or 0 or NC |
* = don't care U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change Clock transition definitions: 1-Trns: 0 -> 1 0-Trns: ~ -> 0 or 1 -> * or X -> X|U or U -> X|U X-Trns: 0 -> X|U or X|U -> 1
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | reset | |
input DigitalInput | clock | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DFFREG "Edge triggered register bank with high active reset" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Modelica.SIunits.Time tHL=0 "High->Low delay"; parameter Modelica.SIunits.Time tLH=0 "Low->High delay"; parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width"; protected constant Integer ResetMap[9] = {1, 4, 3, 2, 4, 4, 3, 2, 4}; // Function selection by [reset] reading // 1: output := U // 2: output := 0 // 3: output := -dataInUX // 4: output := U-0Xpublic Modelica.Electrical.Digital.Delay.InertialDelaySensitiveVector delay( tHL=tHL, tLH=tLH, n=n); D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput clock; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; D.Registers.DFFR dFFR(n=n, ResetMap=ResetMap, strength=strength); equationconnect(dataOut, dataOut); connect(delay.y, dataOut); connect(dataIn, dFFR.dataIn); connect(dFFR.dataOut, delay.x); connect(clock, dFFR.clock); connect(reset, dFFR.reset); end DFFREG;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Clock | Reset | DataOut |
* | * | U | U |
* | * | 0 | 0 |
* | 0-Trns | 1 | NC |
* | 1-Trns | 1 | DataIn |
* | X-Trns | 1 | X or U or NC |
* | * | X | X or U or 0 or NC |
* = don't care U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change Clock transition definitions: 1-Trns: 0 -> 1 0-Trns: ~ -> 0 or 1 -> * or X -> X|U or U -> X|U X-Trns: 0 -> X|U or X|U -> 1
Extends from DFFREG (Edge triggered register bank with high active reset).
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | reset | |
input DigitalInput | clock | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DFFREGL "Edge triggered register bank with low active reset" extends DFFREG(final ResetMap = {1, 4, 2, 3, 4, 4, 2, 3, 4}); // Function selection by [reset] reading // 1: output := U // 2: output := 0 // 3: output := -dataInUX // 4: output := U-0X;end DFFREGL;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table for high active set and reset
DataIn | Clock | Reset | Set | DataOut | Map |
* | * | * | U | U | 1 |
* | * | U | * | U | 1 |
* | * | * | 1 | 1 | 2 |
* | * | 1 | 0 | 0 | 3 |
* | * | 1 | X | X | 6 |
* | * | X | X | X or U | 4 |
* | * | 0 | X | X or U or 1 or NC | 5 |
* | * | X | 0 | X or U or 0 or NC | 7 |
* | X-Trns | 0 | 0 | X or U or NC | 8 |
* | 1-Trns | 0 | 0 | DataIn | 8 |
* | 0-Trns | 0 | 0 | NC | 8 |
Truth Table for low active set and reset
DataIn | Clock | Reset | Set | DataOut | Map |
* | * | * | U | U | 1 |
* | * | U | * | U | 1 |
* | * | * | 0 | 1 | 2 |
* | * | 0 | 1 | 0 | 3 |
* | * | 0 | X | X | 6 |
* | * | X | X | X or U | 4 |
* | * | 1 | X | X or U or 1 or NC | 5 |
* | * | X | 1 | X or U or 0 or NC | 7 |
* | X-Trns | 1 | 1 | X or U or NC | 8 |
* | 1-Trns | 1 | 1 | DataIn | 8 |
* | 0-Trns | 1 | 1 | NC | 8 |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change Clock transition definitions: 1-Trns: 0 -> 1 0-Trns: ~ -> 0 or 1 -> * or X -> X|U or U -> X|U X-Trns: 0 -> X|U or X|U -> 1
Type | Name | Default | Description |
---|---|---|---|
Integer | ResetSetMap[9, 9] | [1, 1, 1, 1, 1, 1, 1, 1, 1; ... | function selection by [reset, set] reading |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | set | |
input DigitalInput | reset | |
input DigitalInput | clock | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DFFSR "Edge triggered register bank with set and reset" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Integer ResetSetMap[9, 9]=[ 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4] "function selection by [reset, set] reading"; /* Defaults for set and reset are active high */ parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width";D.Interfaces.DigitalInput set; D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput clock; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; protected Integer clock_flag(start=0); // 0: 0-Transition // 1: rising edge // 2: X-Transition Integer reset_set_flag(start=1); // 1: output := U // 2: output := 1 // 3: output := 0 // 4: output := UX // 5: output := -1UX // 6: output := X // 7: output := -0UX // 8: output := -dataInUX D.Interfaces.Logic nextstate[n](start=fill(L.'U',n)); D.Interfaces.Logic next_assign_val[n](start=fill(L.'U',n)); algorithm if change(clock) or change(reset) or change(set) then if change(clock) then if initial() then clock_flag := T.ClockMap[L.'U',clock]; else clock_flag := T.ClockMap[pre(clock),clock]; end if; end if; reset_set_flag := ResetSetMap[reset, set]; for i in 1:n loop if reset_set_flag == 1 then nextstate[i] := L.'U'; elseif reset_set_flag == 2 then nextstate[i] := T.StrengthMap[L.'1', strength]; elseif reset_set_flag == 3 then nextstate[i] := T.StrengthMap[L.'0', strength]; elseif reset_set_flag == 4 then if (next_assign_val[i] == L.'U' and clock_flag <> 1) or (dataIn[i] == L.'U' and clock_flag <> 0) then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; elseif reset_set_flag == 5 then if next_assign_val[i] == T.StrengthMap[L.'1', strength] and (dataIn[i] == L.'1' or dataIn[i] == L.'H' or clock_flag == 0) then break; elseif (dataIn[i] == L.'1' or dataIn[i] == L.'H') and clock_flag == 1 then nextstate[i] := T.StrengthMap[L.'1', strength]; elseif (next_assign_val[i] == L.'U' and clock_flag <> 1) or (dataIn[i] == L.'U' and clock_flag <> 0) then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; elseif reset_set_flag == 6 then nextstate[i] := T.StrengthMap[L.'X', strength]; elseif reset_set_flag == 7 then if next_assign_val[i] == T.StrengthMap[L.'0', strength] and (dataIn[i] == L.'0' or dataIn[i] == L.'L' or clock_flag == 0) then break; elseif (dataIn[i] == L.'0' or dataIn[i] == L.'L') and clock_flag == 1 then nextstate[i] := T.StrengthMap[L.'0', strength]; elseif (next_assign_val[i] == L.'U' and clock_flag <> 1) or (dataIn[i] == L.'U' and clock_flag <> 0) then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; elseif reset_set_flag == 8 then if clock_flag == 0 then break; elseif clock_flag == 1 then nextstate[i] := T.StrengthMap[dataIn[i], strength]; else if next_assign_val[i] == T.StrengthMap[dataIn[i],strength] or next_assign_val[i] == L.'U' then break; elseif (dataIn[i] == L.'U') then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; end if; end if; end for; end if; next_assign_val := nextstate; dataOut := nextstate;end DFFSR;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Clock | Reset | Set | DataOut |
* | * | * | U | U |
* | * | U | * | U |
* | * | * | 1 | 1 |
* | * | 1 | 0 | 0 |
* | * | 1 | X | X |
* | * | X | X | X or U |
* | * | 0 | X | X or U or 1 or NC |
* | * | X | 0 | X or U or 0 or NC |
* | X-Trns | 0 | 0 | X or U or NC |
* | 1-Trns | 0 | 0 | DataIn |
* | 0-Trns | 0 | 0 | NC |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change Clock transition definitions: 1-Trns: 0 -> 1 0-Trns: ~ -> 0 or 1 -> * or X -> X|U or U -> X|U X-Trns: 0 -> X|U or X|U -> 1
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | set | |
input DigitalInput | reset | |
input DigitalInput | clock | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DFFREGSRH "Edge triggered register bank with high active set and reset" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Modelica.SIunits.Time tHL=0 "High->Low delay"; parameter Modelica.SIunits.Time tLH=0 "Low->High delay"; parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width"; protected constant Integer ResetSetMap[9, 9]=[ 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4]; // Function selection by [reset, set] reading, active high;protected D.Delay.InertialDelaySensitiveVector delay( tHL=tHL, tLH=tLH, n=n); D.Registers.DFFSR dFFSR( strength=strength, n=n, ResetSetMap=ResetSetMap); public D.Interfaces.DigitalInput set; D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput clock; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; equationconnect(dFFSR.dataOut, delay.x); connect(set, dFFSR.set); connect(reset, dFFSR.reset); connect(clock, dFFSR.clock); connect(dataIn, dFFSR.dataIn); connect(delay.y, dataOut); end DFFREGSRH;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Clock | Reset | Set | DataOut |
* | * | * | U | U |
* | * | U | * | U |
* | * | * | 0 | 1 |
* | * | 0 | 1 | 0 |
* | * | 0 | X | X |
* | * | X | X | X or U |
* | * | 1 | X | X or U or 1 or NC |
* | * | X | 1 | X or U or 0 or NC |
* | X-Trns | 1 | 1 | X or U or NC |
* | 1-Trns | 1 | 1 | DataIn |
* | 0-Trns | 1 | 1 | NC |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change Clock transition definitions: 1-Trns: 0 -> 1 0-Trns: ~ -> 0 or 1 -> * or X -> X|U or U -> X|U X-Trns: 0 -> X|U or X|U -> 1
Extends from Digital.Registers.DFFREGSRH (Edge triggered register bank with high active set and reset).
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | set | |
input DigitalInput | reset | |
input DigitalInput | clock | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DFFREGSRL "Edge triggered register bank with low active set and reset" extends Digital.Registers.DFFREGSRH(final ResetSetMap=[1,1,1,1,1,1,1,1,1; 1,4,2,7,4,4,2,7,4; 1,6,2,3,6,6,2,3,6; 1,5,2,8,5,5,2,8,5; 1,4,2,7,4, 4,2,7,4; 1,4,2,7,4,4,2,7,4; 1,6,2,3,6,6,2,3,6; 1,5,2,8,5,5,2,8,5; 1, 4,2,7,4,4,2,7,4]); // Function selection by [reset, set] reading;end DFFREGSRL;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table for high active reset:
DataIn | Enable | Reset | DataOut | Map |
* | * | U | U | 1 |
* | * | 1 | 0 | 2 |
* | 0 | 0 | NC | 3 |
* | 1 | 0 | DataIn | 3 |
* | X | 0 | X or U or NC | 3 |
* | U | ~1 | U | 4 |
* | ~U | X | X or U or 0 or NC | 4 |
Truth Table for low active reset:
DataIn | Enable | Reset | DataOut | Map |
* | * | U | U | 1 |
* | * | 0 | 0 | 2 |
* | 0 | 1 | NC | 3 |
* | 1 | 1 | DataIn | 3 |
* | X | 1 | X or U or NC | 3 |
* | U | ~0 | U | 4 |
* | ~U | X | X or U or 0 or NC | 4 |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change
Type | Name | Default | Description |
---|---|---|---|
Integer | ResetMap[9] | {1,4,3,2,4,4,3,2,4} | function selection, defaults for high active reset |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | reset | |
input DigitalInput | enable | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DLATR "Level sensitive register bank with reset" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Integer ResetMap[9] = {1, 4, 3, 2, 4, 4, 3, 2, 4} "function selection, defaults for high active reset"; parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width";D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput enable; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; protected Integer enable_flag(start=0); // 0: low level // 1: high level // 2: unknown // 3: uninitialized Integer reset_flag(start=1); // 1: output := U // 2: output := 0 // 3: output := -UdataIn // 4: output := U-0X D.Interfaces.Logic nextstate[n](start=fill(L.'U',n)); D.Interfaces.Logic next_assign_val[n](start=fill(L.'U',n)); algorithm if enable == L.'1' or enable == L.'H' then enable_flag := 1; elseif enable == L.'0' or enable == L.'L' then enable_flag := 0; elseif enable == L.'U' then enable_flag := 3; else enable_flag := 2; end if; reset_flag := ResetMap[reset]; for i in 1:n loop if reset_flag == 1 then nextstate[i] := L.'U'; elseif reset_flag == 2 then nextstate[i] := T.StrengthMap[L.'0', strength]; elseif reset_flag == 3 then if enable_flag == 0 then break; elseif enable_flag == 3 then nextstate[i] := L.'U'; elseif enable_flag == 1 then nextstate[i] := T.StrengthMap[dataIn[i], strength]; else if next_assign_val[i] == T.StrengthMap[dataIn[i],strength] or next_assign_val[i] == L.'U' then break; elseif dataIn[i] == L.'U' then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; end if; elseif reset_flag == 4 then if enable_flag == 3 or (next_assign_val[i] == L.'U' and enable_flag <> 1) or (dataIn[i] == L.'U' and enable_flag <> 0) then nextstate[i] := L.'U'; elseif next_assign_val[i] == T.StrengthMap[L.'0', strength] and (dataIn[i] == L.'0' or dataIn[i] == L.'L' or enable_flag == 0) then break; elseif (dataIn[i] == L.'0' or dataIn[i] == L.'L') and enable_flag == 1 then nextstate[i] := T.StrengthMap[L.'0', strength]; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; end if; end for; next_assign_val := nextstate; dataOut := nextstate;end DLATR;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Enable | Reset | DataOut |
* | * | U | U |
* | * | 1 | 0 |
* | 0 | 0 | NC |
* | 1 | 0 | DataIn |
* | X | 0 | X or U or NC |
* | U | ~1 | U |
* | ~U | X | X or U or 0 or NC |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | reset | |
input DigitalInput | enable | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DLATREG "Level sensitive register bank with reset active high" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Modelica.SIunits.Time tHL=0 "High->Low delay"; parameter Modelica.SIunits.Time tLH=0 "Low->High delay"; parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width"; protected constant Integer ResetMap[9] = {1, 4, 3, 2, 4, 4, 3, 2, 4}; // Function selection by [reset] reading // 1: output := U // 2: output := 0 // 3: output := -UdataIn // 4: output := U-0Xpublic D.Delay.InertialDelaySensitiveVector delay( tHL=tHL, tLH=tLH, n=n); D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput enable; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; D.Registers.DLATR dLATR(n=n, strength=strength, ResetMap=ResetMap); equationconnect(dataOut, dataOut); connect(delay.y, dataOut); connect(dLATR.dataOut, delay.x); connect(dataIn, dLATR.dataIn); connect(enable, dLATR.enable); connect(reset, dLATR.reset); end DLATREG;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Enable | Reset | DataOut |
* | * | U | U |
* | * | 0 | 0 |
* | 0 | 1 | NC |
* | 1 | 1 | DataIn |
* | X | 1 | X or U or NC |
* | U | ~0 | U |
* | ~U | X | X or U or 0 or NC |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change
Extends from DLATREG (Level sensitive register bank with reset active high).
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | reset | |
input DigitalInput | enable | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DLATREGL "Level sensitive register bank with reset active low" extends DLATREG(final ResetMap = {1, 4, 2, 3, 4, 4, 2, 3, 4}); // Function selection by [reset] reading // 1: output := U // 2: output := 0 // 3: output := -UdataIn // 4: output := U-0Xend DLATREGL;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table for high active set and reset
DataIn | Enable | Reset | Set | DataOut | Map |
* | * | * | U | U | 1 |
* | * | U | ~1 | U | 1 |
* | * | * | 1 | 1 | 2 |
* | * | 1 | 0 | 0 | 3 |
* | * | 1 | X | X | 6 |
* | U | ~1 | ~1 | U | 4,5,7,8 |
* | ~U | X | X | X or U | 4 |
* | ~U | 0 | X | X or U or 1 or NC | 5 |
* | ~U | X | 0 | X or U or 0 or NC | 7 |
* | X | 0 | 0 | X or U or NC | 8 |
* | 1 | 0 | 0 | DataIn | 8 |
* | 0 | 0 | 0 | NC | 8 |
Truth Table for low active set and reset
DataIn | Enable | Reset | Set | DataOut | Map |
* | * | * | U | U | 1 |
* | * | U | ~0 | U | 1 |
* | * | * | 0 | 1 | 2 |
* | * | 0 | 1 | 0 | 3 |
* | * | 0 | X | X | 6 |
* | U | ~0 | ~0 | U | 4,5,7,8 |
* | ~U | X | X | X or U | 4 |
* | ~U | 1 | X | X or U or 1 or NC | 5 |
* | ~U | X | 1 | X or U or 0 or NC | 7 |
* | X | 1 | 1 | X or U or NC | 8 |
* | 1 | 1 | 1 | DataIn | 8 |
* | 0 | 1 | 1 | NC | 8 |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change
Type | Name | Default | Description |
---|---|---|---|
Integer | ResetSetMap[9, 9] | [1, 1, 1, 1, 1, 1, 1, 1, 1; ... | function selection by [reset, set] reading |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | set | |
input DigitalInput | reset | |
input DigitalInput | enable | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DLATSR "Level sensitive register bank with set and reset" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Integer ResetSetMap[9, 9]=[ 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4] "function selection by [reset, set] reading"; /* Defaults for set and reset are active high */ parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width";D.Interfaces.DigitalInput set; D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput enable; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; protected Integer enable_flag(start=0); // 0: low level // 1: high level // 2: unknown // 3: uninitialized Integer reset_set_flag(start=1); // 1: output := U // 2: output := 1 // 3: output := 0 // 4: output := UX // 5: output := U-1X // 6: output := X // 7: output := U-0X // 8: output := -UdataInX D.Interfaces.Logic nextstate[n](start=fill(L.'U',n)); D.Interfaces.Logic next_assign_val[n](start=fill(L.'U',n)); algorithm if enable == L.'1' or enable == L.'H' then enable_flag := 1; elseif enable == L.'0' or enable == L.'L' then enable_flag := 0; elseif enable == L.'U' then enable_flag := 3; else enable_flag := 2; end if; reset_set_flag := ResetSetMap[reset, set]; for i in 1:n loop if reset_set_flag == 1 then nextstate[i] := L.'U'; elseif reset_set_flag == 2 then nextstate[i] := T.StrengthMap[L.'1', strength]; elseif reset_set_flag == 3 then nextstate[i] := T.StrengthMap[L.'0', strength]; elseif reset_set_flag == 4 then if enable_flag == 3 or (next_assign_val[i] == L.'U' and enable_flag <> 1) or (dataIn[i] == L.'U' and enable_flag <> 0) then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; elseif reset_set_flag == 5 then if enable_flag == 3 or (next_assign_val[i] == L.'U' and enable_flag <> 1) or (dataIn[i] == L.'U' and enable_flag <> 0) then nextstate[i] := L.'U'; elseif next_assign_val[i] == T.StrengthMap[L.'1', strength] and (dataIn[i] == L.'1' or dataIn[i] == L.'H' or enable_flag == 0) then break; elseif (dataIn[i] == L.'1' or dataIn[i] == L.'H') and enable_flag == 1 then nextstate[i] := T.StrengthMap[L.'1', strength]; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; elseif reset_set_flag == 6 then nextstate[i] := T.StrengthMap[L.'X', strength]; elseif reset_set_flag == 7 then if enable_flag == 3 or (next_assign_val[i] == L.'U' and enable_flag <> 1) or (dataIn[i] == L.'U' and enable_flag <> 0) then nextstate[i] := L.'U'; elseif next_assign_val[i] == T.StrengthMap[L.'0', strength] and (dataIn[i] == L.'0' or dataIn[i] == L.'L' or enable_flag == 0) then break; elseif (dataIn[i] == L.'0' or dataIn[i] == L.'L') and enable_flag == 1 then nextstate[i] := T.StrengthMap[L.'0', strength]; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; elseif reset_set_flag == 8 then if enable_flag == 0 then break; elseif enable_flag == 3 then nextstate[i] := L.'U'; elseif enable_flag == 1 then nextstate[i] := T.StrengthMap[dataIn[i], strength]; else if next_assign_val[i] == T.StrengthMap[dataIn[i],strength] or next_assign_val[i] == L.'U' then break; elseif dataIn[i] == L.'U' then nextstate[i] := L.'U'; else nextstate[i] := T.StrengthMap[L.'X', strength]; end if; end if; end if; end for; next_assign_val := nextstate; dataOut := nextstate;end DLATSR;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table:
DataIn | Enable | Reset | Set | DataOut |
* | * | * | U | U |
* | * | U | ~1 | U |
* | * | * | 1 | 1 |
* | * | 1 | 0 | 0 |
* | * | 1 | X | X |
* | U | ~1 | ~1 | U |
* | ~U | X | X | X or U |
* | ~U | 0 | X | X or U or 1 or NC |
* | ~U | X | 0 | X or U or 0 or NC |
* | X | 0 | 0 | X or U or NC |
* | 1 | 0 | 0 | DataIn |
* | 0 | 0 | 0 | NC |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | set | |
input DigitalInput | reset | |
input DigitalInput | enable | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DLATREGSRH "Level sensitive register bank with set and reset, active high" import D = Modelica.Electrical.Digital; import L = Modelica.Electrical.Digital.Interfaces.Logic; import S = Modelica.Electrical.Digital.Interfaces.Strength; import T = Modelica.Electrical.Digital.Tables; parameter Modelica.SIunits.Time tHL=0 "High->Low delay"; parameter Modelica.SIunits.Time tLH=0 "Low->High delay"; parameter D.Interfaces.Strength strength = S.'S_X01' "output strength"; parameter Integer n(min=1) = 1 "data width"; protected constant Integer ResetSetMap[9, 9]=[ 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 4, 7, 2, 4, 4, 7, 2, 4; 1, 5, 8, 2, 5, 5, 8, 2, 5; 1, 6, 3, 2, 6, 6, 3, 2, 6; 1, 4, 7, 2, 4, 4, 7, 2, 4]; // Function selection by [reset, set] reading, active high;public D.Delay.InertialDelaySensitiveVector delay( tHL=tHL, tLH=tLH, n=n); D.Interfaces.DigitalInput set; D.Interfaces.DigitalInput reset; D.Interfaces.DigitalInput enable; D.Interfaces.DigitalInput dataIn[n]; D.Interfaces.DigitalOutput dataOut[n]; D.Registers.DLATSR dLATSR(n=n, ResetSetMap=ResetSetMap, strength=strength); equationconnect(dataOut, dataOut); connect(delay.y, dataOut); connect(set, dLATSR.set); connect(reset, dLATSR.reset); connect(enable, dLATSR.enable); connect(dataIn, dLATSR.dataIn); connect(dLATSR.dataOut, delay.x); end DLATREGSRH;
Description in VHDL is given by http://www.cs.sfu.ca/~ggbaker/reference/std_logic/src/std_logic_entities.vhd
Truth Table
DataIn | Enable | Reset | Set | DataOut |
* | * | * | U | U |
* | * | U | ~0 | U |
* | * | * | 0 | 1 |
* | * | 0 | 1 | 0 |
* | * | 0 | X | X |
* | U | ~0 | ~0 | U |
* | ~U | X | X | X or U |
* | ~U | 1 | X | X or U or 1 or NC |
* | ~U | X | 1 | X or U or 0 or NC |
* | X | 1 | 1 | X or U or NC |
* | 1 | 1 | 1 | DataIn |
* | 0 | 1 | 1 | NC |
* = don't care ~ = not equal U = L.'U' 0 = L.'0' or L.'L' 1 = L.'1' or L.'H' X = L.'X' or L.'W' or L.'Z' or L.'-' NC = no change
Extends from Digital.Registers.DLATREGSRH (Level sensitive register bank with set and reset, active high).
Type | Name | Default | Description |
---|---|---|---|
Time | tHL | 0 | High->Low delay [s] |
Time | tLH | 0 | Low->High delay [s] |
Strength | strength | S.'S_X01' | output strength |
Integer | n | 1 | data width |
Type | Name | Description |
---|---|---|
input DigitalInput | set | |
input DigitalInput | reset | |
input DigitalInput | enable | |
input DigitalInput | dataIn[n] | |
output DigitalOutput | dataOut[n] |
model DLATREGSRL "Level sensitive register bank with set and reset, active low" extends Digital.Registers.DLATREGSRH(final ResetSetMap=[1,1,1,1,1,1,1,1,1; 1,4,2,7,4,4,2,7,4; 1,6,2,3,5,5,2,3,6; 1,5,2,8,6,6,2,8,5; 1,4,2,7,4, 4,2,7,4; 1,4,2,7,4,4,2,7,4; 1,6,2,3,5,5,2,3,6; 1,5,2,8,6,6,2,8,5; 1, 4,2,7,4,4,2,7,4]); // Function selection by [reset, set] reading;end DLATREGSRL;