2017-07-30 2 views
0

Ich habe einen Vektordaten [255: 0]. Und ein anderer Vektor len [3: 0] (len kann per Definition nur einen Maximalwert von 8 annehmen). Ich muß diese (pseudo code) tun:Maske einige Bits in einem Vektor auf der Grundlage eines anderen Vektors

bits= len*32; 
data_mod[255:0] = {data[255:(255-(bits-1))], (256-bits)'0} 
ex : if len = 6, then 
data_mod[255:0] = {data[255:64], 64'b0} 

Grundsätzlich Schnappen nur obere „LEN * 32“ Bits aus dem ursprünglichen Vektor und den Rest Null aus.

Ich stecke versucht, dies in synthetisierbaren System Verilog tun? Irgendwelche Ideen?

+0

allererst Sie reichen sollte [511: 0] seit len ​​4 Bits breit. für den Rest, nach 512 - len * 32 nach rechts verschieben, um die oberen Bits zu greifen. Sie können dann um den gleichen Betrag nach links verschieben, um die unteren Bits zu reinigen. Oder du kannst mit Masken spielen. – Serge

+0

256 Bits sind genug, da der Maximalwert von Len im Design 8 ist. Ich habe an richtige Verschiebung gedacht, dann an linke Verschiebung, aber denke, dass es eine elegantere Art geben muss –

Antwort

0

Hier ein Beispiel mit Masken, die in Ihrem Fall funktionieren könnte:

module bb; 
    reg [255:0] data; 
    reg [255:0] data_mod; 
    reg [255:0] mask; 
    reg [3:0] len; 

    initial begin 
     len = 2; 
     mask = {256{1'b1}} << (len * 32); 
     data_mod = data & mask; 
     $display("%0x", data_mod); 
    end 

endmodule // bb 

und das Ergebnis ist

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000000000000000 
+0

Das macht Sinn ... Danke! –

Verwandte Themen