Forum: FPGA, VHDL & Co. Bits aus Vektor wegmaskieren


von Martin T. (mtrummer)


Lesenswert?

Hallo an alle,

Folgendes Problem. Aus 2 Vektoren muss sind nur die ersten N bits 
gültig. Die restlichen müssen auf 0 gesetzt sein. Dieses Problem muss 
ich für 2 Vektoren lösen.

Zum Einen muss dies in einem Register (data) gelöscht werden, zum 
Anderen muss dies am Ausgang des registers process_data passieren.

Als VHDL Anfänger habe ich das folgendermaßen gelöst:
1
    if mask_ctrl > 0 then
2
      for i in 0 to DATA_WIDTH-1 loop
3
        if i < mask_ctrl then
4
          next_data(i) <= data(i);
5
          mask_data(i) <= process_data(i);
6
        else
7
          next_data(i) <= '0';
8
          mask_data(i) <= '0';
9
        end if;
10
      end loop;
11
    end if;

Gibt es eine geschicktere Lösung dieses Problems? Wie ist es möglich die 
vorliegende Beschreibung noch weiter hinsichtlich Fläche zu optimieren?

Ich hoffe es kann mir als Anfänger jemand Tipps geben!

Grüße Martin

von Klaus F. (kfalser)


Lesenswert?

Martin Trummer schrieb:
> Gibt es eine geschicktere Lösung dieses Problems?
Ja, die logische Operation dazu heißt AND (UND) - Operator.

> Wie ist es möglich die
> vorliegende Beschreibung noch weiter hinsichtlich Fläche zu optimieren?

Warum nimmst Du an, dass dies viel Fläche benötigt?

von Michael W. (Gast)


Lesenswert?

Fehlt da nicht noch der Fall, dass maslctrl genau = 0 ist?
... sowie eine Plausibilisierung N gegen mask ctrl?

Wozu braucht man überhaupt solche auswändigen Konstrukte?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Klaus Falser schrieb:
>> Wie ist es möglich die
>> vorliegende Beschreibung noch weiter hinsichtlich Fläche zu optimieren?
> Warum nimmst Du an, dass dies viel Fläche benötigt?
Auf meinem Monitor sind das 84x47mm² = 3948mm². Das geht kleiner:
1
  process (...) begin
2
    next_data <= data;
3
    mask_data <= process_data;
4
    if mask_ctrl > 0 then
5
      next_data(mask_ctrl downto 0) <= (others=>'0');
6
      mask_data(mask_ctrl downto 0) <= (others=>'0');
7
    end if;
8
  end process;
Der vergleichbare Prozessinhalt ist auf knapp die Hälfte geschrumpft: 
91x22mm² = 2002mm²

Aber hier mal der andere Ansatz: schöner... ;-)
1
  function maskiere(vect : std_logic_vector; mask : integer) return std_logic_vector is
2
    variable v: std_logic_vector(vect'length-1 downto 0) := vect;
3
  begin
4
    if mask>0 then   v(mask downto 0) := (others=>'0');   end if;
5
    return v;
6
  end maskiere;
7
:
8
:  
9
  next_data <= maskiere(data,mask_ctrl);
10
  mask_data <= maskiere(process_data,mask_ctrl);

Immer unter der Annahme natürlich, dass mask_ctrl ein Integer ist...

: Bearbeitet durch Moderator
von Martin T. (mtrummer)


Lesenswert?

Markus W. schrieb:
> Fehlt da nicht noch der Fall, dass maslctrl genau = 0 ist?
> ... sowie eine Plausibilisierung N gegen mask ctrl?

Beide signale sind zuvor auf die Daten initialisiert. 0 bedeuted keine 
Maskierung.

> Wozu braucht man überhaupt solche auswändigen Konstrukte?

Ganz einfach. Ein Algorithmus arbeitet mit einer Blocklänge von 
DATA_WIDTH. Bearbeitet man nicht DATA_WIDTH bits, so müssen die 
restlichen Bits 0 gesetzt sein!

Lothar Miller schrieb:
> Auf meinem Monitor sind das 84x47mm² = 3948mm². Das geht kleiner:

Dafür extra den Aufwand, das Lineal aus der Schreibtischlade zu kramen? 
:p
Nichtsdestotrotz, das mag mein Synthesizer nicht. Vektoren können nur 
von Konstanten indiziert werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Trummer schrieb:
> das mag mein Synthesizer nicht.
Welcher?

> Vektoren können nur von Konstanten indiziert werden.
Ich habe es auch erst mal mit XST ausprobiert. Der kann aber beide 
Varianten...

von Harald (Gast)


Lesenswert?

Martin Trummer schrieb:
> Dieses Problem muss
> ich für 2 Vektoren lösen.

zur Laufzeit oder zur Compile-Zeit?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
>> Vektoren können nur von Konstanten indiziert werden.
> Ich habe es auch erst mal mit XST ausprobiert.
Synplify (Lattice) kanns auch...

von berndl (Gast)


Lesenswert?

Lothar Miller schrieb:
> Lothar Miller schrieb:
>>> Vektoren können nur von Konstanten indiziert werden.
>> Ich habe es auch erst mal mit XST ausprobiert.
> Synplify (Lattice) kanns auch...

Ich hatte da mal (vor ca. 4 Jahren) mit Quartus Probleme, es ging damals 
schon mit Lattice und Xilinx.

von greg (Gast)


Lesenswert?

Martin Trummer schrieb:
> Nichtsdestotrotz, das mag mein Synthesizer nicht. Vektoren können nur
> von Konstanten indiziert werden.

Der muss dann ziemlicher Mist sein, oder irgendwas am Code verstimmt 
ihn. Die Indizierung eines Bitvektors ist doch einfach in einen 
Multiplexer umsetzbar.

von Michael W. (Gast)


Lesenswert?

berndl schrieb:
> Ich hatte da mal (vor ca. 4 Jahren) mit Quartus Probleme, es ging damals
> schon mit Lattice und Xilinx.

Gfs eine Frage des VHDL-Standards? 2008, 2003 ...

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.