String-Konstante in Verilog

OP #2416142
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".
Gast #2416224
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;
OP #2420205
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
Persönliche Seite #2420375
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
OP #2421634
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!

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