mikrocontroller.net

Forum: FPGA, VHDL & Co. Lokalisierter Reset


Autor: Voltavi (u) (voltavi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in dem Whitepaper "Get Smart About Reset"
http://www.xilinx.com/support/documentation/white_...
 von Ben Chapman (Xilinx WP272) wird in Figure 7 eine Art 
Schieberegister als Reset Netzwerk beschrieben.

Ich habe versucht diese Schaltung in VHDL nachzubilden um sie dann für 
mein Design einzusetzen. Der Code ist der folgende:
entity extended_fifo_reset is
   Generic  (NUM_FFS : POSITIVE :=5);
    Port ( clk : in  STD_LOGIC;
           not_asynch_rst : in  STD_LOGIC;
           not_extdt_rst : out  STD_LOGIC);
end extended_fifo_reset;

architecture Behavioral of extended_fifo_reset is

signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0);

begin

SHIFT_REG: process(not_asynch_rst,clk)
begin
  if not_asynch_rst = '0' then sig_SHIFT_REG <= (others => '1');
  elsif clk'event and clk = '1' then 
      sig_SHIFT_REG <= sig_SHIFT_REG(NUM_FFS-2 downto 0) & '0';
  end if;
end process;
not_extdt_rst <= sig_SHIFT_REG(NUM_FFS-1);


end Behavioral;



Im Anhang findet Ihr das Ergebnis der XST Synthese.(Technology 
Schematic)
Wieso baut mir XST da noch ein SRL16 ein. Oder anders gefragt wie 
erkläre ich XST das ich da gerne nur die Preset FFs als Schieberegister 
hätte?

Viele Grüße

Sven

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal den Initialwert noch dazu:
signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0) := (others=>'1');
Denn ein Signal ohne Initialwert wird mit '0' initialisiert. Du willst 
im Reset aber mit '1' loslegen, deshalb nimmt die Synthese die 
zusätzliche Mimik, um die '0' in den ersten 4 Takten sicherzustellen 
:-o

Fazit: "Get Smart About Reset"

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Mach mal den Initialwert noch dazu:
>
> signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0) :=
> (others=>'1');
> 
> Denn ein Signal ohne Initialwert wird mit '0' initialisiert. Du willst
> im Reset aber mit '1' loslegen, deshalb nimmt die Synthese die
> zusätzliche Mimik, um die '0' in den ersten 4 Takten sicherzustellen
> :-o

Ich bin mir nicht sicher ob das reicht um den PowerUp-Wert der FDP auf 
'1' zu ziehen, da im Library Guide steht:

"For FPGA devices, upon power-up, the initial value of this component is 
specified by the INIT attribute. If a
subsequent GSR (Global Set/Reset) is asserted, the flop is 
asynchronously set to the INIT value."

Das verstehe ich so, das man das GSR-Netzwerk nutzen muss (STARTUP-Block 
einbauen) um den Initwert der asynchr. FF zu setzen.

MfG,

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fpga Kuechle schrieb:
> Ich bin mir nicht sicher ob das reicht...
Ich bin auch gespannt ;-)

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
:-0
Habs grad durch ISE 10.1. geleiert (ohne INIT), so wie der Erst-Poster. 
Hab anderes Ergebnis, auch ein unerwartetes.

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  Voltavi,

synthetisiere bitte den von mir oben geposteten Code. Falls wieder so 
ein Konstrukt herauspurzelt, dann liegt es an deinen Synthesetool resp. 
dessen Einstellungen.

Wenn nicht, dann poste bitten den vollen Code (wenns nicht zuviel ist). 
Es könnte sein das das SRL von einem anderen Codeabschnitt stammt und 
die Synthese hat beide beim Nutzen gemeinsamer Ressourcen 
zusammengetröselt.

MfG,

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Hab anderes Ergebnis, auch ein unerwartetes.
Ich bin zutiefst betroffen  :-o
Also kommt jetzt ein Test mit unterschiedlichen Initialwerten.
signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0);
signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0):=(others=>'1');
signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0):=(others=>'0');
Die 9.2 Synthese mit Defaulteinstellungen macht auf den ersten Blick aus 
allen drei Ansätzen das selbe.

Die Verhaltenssimulation (beginnend mit einem inaktiven Reset: 
not_asynch_rst='1') ist natürlich unterschiedlich. Ohne Initwert kommen 
5x 'U', sonst eben '1' bzw '0'. Soweit ist das alles nachvollziehbar.

Die P&R-Simulation zeigt dagegen keine 'U' Werte mehr (logisch). Im den 
ersten beiden Fällen kommt das selbe heraus. Und im dritten Fall werden 
die FFs offenbar auf '0' initialisiert (das war ja so gewünscht), 
deshalb kommen am Anfang nur Nullen heraus.

Zumindest die Initialisierung der FFs mit '1' ohne explizite Angabe 
eines Init-Wertes ist überraschend.

@  Voltavi
Welche Version verwendest du?
Hast du Syntheseoptionen geändert?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Offenbar übernimmt die Synthese den Resetwert aus der Beschreibung. Mit 
einem Code, in dem die Pegel invertiert sind, wird der Initialwert '0' 
genommen (im obigen Beispiel war es ja '1'):
signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0); -- kein Initialwert

begin
SHIFT_REG: process(not_asynch_rst,clk)
begin
  if not_asynch_rst = '0' then sig_SHIFT_REG <= (others => '0'); -- statt '1'
  elsif clk'event and clk = '1' then   
      sig_SHIFT_REG <= sig_SHIFT_REG(NUM_FFS-2 downto 0) & '1'; -- statt '0'
  end if;
end process;
In der P&R-Waveform sieht man hier jetzt von Anfang an die '0'...

Autor: Voltavi (u) (voltavi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,

für Eure tatkräftige Unterstützung.

Für das gepostete Beispiel habe ich ein eigenes Projekt unter ISE 10.1 
erstellt. In diesem Projekt habe ich nichts an den Synthesoptionen 
verändert. Ich müßte allerdings am Montag gleich einmal prüfen ob ISE 
nicht einfach die Syntheseoptionen aus meinen anderen Projekten 
übernommen hat. Den FPGA für den das ganze gebaut wurde mußte ich 
nämlich auch nicht mehr neu Einstellen. Ist übrigens ein Spartan 3 1200E 
-FT256 Speedgrade -4

Zum Thema Initialwert für Signale. Ich verwende sie nur in Testbenches.
Habe bei der ISE bis jetzt auch die Erfahrung gemacht das es sich den 
Initialwert aus der Beschreibung für den Reset holt. Wie es andere 
Synthesetools halten weiß ich nicht. Habe bis jetzt nur mit XST 
gearbeitet.

Darf ich Euch bitten einmal das Technology Schematic von Euren 
beispielen zu posten. Mir geht es da vor allem um den Inhalt im "FDP".

Viele Grüße

Sven

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Voltavi,


1) mir war nicht bekannt, das der XST neuerdings zwei verschiedene 
schematics generiert. Ich habe hier das RTLschematic gepostet, das zeigt 
nur die FF-Kette. Im Technology Schematic taucht dagegen zusätzlich ein 
SRL16 auf. Das ist auch nach dem PlaceAndRoute per FPGA-Editor zu 
finden, scheint also wirklich erzeugt zu werden.

2) Wenn man wirklich weiss, was man an FF benötigt, dann schreibt man 
dies am besten nicht in RTL Beschreibung (wie von Dir), sondern 
instanziert direkt. Die Beschreibung der instanzierbaren Grundelemente 
findet sich bspw. im spartan3_hdl.pdf (Library Guide) im Verz. 
ISE\doc\usenglish\books\docs\spartan3_hdl . Bsp. mit Technology 
Schematic liegt bei.

MfG,

> Vielen Dank,
>
> für Eure tatkräftige Unterstützung.
>
> Für das gepostete Beispiel habe ich ein eigenes Projekt unter ISE 10.1
> erstellt. In diesem Projekt habe ich nichts an den Synthesoptionen
> verändert. Ich müßte allerdings am Montag gleich einmal prüfen ob ISE
> nicht einfach die Syntheseoptionen aus meinen anderen Projekten
> übernommen hat. Den FPGA für den das ganze gebaut wurde mußte ich
> nämlich auch nicht mehr neu Einstellen. Ist übrigens ein Spartan 3 1200E
> -FT256 Speedgrade -4
>
> Zum Thema Initialwert für Signale. Ich verwende sie nur in Testbenches.
> Habe bei der ISE bis jetzt auch die Erfahrung gemacht das es sich den
> Initialwert aus der Beschreibung für den Reset holt. Wie es andere
> Synthesetools halten weiß ich nicht. Habe bis jetzt nur mit XST
> gearbeitet.
>
> Darf ich Euch bitten einmal das Technology Schematic von Euren
> beispielen zu posten. Mir geht es da vor allem um den Inhalt im "FDP".
>
> Viele Grüße
>
> Sven

Autor: dr.schmock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab die Schaltung mal durch direktes Verdrahten der FFs umgesetzt:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

library UNISIM;
use UNISIM.VComponents.all;

entity Make_SyncReset is
  Generic (C_shiftlength : positive := 3);
  Port ( clk : in  STD_LOGIC;
           asynch_rst : in  STD_LOGIC;  -- '1'-active
           synch_rst_out : out  STD_LOGIC);
end Make_SyncReset;

architecture Connectivity of Make_SyncReset is

  signal s_data: std_logic_vector(C_shiftlength+1 downto 0);

begin

s_data(0) <= '0';
synch_rst_out <= s_data(C_shiftlength+1);

Shift_Reg : for i in 0 to C_shiftlength generate
begin
  FDP_inst : FDP
  generic map (
    INIT => '0') -- Initial value of register ('0' or '1')  
  port map (
    C => clk,      -- Clock input
    PRE => asynch_rst,   -- Asynchronous set input
    D => s_data(i),      -- Data input
    Q => s_data(i+1)      -- Data output
  );
end generate;

end Connectivity;

Funktioniert bei mir einwandfrei. Es werden immer (C_shiftlength+1) 
FlipFlops generiert, und C_shiftlength > 0. Auf diese Weise ist sicher, 
dass es immer mindestens 2 FFs sind, damit mindestens einmal geshiftet 
wird und somit der sync.Reset mind. für einen vollen Takt anliegt.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity extended_fifo_reset is
   Generic  (NUM_FFS : POSITIVE :=5);
    Port ( clk : in  STD_LOGIC;
           not_asynch_rst : in  STD_LOGIC;
           not_extdt_rst : out  STD_LOGIC);
end extended_fifo_reset;

architecture Behavioral of extended_fifo_reset is
signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0);
begin
  SHIFT_REG: process(not_asynch_rst,clk)
  begin
    if not_asynch_rst = '0' then sig_SHIFT_REG <= (others => '1');
    elsif clk'event and clk = '1' then 
      sig_SHIFT_REG <= sig_SHIFT_REG(NUM_FFS-2 downto 0) & '0';
    end if;
  end process;
  not_extdt_rst <= sig_SHIFT_REG(NUM_FFS-1);
end Behavioral;
Ich habe das jetzt mit dieser Beschreibung auch mal als Technology 
Schematic ausgeben lassen. Ergebnis siehe Anhang 
(TechSchem_UnInitializedOne.gif).

Das Ergebnis ist das selbe wie bei der manuellen Instantiierung von 
dr.schmock (TechSchem_ManuellInstantiiert.gif): es wird kein SRL16 mit 
hineingezogen, nur die 5 FFs tauchen auf. Allerdings musste ich für 
optisch direkt vergleichbare Ergebnisse noch einen Inverter einbauen 
;-)
    PRE => not asynch_rst,   -- Asynchronous set input

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann die Ergebnisse von Lothar nur so zusammen fassen, das die ISE 
9.2. eine saubere FF-Kette (wie gewünscht) synthesiert, die neuere 
Version 10.1 dagegen parallel dazu ein SRL16 erzeugt. Dieser deutliche 
Unterschied in der Synthese ist mir eine Anfrage bei Xilinx wert.Wenn 
jemand einen Hinweis auf diese Änderung in der Dok etc findet, bitte 
hier posten, andernfalls starte ich diese Woche eine Anfrage (WEB-CASE).

MfG,


Lothar Miller schrieb:
>
> library IEEE;
> use IEEE.STD_LOGIC_1164.ALL;
> use IEEE.NUMERIC_STD.ALL;
> 
> entity extended_fifo_reset is
>    Generic  (NUM_FFS : POSITIVE :=5);
>     Port ( clk : in  STD_LOGIC;
>            not_asynch_rst : in  STD_LOGIC;
>            not_extdt_rst : out  STD_LOGIC);
> end extended_fifo_reset;
> 
> architecture Behavioral of extended_fifo_reset is
> signal sig_SHIFT_REG: std_logic_vector(NUM_FFS-1 downto 0);
> begin
>   SHIFT_REG: process(not_asynch_rst,clk)
>   begin
>     if not_asynch_rst = '0' then sig_SHIFT_REG <= (others => '1');
>     elsif clk'event and clk = '1' then
>       sig_SHIFT_REG <= sig_SHIFT_REG(NUM_FFS-2 downto 0) & '0';
>     end if;
>   end process;
>   not_extdt_rst <= sig_SHIFT_REG(NUM_FFS-1);
> end Behavioral;
> 

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Info,

ich hab den code mit einer neueren Version (11.3) synthetisiert und 
erhalte das gewünschte Ergebnis (ohne SRL). Auf eine Konfrontation mit 
den unterschiedlichen Syntheseergbebissen (9.*+11.3: OK; 10.*: NOK) ging 
der Xilinx-FAE nicht ein. Da eine neuere Version den Fehler nicht zeigt 
hat er es abgelehnt den Code selber zu kompilieren und denn Fall 
nachzustellen. Professionelles Qualitätsmanagment sieht anders aus.

Zusammenfassend lässt sich hierzu sagen:
-die FF's direkt instanziieren
-keine 10.* ISE verwenden und das Syntheseergebnisse per RTL technology 
view überprüfen

MfG,


Fpga Kuechle schrieb:
> Ich kann die Ergebnisse von Lothar nur so zusammen fassen, das die ISE
> 9.2. eine saubere FF-Kette (wie gewünscht) synthesiert, die neuere
> Version 10.1 dagegen parallel dazu ein SRL16 erzeugt. Dieser deutliche
> Unterschied in der Synthese ist mir eine Anfrage bei Xilinx wert.Wenn
> jemand einen Hinweis auf diese Änderung in der Dok etc findet, bitte
> hier posten, andernfalls starte ich diese Woche eine Anfrage (WEB-CASE).

Autor: voltavi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ja die Webcase geschichte. Hab damit auch nur mehr schlechte als gute 
Erfahrungen gemacht.

Gut zu wissen, nur Schade das mein Projekt komplett auf der ISE 10.1 
aufbaut. Kann ich die Bausteine aus der Ise 11.3 auch unter Modelsim XE 
6.3 simulieren???? Haben damals die Lizenz zusammen mit der Ise 10.1 
erworben.
 wenn das funzt dann steig ich sofort auf 11.3 um.

Vielen Dank für die Info Fpga Kuechle .

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu musst du die Libs für die CoreGenerator Bausteine neu kompilieren. 
Dazu hab ich hier letztens schon mal ausführlich geschrieben, wie das 
geht. Allerdings geht die nutzbare Zeilenzahl im ModelSim XE dann immer 
weiter runter und er simuliert dann langsamer.

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wider Erwarten ist doch noch Post von Xilinx eingetrudelt:

-Das Verhalten wird s bestätigt, ISE 10 hat einen Bug so dass es SRL16 
für FF mit asynchronen FF einzubauen versucht. Dazu gibt es einen 
Eintrag in der Datenbank unter CR#479405.

-11.1 und 9.2 sind wie selbst entdeckt OK

-als Workaround kann man das automatische Einsetzen von SRL16 
unterdrücken, entweder global (f. das gesamte Desing) oder lokal:
--global: SRL extract von den XST Optionen abwählen
--local: attribute SHREG_EXTRACT (S. 333 of 
http://www.xilinx.com/support/documentation/sw_man...)
 Code hängt bei.

Das mit dem lokalen Unterbinden scheint mir der passende workaround zu 
sein.

MfG,




Fpga Kuechle schrieb:
> Zur Info,
>
> ich hab den code mit einer neueren Version (11.3) synthetisiert und
> erhalte das gewünschte Ergebnis (ohne SRL). Auf eine Konfrontation mit
> den unterschiedlichen Syntheseergbebissen (9.*+11.3: OK; 10.*: NOK) ging
> der Xilinx-FAE nicht ein. Da eine neuere Version den Fehler nicht zeigt
> hat er es abgelehnt den Code selber zu kompilieren und denn Fall
> nachzustellen. Professionelles Qualitätsmanagment sieht anders aus.
>
> Zusammenfassend lässt sich hierzu sagen:
> -die FF's direkt instanziieren
> -keine 10.* ISE verwenden und das Syntheseergebnisse per RTL technology
> view überprüfen
>
> MfG,
>
>
> Fpga Kuechle schrieb:
>> Ich kann die Ergebnisse von Lothar nur so zusammen fassen, das die ISE
>> 9.2. eine saubere FF-Kette (wie gewünscht) synthesiert, die neuere
>> Version 10.1 dagegen parallel dazu ein SRL16 erzeugt. Dieser deutliche
>> Unterschied in der Synthese ist mir eine Anfrage bei Xilinx wert.Wenn
>> jemand einen Hinweis auf diese Änderung in der Dok etc findet, bitte
>> hier posten, andernfalls starte ich diese Woche eine Anfrage (WEB-CASE).

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das mit dem lokalen Unterbinden scheint mir der passende workaround zu
> sein.
Dazu müsstest du ja dein ganzes Design analysieren, ob es partiell von 
diesem Bug betroffen ist. :-/
Ein Überspringen von auf ISE10 scheint mir der beste Workaround zu 
sein...

BTW:
die geraden Versionen waren noch nie die Stärke von Xilinx.
Oder kennt einer noch die ISE6?  ;-)

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.