diff --git a/src/main/java/de/neemann/digital/core/element/Keys.java b/src/main/java/de/neemann/digital/core/element/Keys.java index 7e15b5691..35b04fd96 100644 --- a/src/main/java/de/neemann/digital/core/element/Keys.java +++ b/src/main/java/de/neemann/digital/core/element/Keys.java @@ -52,6 +52,16 @@ public final class Keys { .setComboBoxValues(new Integer[]{2, 3, 4, 5}) .setMin(2); + + /** + * the delay time used by the delay component + */ + public static final Key.KeyInteger DELAY_TIME + = new Key.KeyInteger("delayTime", 1) + .setComboBoxValues(new Integer[]{1, 2, 3, 4, 5}) + .setMin(1) + .setMax(20); + /** * The elements label */ diff --git a/src/main/java/de/neemann/digital/core/wiring/Delay.java b/src/main/java/de/neemann/digital/core/wiring/Delay.java index 337fa9eff..8081a9d96 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Delay.java +++ b/src/main/java/de/neemann/digital/core/wiring/Delay.java @@ -23,12 +23,15 @@ public class Delay extends Node implements Element { */ public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Delay.class, input("in")) .addAttribute(Keys.ROTATE) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .addAttribute(Keys.DELAY_TIME); private final ObservableValue output; private final int bits; + private final int delayTime; private ObservableValue input; - private long value; + private long[] value; + private int pos; /** * Creates a new instance @@ -38,16 +41,37 @@ public class Delay extends Node implements Element { public Delay(ElementAttributes attributes) { bits = attributes.get(Keys.BITS); output = new ObservableValue("out", bits).setPinDescription(DESCRIPTION); + int dt = attributes.get(Keys.DELAY_TIME); + if (dt < 1) + delayTime = 1; + else + delayTime = dt; + + value = new long[delayTime]; } @Override public void readInputs() throws NodeException { - value = input.getValue(); + value[pos] = input.getValue(); + pos++; + if (pos >= delayTime) + pos = 0; } @Override public void writeOutputs() throws NodeException { - output.setValue(value); + output.setValue(value[pos]); + + if (delayTime > 1) { + boolean same = true; + for (int i = 1; i < delayTime; i++) + if (value[0] != value[i]) { + same = false; + break; + } + if (!same) + hasChanged(); + } } @Override diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index da1c73e82..0f3d012bc 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -100,8 +100,7 @@ public class ElementLibrary implements Iterable .add(XOr.DESCRIPTION) .add(XNOr.DESCRIPTION) .add(Not.DESCRIPTION) - .add(LookUpTable.DESCRIPTION) - .add(Delay.DESCRIPTION)) + .add(LookUpTable.DESCRIPTION)) .add(new LibraryNode(Lang.get("lib_io")) .add(Out.DESCRIPTION) .add(Out.LEDDESCRIPTION) @@ -125,10 +124,11 @@ public class ElementLibrary implements Iterable .add(Const.DESCRIPTION) .add(Tunnel.DESCRIPTION) .add(Splitter.DESCRIPTION) - .add(PullUp.DESCRIPTION) - .add(PullDown.DESCRIPTION) .add(Driver.DESCRIPTION) - .add(DriverInvSel.DESCRIPTION)) + .add(DriverInvSel.DESCRIPTION) + .add(Delay.DESCRIPTION) + .add(PullUp.DESCRIPTION) + .add(PullDown.DESCRIPTION)) .add(new LibraryNode(Lang.get("lib_mux")) .add(Multiplexer.DESCRIPTION) .add(Demultiplexer.DESCRIPTION) diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 2526e6248..0e8ca4e3c 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -107,8 +107,9 @@ die Adresse des gewünschten Ausgabewertes fest. Gibt den Wert an der ausgewählten Adresse aus. Verzögerung - Verzögert ein Signal für eine Gatterlaufzeit. In Digital haben alle Gatter die - selbe Gatterlaufzeit. + Verzögert ein Signal für eine einstellbare Anzahl an Gatterlaufzeiten. + Alle übrigen Bauteile in Digital haben genau eine Gatterlaufzeit Verzögerung. + Mit diesem Bauteil lassen sich damit beliebige Laufzeiten realisieren. Eingang für das zu verzögernde Signal. Das um eine Gatterlaufzeit verzögerte Eingangssignal. @@ -998,6 +999,8 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Die Anzahl der Ausgangsbits muss größer sein als die Anzahl der Eingangsbits. Schriftgröße Legt die für diesen Text zu verwendende Schriftgröße fest. + Dauer + Dauer der Verzögerung in Gatterlaufzeiten. Leitung eingefügt. Aus Zwischenablage eingefügt. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 5377ac7c8..bf802408f 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -109,7 +109,9 @@ Returns the stored value at the address set via the inputs. Delay Delays the signal by on propagation delay time. - In Digital all gates have the same propagation delay. + Delays a signal for an adjustable number of gate delays. + All other components in Digital have a gate delay of on propagation delay time. + This component can be used to realize any necessary propagation delay. Input of the signal to be delayed. The input signal delayed by one gate delay time. @@ -989,6 +991,9 @@ The names of the variables may not be unique. The number of output bits must be greater than the number of input bits. Font Size Sets the font size to use for this text. + Duration + Delay time in units of the common gate propagation delay. + Inserted wire. Insert from clipboard. diff --git a/src/test/java/de/neemann/digital/core/basic/DelayTest.java b/src/test/java/de/neemann/digital/core/basic/DelayTest.java index 3e99df343..413f1fa22 100644 --- a/src/test/java/de/neemann/digital/core/basic/DelayTest.java +++ b/src/test/java/de/neemann/digital/core/basic/DelayTest.java @@ -4,6 +4,7 @@ import de.neemann.digital.TestExecuter; import de.neemann.digital.core.Model; import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.element.ElementAttributes; +import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.wiring.Delay; import junit.framework.TestCase; @@ -25,4 +26,35 @@ public class DelayTest extends TestCase { sc.check(2, 2); sc.check(3, 3); } + + + public void testDelayVar() throws Exception { + for (int delayTime = 0; delayTime < 5; delayTime++) { + ObservableValue in = new ObservableValue("in", 1); + + Model model = new Model(); + Delay delay = model.add(new Delay(new ElementAttributes().set(Keys.DELAY_TIME, delayTime))); + delay.setInputs(in.asList()); + assertEquals(1, delay.getOutputs().size()); + ObservableValue out = delay.getOutputs().get(0); + + model.init(); + + in.setValue(0); + model.doStep(); + assertEquals(0, out.getValue()); + + in.setValue(1); + for (int i = 1; i < delayTime; i++) { + assertTrue(model.needsUpdate()); + model.doMicroStep(false); + assertEquals(0, out.getValue()); + } + assertTrue(model.needsUpdate()); + model.doMicroStep(false); + assertEquals(1, out.getValue()); + assertFalse(model.needsUpdate()); + } + } + } \ No newline at end of file