2015-12-30 43 views
0

下面是內存模塊,我希望讀取係數值。卡住綜合RAM塊 - >給出警告作爲無源信號

entermodule RAM_LP#(parameter width=8, length=16) 

(output reg [width*width-1:0]data_out, 

input [width-1:0] address, 

input clk,we); 

// let the tools infer the right number of BRAMs 

(* ram_style = "block" *) 

(* synthesis, ram_block *) 

reg [15:0] mem [0:65535]; 

parameter load_file = "generated/LP_coefficients.txt"; 

initial 
    begin 
     $readmemh (load_file, mem); 

end 

always @(posedge clk) begin 

if (we) 

    data_out <= mem[address]; 
    end 


endmodule 

給予警告,並停留在這一點上 - >

警告:XST:653 - 信號< MEM>使用,但從來沒有分配。這個無源信號將自動連接到值0000000000000000.

請指導我如何解決此問題。

+0

由於mem的寬度是16位,所以將data_out聲明爲'[2 * width-1:0] data_out'而不是'[width * width-1:0] data_out'。和地址爲[length-1:0]地址。 – sharvil111

+0

請發佈完整的錯誤信息,它應該包含信號名稱。只要內存具有固定大小,模塊的參數就沒有用處。 –

回答

1

你永遠不會寫任何新的內存,所以配合工具會提醒你這個問題,並把這個RAM當作ROM。

的這部分程序:

always @(posedge clk) begin 
    if (we) 
    data_out <= mem[address]; 
end 

讀取當前的內存地址時,我們是1我假設你要寫入內存的時候,我們是1,所以它應該是這樣的:

always @(posedge clk) begin 
    if (we) 
    mem[address] <= data_in; 
    data_out <= mem[address]; 
end 

正在data_in輸入端口的數據,你想寫入內存。請注意寫入操作後的時鐘週期,data_out仍將具有舊的存儲器內容。有data_out如果執行寫入更新,這樣做:

always @(posedge clk) begin 
    if (we) begin 
    mem[address] <= data_in; 
    data_out <= data_in; 
    end 
    else 
    data_out <= mem[address]; 
end 

你的模塊目前沒有data_in端口,因此它描述了一個ROM,不是RAM,並在ROM中,這個警告是無害。