Verilog D-FlipFlop

Gast #1178794
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).
1
module dff(d, c, out1, out2);
2

3
  input d;
4
  input c;
5
  
6
  output out1;
7
  output out2;
8

9
  reg out1, out2;
10

11
  wire w1, w2, w3, w4;
12

13
  always@(posedge c)
14
  begin
15
    out1 <= w3;
16
    out2 <= w4;
17
  end
18

19
  nand n1(w1, d, c);
20
  nand n2(w2, w1, c);
21
  nand n3(w3, w1, w4);
22
  nand n4(w4, w3, w2);
23

24
endmodule
1
`include "mod_flipflop.v"
2

3
module test;
4

5
  reg d, c;
6
  wire out1;
7
  wire out2;
8

9
  initial begin
10
    $monitor("Zeit: %0d d: %0b c: %0b out1: %0b out2: %0b", $time, d, c, out1, out2);
11
    d = 0;
12
    c = 0;
13
    #3 d = 1;
14
    #1 c = 1;
15
    #1 c = 0;
16
    $finish;
17
  end
18

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

21
endmodule

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

Gute Nacht,
Stefan
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
Gast
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.
Gast
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:
1
  always@(posedge c) begin
2
     out1 <= c;
3
     out2 <= ~c;
4
  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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.