2013-03-23 104 views
0

我遇到了問題。 我是Verilog的新手,我必須編寫一個基於計數器的內存數組。基本上,我的陣列是16 x 8位(16 x 1字節)。我有8位數據進入我的記憶,16次。所以我做了一個內存塊和一個計數器,該計數器通過在時鐘的上升沿遞增(實際上,在每個上升沿,8位數據被送入內存,因此增加了計數器)來爲該內存塊提供地址。現在我已經完成了這個過程16次,現在128位數據被存儲並由我的內存塊提供。但現在我想重置我的計數器,並在一小段延遲後再重複整個過程。我很困惑我如何做到這一點。請看看我的代碼和建議。Verilog中基於計數器的存儲陣列

提前感謝大家。

// creation of counter & a dummy variable 
wire cnt; 
wire cnt_next; 
reg [3:0] counter; 
    always @(posedge clock) 
    assign cnt_next=cnt+1'b1; 
     counter <= cnt_next 
     wire [3:0] write_address = counter; 


//creation of ram function 
module single_port_ram 
( 
    input [7:0] data, 
    input [3:0] addr, 
    input wr, clk, rd 
    output [127:0] q 
); 

reg [15:0] ram[0:7]; 

always @ (posedge clk or posedge reset) 
    begin 
    // Code for writing the data 
     if (wr) 
     { 
      addr <= write_address 
      case {addr} 
       4'b0000: ram[0] <= data 
      4'b0001: ram[1] <= data 
      4'b0010: ram[2] <= data 
      4'b0011: ram[3] <= data 
      4'b0100: ram[4] <= data 
      4'b0101: ram[5] <= data 
      4'b0110: ram[6] <= data 
      4'b0111: ram[7] <= data 
      4'b1000: ram[8] <= data 
      4'b1001: ram[8] <= data 
      4'b1010: ram[10] <= data 
      4'b1011: ram[11] <= data 
      4'b1100: ram[12] <= data 
      4'b1101: ram[13] <= data 
      4'b1110: ram[14] <= data 
      4'b1111: ram[15] <= data 
     end 

always @ (posedge clk or posedge reset) 
    begin 
    //Code for reading the data 
     if (rd) 
     { 
     q <= {ram[15],ram[14],ram[13],ram[12],ram[11],ram[10],ram[9],ram[8],ram[7],ram[6],ram[5],ram[4],ram [3],ram[2],ram[1],ram[0]} 
     } 

回答

0

讓你的櫃檯大些,說高達31,而不是15.對於前16個時鐘,寫存儲器地址就像你正在做的,在接下來的16個時鐘剛剛做什麼,但增量(小延遲你想要的),然後當計數器達到31時,只需將它重置爲0.然後該過程應該重新啓動。

+0

但我怎麼「重置」計數器使得整個過程再次重複?我應該將整個代碼塊放在重複循環中嗎? – Sam29 2013-03-24 06:20:49

+0

一旦達到該字段可容納的最大值,計數器將自動翻轉爲0(5'b11111 + 5'b00001 = 5'b00000)。無論是那個還是你可以選擇在某個值後將計數器置回零(在25次滴答後重置爲零):'cnt_next =(counter == 25)? 0:計數器+1。 – Tim 2013-03-24 07:12:39

+0

感謝您的回覆Tim。所以我需要做的只是增加計數器的大小,一旦達到最大值,它將自己重置爲0.這是一個好主意。感謝你的幫助。 – Sam29 2013-03-24 07:53:52

0

具有16×8位(16×1字節)

第一聲明您的RAM寬度的大小,那麼您聲明您的RAM例如的實際深度如果我想512個REG變量的陣列(深度)和各爲8位(寬度),那麼它會被寫成這樣:

reg [7:0] ram[511:0]; 

所以你的代碼應該是這樣的:

reg [7:0] ram[15:0];