mikrocontroller.net

Forum: FPGA, VHDL & Co. Frage zur Testbench


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich verwende 2 ADCs, die immer abwechselnd digitalisieren (der 1. 
ADC mit der ansteigenden Flanke und der andere ADC mit der abfallenden 
Flanke). Die ADC erzeugen den Datenübertragungstakt

Jetzt möchte ich meine VHDL-Schaltung mit einer Testbench simulieren. 
Den Takt für die Simulation kann ich auch erzeugen. Die beiden Takte 
sollen die gleiche Frequenz besitzen. Zwischen den beiden Takten soll 
ein Phasenversatz von z.B 1ns sein und genau das ist mein Problem. Wie 
kann ich 2 Takte mit der gleichen Frequenz und xns Phasenversatz 
erzeuegen?

Die ist mein Code:

F_INPUT1 : PROCESS
   BEGIN
      ADC_1_CLK <= '1'; wait for 1.25 ns;
      ADC_1_CLK <= '0'; wait for 1.25 ns;
   END PROCESS;

F_INPUT2 : PROCESS
   BEGIN
      ADC_2_CLK <= '0'; wait for 1.25 ns;
      ADC_2_CLK <= '1'; wait for 1.25 ns;
   END PROCESS;

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erste spontane Idee:

F_INPUT1 : PROCESS
   BEGIN
      ADC_1_CLK <= '1'; wait for 1.25 ns;
      ADC_1_CLK <= '0'; wait for 1.25 ns;
   END PROCESS;

F_INPUT2 : PROCESS
variable first: boolean := true;
   BEGIN
      ADC_2_CLK <= '0';
      if first then
         first := false;
         wait for 1 ns;
      end if;
      wait for 1.25 ns;
      ADC_2_CLK <= '1'; wait for 1.25 ns;
   END PROCESS;

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, kann den Beitrag ja nicht editieren.

F_INPUT1 : PROCESS
   BEGIN
      ADC_1_CLK <= '1'; wait for 1.25 ns;
      ADC_1_CLK <= '0'; wait for 1.25 ns;
   END PROCESS;

F_INPUT2 : PROCESS(ADC_1_CLK)
   BEGIN
      ADC_2_CLK <= ADC_1_CLK after 1 ns;
   END PROCESS;

Sorry für den Doppelpost!

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die zweite Lösung sieht deutlich eleganter aus ^^

Jetzt habe ich natürlich noch eine Frage:

Kann ich auch einen kleinen Jitter einbauen? Der Datenclock von beiden 
ADCs ist ja nicht immer konstant, demnach ist der Phasenversatz ja auch 
nicht immer konstant. Kann man dies auch simulieren?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte da noch was ganz ohne Prozesse und so:
signal ADC_1_CLK : std_logic := '0';
signal ADC_2_CLK : std_logic := '0';
:
   ADC_1_CLK <= not ADC_1_CLK after 1.25 ns;
   ADC_2_CLK <= ADC_1_CLK after 1 ns;
:

Autor: hotline (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man die beiden clocks nicht einfach in einem Prozess erzeugen?
F_INPUT1 : PROCESS
   BEGIN
      ADC_1_CLK <= '1';
      wait for 1 ns;
      ADC_2_CLK <= '1';
      wait for 0.25 ns;
      ADC_1_CLK <= '0';
      wait for 1 ns;
      ADC_2_CLK <= '0';
      wait for 0.25 ns;
   END PROCESS;

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Kann ich auch einen kleinen Jitter einbauen?

Ja, das geht. Du musst nur eine Zufallszahl in gewünschter Größe 
erzeugen und dem Delay dazu addieren. So was habe ich auch schon mal 
machen müssen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Matthias

hast Du noch den kleinen Codeausschitt für mich?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lothar eine elegante Lösung :-)

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aeh, dein ADC erzeugt eine Clock mit knapp einem Gigaherz? Respekt!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2* 1,25ns ergibt 2,5ns für eine Periode und das sind immer noch 400MHz, 
also durchaus üblich bei schnellen ADCs.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sind 14Bit Wandler mit 400MHz es gibt auch 12Bit Varianten mit 
500MHz, 550MHz und 1GHz.

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> hast Du noch den kleinen Codeausschitt für mich?

Folgenden Code hatte ich mal geschrieben:
-- Beschreibung
-- Generiert einen verjitterten Clock für Testbenches

library ieee;
use ieee.std_logic_1164.all;
use ieee.math_real.all;

entity jittered_clk_tbmod is
generic
(
   random_initial   : positive -- Jede Zahl an dieser Stelle erzeugt eine andere Random-Folge für den Jitter
);
port
(
   clk_rate         : in  natural;   -- Taktrate in Hz
   clk_dutycycle    : in  real;      -- Typischer Weise 0.5
   clk_jitter       : in  real;      -- max. "clk_dutycycle / 2" oder "(1-clk_dutycycle) / 2"
   -- Ausgang
   clk_out          : out std_logic := '0'
);
end jittered_clk_tbmod;


architecture behavior of jittered_clk_tbmod is

   signal nom_clock     : std_logic;                        -- Nominaler Grundtakt
   signal random_seed1  : positive := random_initial;       -- Hilfssignale für Zufalssignalgenerierung
   signal random_seed2  : positive := random_initial+1;
   signal random_jitter : real     := 0.1;

begin

   nom_clock_proc: process
   begin
      nom_clock <= '0';
      wait for 1 ns;
      nom_clock <= '1' after (0.5 sec / clk_rate) - 1 ns;
      wait for (1.0 sec / clk_rate) - 1 ns;
   end process;

   master_clk_proc: process
      variable vseed1, vseed2 : positive;
      variable vjitter        : real;
   begin
      wait until rising_edge(nom_clock);
      vseed1     := random_seed1;
      vseed2     := random_seed2;
      vjitter    := random_jitter;
      uniform(vseed1, vseed2, vjitter);
      clk_out <= '0';
      clk_out <= '1' after (vjitter * clk_jitter + 0.25) * 1.0 sec / clk_rate;
      wait until falling_edge(nom_clock);
      uniform(vseed1, vseed2, vjitter);
      clk_out <= '0' after (vjitter * clk_jitter + clk_dutycycle - 0.25) * 1.0 sec / clk_rate;
      random_seed1  <= vseed1;
      random_seed2  <= vseed2;
      random_jitter <= vjitter;
   end process;

end behavior;
Vielleicht ist ja was für Dich dabei! Kleine Anpassungen sind bei Deinen 
Taktraten sicherlich nötig. Bei mir ging es damals um vergleichsweise 
langsamere Takte.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Deinen Post ich werde den Code ihn ruhe durchlesen und 
versuchen zu verstehen.

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sebastian

Bist Du schon weiter gekommen?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wurde leider unterbrochen, so das ich die leider noch nicht testen 
konnte, da ich mitte nächster Woche in den Urlaub gehe werde ich es bis 
dahin sicherlich auch nicht schaffen. Ich wered mich danach mit dem 
Problem wieder auseinandersetzen.

Autor: BiBi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bringt ein verjitterter clk in einer Testbench? Jitteranalysen 
müssen so erfolgen, dass man 1) lang term und 2) short term untersucht 
und das geht nur mit deterministischen Werten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.