2014-12-02 50 views
1

我想要生成一個RAM來存儲VHDL中的基本繪圖程序的可編輯位圖。爲此,一組I/O採用當前像素的地址並輸出存儲的像素顏色。另一組採用要寫入的像素的地址和其數據輸入的顏色。由於顯示器的大小,這需要是1Megx12bit雙端口RAM。然而,綜合推斷鎖存開始正好在2^13地址導致我相信我用盡資源。我能做些什麼來使這個RAM工作?在VHDL中創建大型雙端口RAM

下面的代碼(注意輸入工具不使用,最終將會被移除):

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity DUALRAM_Custom is port (
    ADDR1 : in STD_LOGIC_VECTOR(19 downto 0); 
    D_in2 : in STD_LOGIC_VECTOR(11 downto 0); 
    ADDR2 : in STD_LOGIC_VECTOR(19 downto 0); 
    WE2 : in STD_LOGIC; 
    tool : in STD_LOGIC_VECTOR(3 downto 0); 
    CLR : in STD_LOGIC; 
    CLK : in STD_LOGIC; 
    D_out1 : out STD_LOGIC_VECTOR(11 downto 0) 
);  
end DUALRAM_Custom; 

architecture Behavioral of DUALRAM_Custom is 
    type RAM_type is ARRAY(0 to 1048575) of STD_LOGIC_VECTOR(11 downto 0); 
    signal RAM : RAM_type := (others => (others => '0')); 
begin 

    process(CLK) is 
    begin 
     if((CLK'event) AND (CLK = '1')) THEN 
      D_out1 <= RAM(to_integer(unsigned(ADDR1))); 

      if ((WE2 = '1') AND (CLR = '0')) THEN 
       if (CLR = '1') THEN 
        RAM(to_integer(unsigned(ADDR2))) <= x"000"; 
       else 
        RAM(to_integer(unsigned(ADDR2))) <= D_in2; 
       end if; 
      end if; 
     end if; 
    end process; 
end Behavioral; 
+1

我在代碼中看不到任何鎖存器。話雖如此,你的CLR將無法正常工作。 – 2014-12-02 04:55:28

+0

您的目標平臺是否支持BlockRAM的1.5 MiB?通常,外部(S)SRAM更適合於這種像素緩衝器。 – Paebbels 2014-12-02 09:36:09

+0

比爾 - 我的CLR應該將活動地址設置爲0 - 這更像是一個清除而不是清除。 Paebbels - 我不確定。我會嘗試使用Xilinx附帶的CoreGen,看看它是否允許更大的雙塊RAM,因爲我認爲分佈式RAM是有限的。 – 2014-12-02 18:52:32

回答

2

你需要看看到底是什麼類型的RAM您的配件支持。有一件事可能導致問題是RAM的初始化。有些技術不支持在其RAM上重置。有些將在上電期間作爲預加載。

signal RAM : RAM_type := (others => (others => '0')); 

另請注意,您的CLR邏輯有點奇怪(正如Bill Lynch所述)。請注意,芯片上RAM的功能部分可能沒有任何形式的復位,所以這將成爲RAM前端的額外邏輯。把它和你的編碼風格混合起來,可能會導致你的綜合工具不支持的東西。我建議至少暫時刪除CLR功能,讓它在沒有它的情況下工作,並嘗試重新添加它。

我也建議使用一個變量作爲你的RAM而不是一個信號,因爲你正在執行的RAM的信號可能導致你的仿真運行速度比變量慢得多。

以下代碼適用於真正的雙端口RAM。我已經爲賽靈思和Altera合成了這個。它有比你需要的更多的功能,所以刪除你不需要的部分,並試試看。可能需要一點實驗才能找到合適的工具來合成您想要的東西。

architecture RTL of DPRam_RIRO_RF_1024_var is 
begin 
    MemProc : process (ClkA, ClkB) 
    type MemType is array (0 to 1023) of std_logic_vector(7 downto 0) ; 
    variable Mem : MemType ; 
    begin 
    if rising_edge(ClkA) then  
     DataOutA <= Mem(to_integer(unsigned(AddrA))) ; 
     if WriteA = '1' then 
     Mem(to_integer(unsigned(AddrA))) := DataInA ; 
     end if ; 
    end if ; 

    if rising_edge(ClkB) then  
     DataOutB <= Mem(to_integer(unsigned(AddrB))) ; 
     if WriteB = '1' then 
     Mem(to_integer(unsigned(AddrB))) := DataInB ; 
     end if ; 
    end if ; 

    end process ; 
end RTL ; 

一旦你得到的東西的工作,一定要看看它有多少資源使用,因爲我已經注意到,我的一些工作的RAM的最終使用2X我需要的,直到我得到的編碼正確的資源。

+0

Jim - 我用CoreGen生成了一個更大的RAM,我很確定它修復了我的問題,但現在我在Nexys4板上使用了130%的可用RAMB36E1模塊。我將不得不重新考慮我的設計。 – 2014-12-02 19:16:32

+0

我希望CoreGen能夠儘可能地做到這一點,所以看起來你可能已經使用了太多的RAM來存儲芯片。如果可能的話,我通常會盡量避免使用嚮導/ CoreGen - 這樣我的電路就可以在不同的技術之間移植,但是,一個代碼可能存在問題的地方是RAM-而且遠不止哲學,我正在完成我的項目。 – 2014-12-04 21:47:40

+0

我已經能夠製作內存,我會發布如何如果別人有這個問題。我並沒有準確地添加2^20個地址塊,而是根據需要輸入,現在我大大低於RAM塊的預算。所以我猜如果這個小細節被忽略了,人們可能會實現比他們所需要的更大的RAM。 – 2014-12-08 08:00:40