mikrocontroller.net

Forum: FPGA, VHDL & Co. Verilog D-FlipFlop


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe mal angefangen mich ein wenig mit Verilog zu beschäftigen.
Also dachte ich mir mal einen D-FlipFlop zu bauen, aber auf Grund von 
Primitiven (mit einfach if-Abfragen ist das ja kein Problem).
module dff(d, c, out1, out2);

  input d;
  input c;
  
  output out1;
  output out2;

  reg out1, out2;

  wire w1, w2, w3, w4;

  always@(posedge c)
  begin
    out1 <= w3;
    out2 <= w4;
  end

  nand n1(w1, d, c);
  nand n2(w2, w1, c);
  nand n3(w3, w1, w4);
  nand n4(w4, w3, w2);

endmodule
`include "mod_flipflop.v"

module test;

  reg d, c;
  wire out1;
  wire out2;

  initial begin
    $monitor("Zeit: %0d d: %0b c: %0b out1: %0b out2: %0b", $time, d, c, out1, out2);
    d = 0;
    c = 0;
    #3 d = 1;
    #1 c = 1;
    #1 c = 0;
    $finish;
  end

  dff dflipflop(d, c, out1, out2);

endmodule

Leider funktionierts nicht so, wie ich es gerne hätte.
Kann mir jemand auf die Sprünge helfen?

Gute Nacht,
Stefan

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier das Verilog-Template für ein Flipflop in Altera Quartus 6.1:

// Quartus Verilog Template
// Clearable flipflop with enable

module flipflop
  (
    input d,
    input clock,
    input clrn,
    input ena,
    output q
  );

  reg q_reg;

  always @ (posedge clock or negedge clrn)
  begin
    if (clrn == 1'b0)
    begin
      q_reg <= 'b0;
    end
    else if (clock == 1'b1)
    begin
      if (ena == 1'b1)
        q_reg <= d;
      end
    end

  assign q = q_reg;

endmodule

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist das auch kein Problem ;)
Nur wie ich geschrieben habe, würde ich das Flipflop gerne auf Grund der 
vorhandenen Gatter sprich NANDs konstruieren, ohne if-else-Zweige.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Simulation läuft das schon (jedenfalls im Xilinx ISE Simulator. 
Hatte gerade keinen vernünftigen zur Hand). Nur, daß du durch den always 
Block eine Verzögerung um einen Takt erhälst. Der erzeugt dir ja schon 
dein gewünschtes D-FlipFlop. Zwar ohne reset, aber das hat deine 
Schaltung ja auch nicht.
Reichen tut da ja schon folgender Code:
  always@(posedge c) begin
     out1 <= c;
     out2 <= ~c;
  end 
Liefert die korrekte Funktion mit weniger Text und ist Synthesefähig. 
Jedenfalls mit ner verlässlichen Timingabschätzung. Die wird es bei 
deiner Version eher nicht geben.

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.