www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Tapped-Carry-Chain in VHDL


Autor: Christian M. (charlie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich beschäftige mich seit kurzem wieder mit FPGA's (Virtex 5) und habe 
dazu eine Frage: Ich möchte eine Tapped-Carry-Chain realisieren, wie sie 
in auf FPGA basierten Time-to-Digital Konverter eingesetzt werden kann. 
Das Ganze ist im Prinzip nichts weiter als ein n-Bit Carry-Ripple 
Addierwerk, das asynchron zum restlichen Design

sum = 11...1 + 00...0x

berechnet. x ist dabei die Triggerleitung. Die Summe wird bei steigender 
Taktflanke in FF's geladen. Das Synthese-Tool (XST) muss die Berechnung 
als Carry-Ripple Addierer realisieren, weil die Multiplexerlaufzeiten 
der Carry-Chain (zwischen den LUT's/CLB's) gezählt werden soll. Und 
genau das ist das Problem: für x = 0 ist die Summe 11...1 und bei x = 1 
entsprechend 00...0. Dementsprechend wird der Addierer wegoptimiert und 
durch einen Inverter ersetzt.

Wenn man einen der Summanden variabel lässt, kann man das Problem 
umgehen aber das ist keine saubere Lösung... equivalent_register_removal 
und keep-Statements brachten (bisher) leider nicht das erhoffte 
Ergebnis, der Trick, wie er in 
http://www.fpgarelated.com/usenet/fpga/show/13535-1.php eingesetzt wird, 
ebenfalls nicht. Anschließend etwas Code. Die FDC's sollten den Trick 
aus dem vorhergehenden Link darstellen:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity carry_chain_example is 

  generic(width : integer := 16); -- Width of Component, number of stages
  port (reset_not : in std_logic;
      clock : in std_logic;
      tdc_in : in std_logic;
      output : out std_logic_vector((width-1) downto 0));
      
end carry_chain_example;

architecture Arch of carry_chain_example is

-- Components 
  component FDC -- Rising edge FF
    port (d, c, clr : in std_logic;
        q : out std_logic );
  end component;

-- Signals
  signal sum : std_logic_vector((width-1) downto 0);
  signal sum_reg : std_logic_vector((width-1) downto 0);
  signal reset : std_logic;
  signal all_ones : std_logic_vector((width-1) downto 0);
  signal all_zeros : std_logic_vector((width-1) downto 1);

-- Attributes
  attribute box_type : string;
  attribute box_type of FDC : component is "black_box";
  
  attribute keep : string;
  attribute keep of sum : signal is "true";
  --attribute keep of all_ones : signal is "true";
  --attribute keep of all_zeros : signal is "true";

  begin

-- Component instantiations
    FDC_All:
    for i in 0 to (width-1) generate
      FDC_One: FDC port map (  c => clock,
                      d => sum(i),
                      clr => reset,
                      q => sum_reg(i));
    end generate;


  --  process begin
  --    wait until rising_edge(clock);
  --    output <= sum;
  --  end process;

-- Concurrent statements
    all_ones <= (others => '1');
    all_zeros <= (others => '0');
    sum <= all_ones + (all_zeros & tdc_in );
    reset <= not reset_not;
    output <= sum_reg;

end Arch;

Hat eventuell jemand eine Idee/die Lösung, wie man das Synthese-Tool 
dazu zwingen kann, den Addierer beizubehalten? Ich verwende übrigens 
Xilinx ISE 12.2.

Gruß

Autor: CLB Friend (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

statt nur die FFs von Hand zu generieren: Generiere doch statt
dessen einfach die komplette Kette inkl. LUT6s, CARRY4s und FFDs.
Die Verdrahtung ist relativ einfach, bei Problemen kannst du ja
einfach mal einen Adder synthetisieren und die Schaltung in
PlanAhead oder FPGA-Editor anschauen. Und damit in deinem Fall
nichts wegoptimiert wird, musst du z.B. alle Signale ziwschen
CARRY4s und FFDs mit KEEP=TRUE versehen.

Evtl. muss du alle LUT6s, CARRY4s und FFDs noch mit RLOC Constraints
positionieren, wegen den CARRY4s ist dass aber glaube ich überflüssig.


Gruss

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe so etwas mit einem anderen Baustein realisiert.
Versuche mal mit dem Begriff "puls catch" was zu finden.

Autor: Christian M. (charlie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

vielen Dank für die Antworten und Ratschläge.

@CLB Friend: Warum ich diese Möglichkeit nicht gleich versucht habe, 
kann ich nicht sagen aber es funktioniert tatsächlich wir du geschrieben 
hast. Ich habe als einfachen Test einzelne Carry4's und Fdc's 
miteinander "verdrahtet" und das reicht schon aus, um die gewünschte 
Tapped-Line zu generieren. Die Belegungen der LUT's kann man dem 
Synthese-Tool überlassen und manuelles Positionieren der einzelnen 
Komponenten war bisher nicht notwendig.

@ René D.: Ich werde nach dem Begriff suchen. Vielleicht ergibt sich 
eine Alternative.

Gruß

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian M.:

Den Addierer-Ansatz hatt ich auch kurz versucht und bin an dem selben 
Punkt wie Du hängengeblieben.

Die Positionierung habe ich mit einer for-generate-Schleife erzeugt. 
Sonst kommt der Placer möglicherweise auf die Idee die Chain zu 
splitten. Und dann sind die Laufzeiten zwischen den Taps noch ungenauer, 
als sie so schon sind.

Testen kann man das Ding übrigens ganz gut mit einem freilaufenden 
Ringszillator (Forumssuhce).

Duke

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.