2017-06-16 1 views
0

Der Verilog-Code, wie Sie sehen, verwendet ein mehrdimensionales Register-Array zum Speichern der Daten.Mehrdimensionale Array-Wertzuweisung in Verilog

parameter DSIZE = 8; 
parameter ASIZE = 4; 

input [DSIZE-1:0] wdata; 
input wclk,wen; 

reg [ASIZE:0] wptr; 

parameter MEMDEPTH = 1<<ASIZE; 
reg [DSIZE-1:0] ex_mem [0:MEMDEPTH-1]; 

always @(posedge wclk) 
    if (wen) 
    ex_mem[wptr[ASIZE-1:0]] <= wdata; 

ich nicht richtig verstehen, was in der letzten Zuordnungsanweisung geschieht, in der ex_mem den Wert in wdata zugeordnet ist. Was bedeutet der Teil in den Klammern (wptr[ASIZE-1:0]), der mit ex_mem verbunden ist, zurück und an welcher Stelle von ex_mem wird wdata gespeichert?

+0

Ich bin mir nicht ganz sicher, was Sie nicht verstehen. 'wptr [ASIZE-1: 0]' wird zu den 'ASIZE' niedrigsten Bits von' wptr' ausgewertet, und wenn es als eine Position in 'ex_mem' interpretiert wird, wird' wdata' an dieser Stelle gespeichert. – mkrieger1

Antwort

1

Im Code ist ex_mem ein Speicher mit 16 (MEMDEPTH) Steckplätzen. Jeder Steckplatz hat 8 (DSIZE) Bits. 16 Steckplätze können durch 4 Bits (ASIZE) adressiert werden, aber wptr ist aus irgendeinem Grund ein 5-Bit-Signal, so dass sein höchstwertiges Bit (MSB) nicht zum Adressieren des Speichers verwendet wird.

ex_mem[wptr[ASIZE-1:0]] <= wdata; 

Da wptr[ASIZE-1:0] ist ein 4-Bit-Signal (für ASIZE=4), die Zuordnung oben zu einem Schlitz zwischen ex_mem[0]ex_mem[15] und schreiben kann.

1

'wptr' ist nur ein eindimensionales Register.

Zuerst extrahiert Verilog einen Index zu ex_mem von der 'wptr' Sache. Es verwendet diesen Bereich, um dies zu tun: ASIZE-1: 0.

Wenn ASIZE wie in Ihrem Beispiel 4 ist, kann es Werte von 0 bis 15 von dort abtasten. Zum Beispiel

reg [4:0] wptr = 0x1B; 
wptr[3:0] will give you 'B' (11). 

Nun wird dieser Indexwert auf die ex_mem Array angewandt werden, um Ihre Daten zu schreiben.