Register Reset-Zustand abhängig von Input-Signal machen

OP #607030
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
Gast #607069
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
OP #607110
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
OP #607137
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren