Forum: FPGA, VHDL & Co. VHDL zu Verilog


von Bernd Aicher (Gast)


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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich schreibe den VHDL-Code mal leserlicher um:
1
   SyncP : process(C,R)
2
   begin
3
      if Rising_Edge(C) then
4
         C1S <= CA;
5
         R   <= C1S;
6
      end if;
7
      if (R = '1') then
8
         C1S <= '0';
9
      end if;
10
   end process;
Und jetzt frage ich mich: was soll die Beschreibung sinnvolles machen?

von Bernd Aicher (Gast)


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.

von Bernd Aicher (Gast)


Lesenswert?

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

von Bernd Aicher (Gast)


Lesenswert?

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

von Hans (Gast)


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.
1
always @(posedge c or posedge R) begin
2
   if (R == 1'b1) begin
3
      C1S <= 1'b0;
4
   else begin
5
      C1S <= CA;
6
   end
7
end
8
9
always @(posedge c) begin
10
   R <= C1S;
11
end

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Das Modul stammt auch nicht von mir sondern von ...
Da kommt ein wenig Licht ins Dunkel...
1
entity synchroniser is
2
   port (
3
      C1 : in std_logic;-- Asynchronous signal
4
      C :  in std_logic;-- Clock
5
      O :  out std_logic);-- Synchronised signal
6
end synchroniser;
7
8
architecture Behaviour of synchroniser is
9
   signal C1A : std_logic;
10
   signal C1S : std_logic;
11
   signal R : std_logic;
12
begin
13
   RiseC1A : process(C1,R)
14
   begin
15
      if Rising_Edge(C1) then
16
         C1A <= '1';
17
      end if;
18
      if (R = '1') then
19
         C1A <= '0';
20
      end if;
21
   end process;
22
23
   SyncP : process(C,R)
24
   begin
25
      if Rising_Edge(C) then
26
         if (C1A = '1') then
27
            C1S <= '1';
28
         else C1S <= '0';
29
         end if;
30
         if (C1S = '1') then
31
            R <= '1';
32
         else R <= '0';
33
         end if;
34
      end if;
35
      if (R = '1') then
36
         C1S <= '0';
37
      end if;
38
   end process;
39
   O <= C1S;
40
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

von Harald F. (hfl)


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

von Bernd Aicher (Gast)


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.

von Harald F. (hfl)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.