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


von Stefan (Gast)


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).
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

von Christoph db1uq K. (christoph_kessler)


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

von Stefan (Gast)


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.

von Hans (Gast)


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:
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.

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.