mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx Virtex 4 und Clock Regions


Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin noch etwas unbeholfen in Sachen FPGA. Habe bisher einige kleiner
Designs gemacht. Mein Problem ist folgendes:

Ich bekomme von einem ADC einen exteren Takt auf das FPGA. Dieser Takt 
teilt mir mit wann ein neuer Wert auf den parallenen Datenleitungen 
zwischen
ADC und FPGA bereit steht. Diesen Takt habe ich nun über BIO -> BUFR als
lokalen Takt definiert? So richtung oder müssen noch weitere 
Einstellungen
gemacht werden? Ich speichere den Wert zwischen und hole ihn mir mit 
einem
schnelleren globalen Takt Signal in das Hauptdesign (so nenne ich es 
mal).
Das Problem ist das das Register das den ADC Wert enthält, die FFs, 
anscheinend nicht alle in der lokalen Clock Region liegen (Fehler beim 
erstellen des Designs). Dort sind immoment noch einige Counter zum 
Testen mit drinne. Heißt das nun das alle FFs in dieser Region 
verbraucht sind und das Synthesetool sie deswegen wo anderst hin packen 
muss oder muss ich das dem Tool mitteilen das diese FFs in dieser Region 
liegen müssen.

Falls ich irgendwelchen Blödsinn geschrieben habe bitte korrigiert mich. 
Ich habe mich mit dem FPGA Innenleben bisher nur wenig beschäftigt.

Danke für Antworten
mfg

Autor: Der Simulinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du must mit den constraints dafür sorgen, dass die daten rechtzeitig 
drin sind, und konsistent reinkommen. gfs brauchst Du noch ein zwei 
extra Register.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber das problem ist erstmal das das Design nichtz erstellt wird
da einige FFs anscheined nicht in der Clock Region liegen. Wie kann man
das ändern bzw. geht das überhaupt (Clockregion voll). Ich habe im 
Virtex 4 user guide leider nichts über die Verfügbaren resourcen in so 
einer
Clock Region gefunden.

mfg

Autor: Simon D. (simon86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter schrieb:
> ADC und FPGA bereit steht. Diesen Takt habe ich nun über BIO -> BUFR als
> lokalen Takt definiert? So richtung oder müssen noch weitere
> Einstellungen
> gemacht werden? Ich speichere den Wert zwischen und hole ihn mir mit
> einem
> schnelleren globalen Takt Signal in das Hauptdesign (so nenne ich es
> mal).

Hallo... Normalerweise ist die Reihenfolge IBUF -> BUFIO -> mit diesem 
Clock kannst du dann die IOLogic Flip FLops betreiben wie z.B. IDDRs -> 
BUFR -> FPGA Fabric (regional clock)...

Der Regional Clock kann seine Region und die benachbarten erreichen - 
dem entsprechend sollte da schon einiges rein passen...

Wie schnell und mit welcher Breite kommen die Daten in den FPGA?? Hast 
du Timing Constraints gesetzt??

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also das ganze ist etwas kompliziert. Das Design läuft auf einem
Sundance Board (SMT368 mit Virtex 4 FPGA).
Ich habe mir das so gedacht:

ADC CLK        | Global clk
------------------------------------
ADC_DATA --> FIFO --> Hauptdesign

ist alles noch nicht implementuiert. Ich bekomme aber je nach dem was
ich gerade programmiert habe folgende Fehlermeldung:
---------------------------------------------------------
FATAL INTERNAL ERROR: FPGA library: Place:905 - Components driven by 
Regional clock net <I_top/INST0_ADC_CLK_IN_clk_out> can't be placed and 
routed because location constraints are causing the clock region rules 
to be violated. Regional Clock net <I_top/INST0_ADC_CLK_IN_clk_out> is 
being driven by BUFR <I_top/INST0_ADC_CLK_IN/BUFR_CHA> locked to site 
"BUFR_X1Y7"
Because of this location contraint, <I_top/INST0_ADC_CLK_IN_clk_out> can 
only drive clock regions "CLOCKREGION_X1Y4, CLOCKREGION_X1Y3, 
CLOCKREGION_X1Y2".
The following components driven by <I_top/INST0_ADC_CLK_IN_clk_out> have 
been locked to sites outside of these clock regions:
I_top/INST1_adc_read/x_chan_out_0.Data_27 (Locked Site: ILOGIC_X2Y61 
CLOCKREGION_X1Y1)
Please evaluate the location constraints of both the BUFR and the 
components driven by <I_top/INST0_ADC_CLK_IN_clk_out> to ensure that 
they follow the clock region rules of the architecture. For more 
information on the clock region rules, please refer to the architecture 
user's guide.
------------------------------------------------------------------------ 
--

Ich steige da nicht durch. Diese Fehlermeldung (mit anderen Instancen, 
je nach dem wie programmiert) kommt halt immer.
Die Instancen die eigentlich auf einem andern (Global CLK) laufen. Also 
die FIFO auslesen erscheinen da halt. Warum, die haben doch nichts mehr 
mit dieser Clockregion zu tun??

Bin für jede hilfe dankbar.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hier nochmal alles etwas genauer. Mein Code bisher:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
library diamond;
use diamond.chan_pkg.all;

entity adc_read is
    port (
     -- @Diamond3L Begin@
     -- Do not alter the contents of the block between the begin and end tags.
     x_chan_in_0    : IN  X_chan_t;   --port not named  
     y_chan_in_0    : OUT Y_chan_t;   --port not named  
     x_chan_out_0   : OUT  X_chan_t;   --ADC_OUT 
     y_chan_out_0   : IN   Y_chan_t;   --ADC_OUT 
     -- @Diamond3L End@

  ADCA_DATA_CLK : in std_logic;          -- ADC Clock IN vom ADC
  ADCA_DATA : in std_logic_vector (13 downto 0);  -- ADC CHA
  ADCB_DATA : in std_logic_vector (13 downto 0);   -- ADC CHB
  
  LED : out std_logic;              
  
     -- The following signals are always required for a task
     clk           : IN  std_logic;
     rst           : IN  std_logic;
     ce            : IN  std_logic;
     ce_clr        : IN  std_logic
     -- Do not add any ports after this point
   );
end adc_read;

architecture arch_adc_read of adc_read is

     -- @Diamond3L Alias Begin@
     -- Do not alter the contents of the block between the begin and end tags.
     alias ADC_OUT_x : X_chan_t is x_chan_out_0;
     alias ADC_OUT_y : Y_chan_t is y_chan_out_0;
     -- @Diamond3L Alias End@

  component BUFIO is
    port(
        I : in std_logic;
      O : out std_logic
      );
   end component;
    
   component BUFR
    port(
      I : in std_logic;
      CE : in std_logic;
      CLR : in std_logic;
      O : out std_logic
      );
    end component;
  signal temp_clk : std_logic;  -- Zum Verbinden von BUFIO-->BUFR

  signal counter : integer range 0 to 7500000 := 0;  -- Counter für LED
  
  signal sample_count : integer range 0 to 15 := 0;    -- Counter für Samples
  signal sample_count_pre : integer range 0 to 15 := 0;  -- Zum vergleich mit sample_count 
  signal sample : std_logic_vector (31 downto 0);      -- Zwischenspeicher für beide ADC Channels
  signal sample_rdy : std_logic;              -- if (sample_count != sample_count_pre)
  
  signal write : std_logic;    -- zur Kommunikation mit anderen Tasks (entity) Sundance 3L Diamond
  
  signal LED_OUT : std_logic;
  
  signal adc_clk : std_logic;    -- internes Clock Signal nach BUFR
begin

   
  -- erzeugen des interen adc_clk ----------------------------------
  BUFIO_CHA:BUFIO port map(I=>ADCA_DATA_CLK, O=>temp_clk);
  BUFR_CHA: BUFR port map(I=>temp_clk, CE=>'0', CLR=>'0', O=>adc_clk);
     ------------------------------------------------------------------
     
     ---- für Sundance bzw. 3L Diamond kommunikation ------------------
     y_chan_in_0.ready  <= '1';      -- assume channel is ready
  ADC_OUT_x.validwords <= "01";    -- 32 Bit Word 
  ADC_OUT_x.write <= write;    
  -------------------------------------------------------------------
  
  LED <= LED_OUT;
  
  -- auslesen der ADC Channels mit adc_clk --------------------------
  -- Speichern in Signal sample -------------------------------------
  process(adc_clk)
  begin
    if rising_edge(adc_clk) then
      -- LED Blink ---------------------------------
      counter <= counter + 1;
      if counter = 7500000 then
         LED_OUT <= LED_OUT xor '1';
      end if;
      ----------------------------------------------
      -- Read both ADC Channels --------------------
      sample_count <= sample_count + 1;
      sample <= conv_std_logic_vector(sample_count,4) & ADCB_DATA & ADCA_DATA;
      ---------------------------------------------- 
    end if;
  end process;
  -------------------------------------------------------------------
  
  -- prüfen ob neues Sample angekommen ist --------------------------
  process(sample_count, sample_count_pre)
  begin
    if sample_count = sample_count_pre then
      sample_rdy <= '0';
    else
      sample_rdy <= '1';
    end if;
  end process;
  --------------------------------------------------------------------
  
  -- Auslesen des Registers (Signal) sample mit clk (Global CLK) -----
  -- Senden der Daten zum anderen Task mit Sundance bzw. 3L Diamond
  -- Kommunikations Channel
  process(clk)
  begin
    if rising_edge(clk) then
      if sample_rdy = '1' then
        sample_count_pre <= sample_count;
        if ADC_OUT_y.ready = '1' and write = '0' then
          ADC_OUT_x.data(31 downto 0) <= sample;
          ADC_OUT_x.data(63 downto 32) <= (others => '0');
          write <= '1';
        end if;
        if write = '1' then
          write <= '0';
        end if;
      end if;
    end if;
  end process;
  --------------------------------------------------------------------
  
end arch_adc_read;

Die Fehlermeldung die ich nun bekomme sieht so aus:
----------------------------------------------------
FATAL INTERNAL ERROR: FPGA library: Place:905 - Components driven by 
Regional clock net <I_top/INST0_adc_read/adc_clk> can't be placed and 
routed because location constraints are causing the clock region rules 
to be violated. Regional Clock net
<I_top/INST0_adc_read/adc_clk> is being driven by BUFR 
<I_top/INST0_adc_read/BUFR_CHA> locked to site "BUFR_X1Y7"

Because of this location contraint, <I_top/INST0_adc_read/adc_clk> can 
only drive clock regions "CLOCKREGION_X1Y4, CLOCKREGION_X1Y3, 
CLOCKREGION_X1Y2". The following components driven by
<I_top/INST0_adc_read/adc_clk> have been locked to sites outside of 
these clock regions:
I_top/INST0_adc_read/sample<27> (Locked Site: ILOGIC_X2Y61 
CLOCKREGION_X1Y1)
Please evaluate the location constraints of both the BUFR and the 
components driven by <I_top/INST0_adc_read/adc_clk> to ensure that they 
follow the clock region rules of the architecture. For more information 
on the clock region rules, please refer to the architecture user's 
guide.
------------------------------------------------------------------------ 
-

Warum wird denn Sample(27) nicht in die richtige clk_domain gepackt ???
Also adc_clk.

mfg

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.