Bits aus Vektor wegmaskieren

OP #3737875
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
Moderator (Firma: Titel) Persönliche Seite #3738017
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...
OP #3738469
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.

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