Forum: FPGA, VHDL & Co. String-Konstante in Verilog


von Matthias N. (nippey)


Lesenswert?

Hi,

ich möchte in meinem FPGA einen Indentifikationsstring einspeichern, der 
bei der UART-Kommunikation abgerufen werden kann.

Der Gedanke war, es irgendiwe in dieser Art zu machen:
1
parameter info_str = "Analyzer v0.1";
2
wire [7:0] info_string [0:20];
3
assign info_string = info_str;

Um dann so, oder so ähnlich auf die einzelnen Bytes zuzugreifen:
1
(deklaration:)
2
reg [7:0] tx_reg,byte_counter;
3
4
(always-block:)
5
byte_counter <= byte_counter + 1;
6
tx_reg <= info_string[byte_counter]

Das hier gezeigte Beispiel funktioniert definitiv nicht ;)
Assign: Illegal reference to net array "info_string".

von Lattice User (Gast)


Lesenswert?

Strings in Verilog sind KEINE byte arrays!

beispiel aus Verilog 2001 Referenz:
1
module string_test;
2
reg [8*14:1] stringvar;
3
initial begin
4
  stringvar = "Hello world";
5
  $display("%s is stored as %h", stringvar, stringvar);
6
  stringvar = {stringvar,"!!!"};
7
  $display("%s is stored as %h", stringvar, stringvar);
8
end
9
endmodule


Mit folgendem hat du vielleicht mehr Glück.
1
parameter info_str = "Analyzer v0.1";
2
wire [20*8:1] info_string;
3
assign info_string = info_str;

von Matthias N. (nippey)


Lesenswert?

Ah okay.

Das 20*8 ist in diesem Fall nur eine Multiplikation?

Also greif ich auf die einzelnen Bytes nun wie folgt zu?
info_string[7+index:0+index];

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Matthias N. schrieb:
> Also greif ich auf die einzelnen Bytes nun wie folgt zu?
> info_string[7+index:0+index];

Oder besser:
1
info_string[index+:8]

--
Marcus

von Matthias N. (nippey)


Lesenswert?

Soll das bewirken, dass ich immer einen 8 bit breiten Rückgabewert 
erhalte?
Wäre cool, aber der Compiler hat was dagegen.

Um auf den String wie auf ein Array zugreifen zu können, habe ich nun 
etwas mehr Aufwand treiben müssen..:
1
parameter info_str = "Analyser v0.1";
2
parameter info_length = 13;
3
wire [info_length*8-1:0] info_string;
4
assign info_string = info_str;
5
wire [7:0] info_array [0:20];
6
7
genvar i;
8
for (i = 0; i < info_length; i = i +1) begin
9
   assign info_array[i] = info_str[i*8+7:i*8];
10
end

Und nun kann ich endlich mit
1
info_array[i]
auf den String zugreifen

Variable Ranges wie sie bei Zugriff auf das wire vorkommen sind (in 
ModelSim) scheinbar verboten

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Matthias N. schrieb:
> Soll das bewirken, dass ich immer einen 8 bit breiten Rückgabewert
> erhalte?

Der Code entsprach Deinem Beispiel, gibt aber natürlich nicht das 
gesuchte Byte zurück. Es sollte heißen:
1
info_string[index*8+:8]

> Wäre cool, aber der Compiler hat was dagegen.

Ist Teil von Verilog-2001.

> Variable Ranges wie sie bei Zugriff auf das wire vorkommen sind (in
> ModelSim) scheinbar verboten

Das ist in Verilog generell verboten.

--
Marcus

von Matthias N. (nippey)


Lesenswert?

Ist das erste mal, dass ich wirklich komplett selbstständig arbeite, 
habe ne Compileroption für 2001 und 2008 gefunden, nehme ich doch direkt 
mal 2008 ;)


> info_string[index*8+:8]

Das mit dem Zugriff muss ich morgen mal ausprobieren

Also heisst der Operator +: quasi:
Gibt mir ein Array mit der Breite 8 zurück, was bei index*8 beginnt.
Cool, danke!

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.