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


von Martin K. (mkohler)


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):
1
    -- Digital Out Register write
2
    process(INT_CLK, INT_RESET, INT_DIGITAL_OUT_write, INT_CYCLE_dir, INT_D, INT_CYCLE_WRITE_ACCESS_impuls)
3
    begin
4
        if INT_RESET = '1' then
5
            INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
6
        else
7
            if rising_edge(INT_CLK) then
8
                if INT_DIGITAL_OUT_write = '1' and INT_CYCLE_WRITE_ACCESS_impuls = '1' then
9
                    -- DIGITAL_OUT
10
                    INT_DIGITAL_OUT_sig(12 downto 1) <= INT_D(12 downto 0);
11
                end if;
12
            end if;
13
        end if;
14
    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:
1
...
2
        if INT_RESET = '1' then
3
            if INT_DEFAULT_ON = '0' then
4
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
5
            else
6
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '1');
7
            end if;
8
        else
9
...
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

von Falk (Gast)


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

von Martin K. (mkohler)


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:
1
...
2
        if INT_RESET = '1' then
3
            if uC_Default_ON = '0' then
4
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
5
            else
6
                INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '1');
7
            end if;
8
        else
9
            if rising_edge(INT_CLK) then
10
...

> 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

von Martin K. (mkohler)


Lesenswert?

Anderer Ansatz:
1
    -- Digital Out Register write
2
    process(...)
3
    begin
4
        if INT_RESET = '1' then
5
            INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '0');
6
        else
7
            if rising_edge(INT_CLK) then
8
                if LOAD_DEFAULT_ON_impuls = '1' then
9
                    INT_DIGITAL_OUT_sig(12 downto 1) <= (others => '1');
10
                else
11
                    if INT_DIGITAL_OUT_write = '1' and INT_CYCLE_WRITE_ACCESS_impuls = '1' then
12
                        -- DIGITAL_OUT
13
                        INT_DIGITAL_OUT_sig(12 downto 1) <= INT_D(12 downto 0);
14
                    end if;
15
                end if;
16
            end if;
17
        end if;
18
    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?

von Falk (Gast)


Lesenswert?

@ Martin Kohler (mkohler)

>@Falk: Entspricht das eher dem sauberen Ansatz?

Ja.

MfG
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Martin K. (mkohler)


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

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.