www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Register Reset-Zustand abhängig von Input-Signal machen


Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich möchte in VHDL (Spartan 3E) ein Register so beschalten, dass der 
Reset-Zustand abhängig von einem Input wird.
Die Implementation des Registers sieht im Moment so aus (hier nur 
Schreib-Teil):
    -- Digital Out Register write
    process(INT_CLK, INT_RESET, INT_DIGITAL_OUT_write, INT_CYCLE_dir, INT_D, INT_CYCLE_WRITE_ACCESS_impuls)
    begin
        if INT_RESET = '1' then
            INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
        else
            if rising_edge(INT_CLK) then
                if INT_DIGITAL_OUT_write = '1' and INT_CYCLE_WRITE_ACCESS_impuls = '1' then
                    -- DIGITAL_OUT
                    INT_DIGITAL_OUT_sig(12 downto 1) <= INT_D(12 downto 0);
                end if;
            end if;
        end if;
    end process;
Hier müsste nun der Reset-Zustand abhängig von INT_DEFAULT_ON (noch 
nicht in der Sensitivity List) gemacht werden, so in der Art:
...
        if INT_RESET = '1' then
            if INT_DEFAULT_ON = '0' then
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
            else
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '1');
            end if;
        else
...
Hintergrund Information:
- Spartan 3E läuft synchron an Mikrocontroller Clock OUT
- Reset des Spartan 3E wird ab Mikrocontroller geschaltet

Fragen:
- Geht das?
- Ist es auch sinnvoll?
- Anforderungen an INT_DEFAULT_ON? Abclocken/synchronisieren?

Falls mein Ansatz für die Katz ist: wie könnte mein Problem sonst gelöst 
werden?

Danke für die Antworten
Gruss, Martin

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin Kohler (mkohler)

>Ich möchte in VHDL (Spartan 3E) ein Register so beschalten, dass der
>Reset-Zustand abhängig von einem Input wird.

Wozu?

>Fragen:
>- Geht das?

Direkt nicht, ggf. mit Tricks.

>- Ist es auch sinnvoll?

Glaube ich kaum.

>- Anforderungen an INT_DEFAULT_ON? Abclocken/synchronisieren?

>Falls mein Ansatz für die Katz ist: wie könnte mein Problem sonst gelöst
>werden?

Was ist denn wirklich dein Problem? Was willst du mit dem FPGA machen, 
dass der Resetzustand variabel sein soll? Das ist eigentlich 
widersinning. Normalerweise gibt es einen festen Resetzustand. Der uC 
konfiguriert dann die diversen Steuerregister je nach Anwendung.

MfG
Falk

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk wrote:
>>Ich möchte in VHDL (Spartan 3E) ein Register so beschalten, dass der
>>Reset-Zustand abhängig von einem Input wird.
> Wozu?
Um eine Hardware Bestückungsvariante zu berücksichtigen. Ohne lange auf 
das Woher und Wohin einzugehen ist es so, dass Zustand nach Reset (oder 
allenfalls kurz nach Start des FPGA abhängig vom Eingang 
"INT_DEFAULT_ON" im Register stehen muss.
Ob diese durch den selektiven Reset-Wert oder als einmal zu 
durchlaufende State Maschine zum Laden des selektiven Werts erfolgt ist 
eigentlich nicht festgelegt.
Um den Aufwand klein zu halten habe ich vorerst die Reset-Variante 
favorisiert.
>
>>Fragen:
>>- Geht das?
> Direkt nicht, ggf. mit Tricks.
Doch, es geht (sagt Xilinx). Gerade habe ich den "Entwurf" mit dem 
if-Statement in der Reset-Zuweisung auf Webpack ISE 9.1 durchgejagt, 
ging bis und mit PAR problemlos:
...
        if INT_RESET = '1' then
            if uC_Default_ON = '0' then
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
            else
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '1');
            end if;
        else
            if rising_edge(INT_CLK) then
...

> Normalerweise gibt es einen festen Resetzustand. Der uC
> konfiguriert dann die diversen Steuerregister je nach Anwendung.
Der uC bekommt idealerweise von dieser Variante gar nichts mit und liest 
den für ihn relevanten Wert dann aus dem Register ohne sich um die (das 
Problem verursachende) Bestückungsvariante kümmern zu müssen.

Gruss, Martin

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anderer Ansatz:
    -- Digital Out Register write
    process(...)
    begin
        if INT_RESET = '1' then
            INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
        else
            if rising_edge(INT_CLK) then
                if LOAD_DEFAULT_ON_impuls = '1' then
                    INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '1');
                else
                    if INT_DIGITAL_OUT_write = '1' and INT_CYCLE_WRITE_ACCESS_impuls = '1' then
                        -- DIGITAL_OUT
                        INT_DIGITAL_OUT_sig(12 downto 1) <= INT_D(12 downto 0);
                    end if;
                end if;
            end if;
        end if;
    end process;
So muss nun in einem separaten Prozess einige Takte nach Wegfall des 
Reset der Impuls erzeugt werden, falls Default_ON aktiv ist.

@Falk: Entspricht das eher dem sauberen Ansatz?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin Kohler (mkohler)

>@Falk: Entspricht das eher dem sauberen Ansatz?

Ja.

MfG
Falk

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man das macht könnte man doch gleich komplett auf den asynchronen 
Reset verzichten? So hat man ja praktisch zwei Resets, einen synchronen 
und einen asynchronen.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe jetzt die in meinem letzten Beitrag skizzierte Variante 
realisiert und die Hardware-Ausgänge während der Umschalterei auf 
Tristate gehalten.
So funktioniert es gemäss ModelSim tadellos.

Danke für die Hilfe.

Gruss, Martin

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.