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!
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?
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.
Hmm also ich habe deinen Code jetzt mal synthetisiert und das Ergbnis ist ein anderes als zuvor.
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 |
> 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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.