www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL zu Verilog


Autor: Bernd Aicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann mir bitte jemand folgenden VHDL Absatz in Verilog übersetzen? Ich 
habe jetzt schon verschiedene Versionen probiert, aber ich erhalte nie 
das gleiche Syntheseergebnis. So ist z.B. oft an Latch dabei und ich 
habe keine Ahnung warum das so ist.

   SyncP : process(C,R)
   begin
      if Rising_Edge(C) then
         if (C1A = '1') then
            C1S <= '1';
         else C1S <= '0';
         end if;
         if (C1S = '1') then
            R <= '1';
         else R <= '0';
         end if;
      end if;

    if (R = '1') then
         C1S <= '0';
      end if;
   end process;

Vielen Dank im Voraus!

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

Bewertung
0 lesenswert
nicht lesenswert
Ich schreibe den VHDL-Code mal leserlicher um:
   SyncP : process(C,R)
   begin
      if Rising_Edge(C) then
         C1S <= CA;
         R   <= C1S;
      end if;
      if (R = '1') then
         C1S <= '0';
      end if;
   end process;
Und jetzt frage ich mich: was soll die Beschreibung sinnvolles machen?

Autor: Bernd Aicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stammt aus einem Modul zum Übertragen von Zahlen per RS232 und nennt 
sich Synchronizer. Ist einer der beiden Prozesse daraus und gibt 
Signale, die asynchron reinkommen Taktsynchron wieder aus.

Autor: Bernd Aicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Modul stammt auch nicht von mir sondern von
http://www.cosmiac.org/spartan3e_tutorials.html

Autor: Bernd Aicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm also ich habe deinen Code jetzt mal synthetisiert und das Ergbnis 
ist ein anderes als zuvor.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sollte das in Verilog funktionieren. Obwohl dieser asynchrone Reset R 
sehr unschön ist und dem ersten Anschein nach auch ohne Probleme 
synchron zum Takt erfolgen könnte.
always @(posedge c or posedge R) begin
   if (R == 1'b1) begin
      C1S <= 1'b0;
   else begin
      C1S <= CA;
   end
end

always @(posedge c) begin
   R <= C1S;
end

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

Bewertung
0 lesenswert
nicht lesenswert
> Das Modul stammt auch nicht von mir sondern von ...
Da kommt ein wenig Licht ins Dunkel...
entity synchroniser is
   port (
      C1 : in std_logic;-- Asynchronous signal
      C :  in std_logic;-- Clock
      O :  out std_logic);-- Synchronised signal
end synchroniser;

architecture Behaviour of synchroniser is
   signal C1A : std_logic;
   signal C1S : std_logic;
   signal R : std_logic;
begin
   RiseC1A : process(C1,R)
   begin
      if Rising_Edge(C1) then
         C1A <= '1';
      end if;
      if (R = '1') then
         C1A <= '0';
      end if;
   end process;

   SyncP : process(C,R)
   begin
      if Rising_Edge(C) then
         if (C1A = '1') then
            C1S <= '1';
         else C1S <= '0';
         end if;
         if (C1S = '1') then
            R <= '1';
         else R <= '0';
         end if;
      end if;
      if (R = '1') then
         C1S <= '0';
      end if;
   end process;
   O <= C1S;
end Behaviour;
Mit diesem Code wird eine steigende Flanke auf C1 in einen Puls auf O 
umgewandelt, der genau für 1 Taktzyklus aktiv ist...

Nur ist das Ganze unglaublich umständlich (und zudem mit asynchronem 
Reset) beschrieben. Kürzer ginge das so:
http://www.lothar-miller.de/s9y/categories/19-SpikePuls

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernd,

so richtig schön ist die Logik nicht modelliert, da muss ich Lothar mal 
wieder Recht geben. Aber Du wolltest die ja nicht in schön, sondern in 
Verilog. Ich meine, das hier müsste stimmen:

module synchroniser
    (
    input   C1,         // asynchronous input signal
    input   C,          // clock
    output  O           // synchronised signal
    );

reg     C1A;            // async storage of rising edge of input C1
reg     C1S;            // synchronized
reg     R;              // local reset

always @(posedge C1, posedge R)
    begin
    if (R == 1)         // reset
        C1A <= 0;
    else                // set on rising edge of input signal C1
        C1A <= 1;
    end

always @(posedge C)
    begin
    C1S <= C1A;         // sync async storage
    R   <= C1S;         // generate reset and suppression signal
    end

assign O = C1S && !R;   // output suppression on 2nd clock cycle

endmodule

Hope that helps!
Harald

Autor: Bernd Aicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke mal an alle!
Also mir geht es hierbei garnicht so darum wie gut/schlecht das Design 
da oben jetzt ist, ich versuche gerade die Gemeinsamkeiten/Unterschiede 
von Verilog und VHDL zu verstehen, daher der Übersetzungsversuch.

@Harald und Hans
Also eure beiden Code lassen sich zwar synthetisieren (nach paar 
Syntakkorrekturen), aber das Ergebnis ist ein anderes als der 
ursprüngliche VHDL Code. Muss die alle mal simulieren um zu schaen ob 
sie das gleiche tun.

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hans,

das hat mir keine Ruhe gelassen mit den Abweichung in der Synthese. 
Dieser Code hier erzeugt die gleiche Logik wie der von Lothar gepostete 
VHDL-Code:

module synchroniser
    (
    input   C1,         // asynchronous input signal
    input   C,          // clock
    output  O           // synchronised signal
    );

reg     C1A;            // async storage of rising edge of input C1
reg     C1S;            // synchronized
reg     R;              // local reset

always @(posedge C1, posedge R)
    begin
    if (R == 1)         // reset
        C1A <= 0;
    else                // set on rising edge of input signal C1
        C1A <= 1;
    end

always @(posedge C, posedge R)
    begin
    if (R == 1)         // reset
        C1S <= 0;
    else
        C1S <= C1A;     // sync async storage
    end

always @(posedge C)
    begin
    R <= C1S;           // generate reset signal
    end

assign O = C1S;

endmodule

Grüße,
Harald

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.