Forum: FPGA, VHDL & Co. Verilog Bits umkopieren


von Jonas (Gast)


Lesenswert?

Hallo,

ich bin Anfänger in Sachen Verilog:

Ich habe ein
reg [20:0) x   und ein
reg [10:0] y   .

Ich will, dass Bit 11, 12, ...,21 in das reg y gepeichert werden.

Wie geht das am einfachsten?

Danke,
Jonas

von Chris (Gast)


Lesenswert?

> Ich will, dass Bit 11, 12, ...,21 in das reg y gepeichert werden.

Du hast x so deklariert, dass dessen Bits nur von 0 bis 20 gehen. Was 
soll Bit 21 sein?

Ich geh daher mal davon aus, dass du eigentlich die elf bits 10 bis 20 
meintest. Das geht so:

assign y = x[10:20];

oder auch:
always @(posedge bla)
  y <= x[10:20];

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

always@posedge clock
y[10:0] <= {x[11],x[12],undsoweiter}
mit geschweiften Klammern
wenn die Reihenfolge wirklich umgekehrt werden soll,  sonst einfach

y[10:0] <= x[21:11]

oder kann man auch zum Umdrehen x[11:21] schreiben, das weiß ich nicht ?

von Jonas (Gast)


Lesenswert?

Ja, stimmt.
Danke.


Ich habe noch eine Frage:
Angenommen ich habe ein MOdul, das zwei andere Module instanziert und 
ich möchte die Ausgabe des einen Moduls als EIngabe des anderen Moduls 
verwenden. Als was muss ich dann die Variable deklarieren? Als reg oder 
als wire?

Jonas

von Günter -. (guenter)


Lesenswert?

Mit Variable meinst du die Verbindung der beiden Instanzen? Das soll ein 
wire sein, da ja die Signaltreiber irgendwo in den Modulen sind.

von Jonas (Gast)


Lesenswert?

Ich habe den folgenden Code geschrieben.
Mein Compiler gibt den Fehler "Bounds of part-select into 'x' are 
reversed." aus.

Es wäre sehr nett, wenn ihr mir sagen könntet wo der Fehler liegen 
könnte.

Danke,
Jonas



input [10:0] x;

reg [5:0] y;

@always(posedge clock)
begin
y<=x[6:10];
end

von Günter -. (guenter)


Lesenswert?

Beim definieren ist msb > lsb (10 > 0):

  input [10:0] x;

Dann aber beim Zugriff msb < lsb (6 < 10):

  y<=x[6:10];

Ich glaube das geht nicht. Wenn es dir zu viel Arbeit ist die einzelnen 
bits in einen Verkettung zu schreiben, kannst du auch eine for-Schleife 
dazu nehmen. Also so etwa:

integer i;

for(i=6; i<=10; i=i+1)
  y[10-i] <= x[i];

Beim sythesieren wir das dann aufgerollt und es stehen die einzelnen 
Zuweisungen da.

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.