2017-06-16 111 views
0

ご覧のとおり、下のコードでは、多次元の配列を使ってデータを格納しています。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; 

私はきちんとex_memwdataに値を割り当てられる最後の代入文で何が起こるか分かりません。 ex_memに関連付けられている括弧(wptr[ASIZE-1:0])の部分は、ex_memのどの場所に返され、wdataに格納されますか?

+0

私はあなたが理解していないことはよく分かりません。 'wptr [ASIZE-1:0]'は 'wptr'の' ASIZE'の下位ビットを評価し、 'ex_mem'の位置として解釈すると、' wdata'はその位置に格納されます。 – mkrieger1

答えて

1

コードでは、ex_memは16スロット(MEMDEPTH)のメモリです。各スロットには8ビット()ビットがあります。 16スロットは4ビット(ASIZE)ビットでアドレス指定できますが、何らかの理由でwptrが5ビット信号であるため、その最上位ビット(MSB)はメモリのアドレス指定に使用されません。

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

wptr[ASIZE-1:0]は(ASIZE=4用)4ビットの信号であるので、上記の割り当てはex_mem[0]ex_mem[15]との間のスロットに書き込むことができます。

1

'wptr'は単なる1次元レジスタです。

最初に、すべてのverilogは、 'wptr'からex_memへのインデックスを抽出します。それはこの範囲を使用して行います:ASIZE-1:0。

例のようにASIZEが4の場合、そこから0〜15の値をサンプリングできます。たとえば、

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

このインデックス値は、データを書き込むためにex_mem配列に適用されます。

関連する問題