2011-05-05 58 views
1

我想要VHDL中的RAM(可以在Xilinx,Altera上合成..)以下'catch' -VHDL單口RAM?

我必須以塊爲單位向其寫入數據,並按位讀取數據。

我該如何做到這一點?

回答

1

您應該只從RAM塊中讀取明智的數據,並將您讀出的向量移出以逐位進行讀取。

例如,如果ram_do是您讀出的向量,那麼只需使用ram_data <= '0' & ram_data(9 downto 1)每次移出位1,其中ram_data(0)是每個時鐘週期可以執行的按位值。

你將得到的硬件是RAM加移位寄存器。

+0

謝謝 - 我不熟悉1'b0語法或表達式。那是什麼意思? – Nektarios 2011-05-05 03:06:59

+0

對不起。我確定了答案。 1'b0是一個verilog文字,這是我一直使用的語言。 – 2011-05-05 03:13:05

+0

我發現奇怪的是,這個答案被接受,因爲原來的問題是一個混合寬度的RAM,而這裏描述的解決方案做出了這樣的假設,即單個位是按順序訪問的。 – trondd 2013-11-21 12:28:10

0

您可以實例化一個供應商特定的RAM塊,它可以這樣工作。

或者,你可以用一些綜合工具推斷出一個。例如,XST允許這樣做(參見UG687的第201頁以上代碼示例,只需更改示例代碼to use numeric_std.all!)我不知道這種方法是否可以移植到Altera的Quartus。

0

您應該閱讀Recommended HDL Coding Style(Altera Quartus手冊)中的混合寬度雙端口RAM部分。我不確定此代碼的便攜性如何,但下面的示例顯示瞭如何在Altera器件上執行此操作:

library ieee; 
use ieee.std_logic_1164.all; 

package ram_types is 
    type word_t is array (0 to 3) of std_logic_vector(7 downto 0); 
    type ram_t is array (0 to 255) of word_t; 
end ram_types; 

library ieee; 
use ieee.std_logic_1164.all; 
library work; 
use work.ram_types.all; 

entity mixed_width_ram is 
    port (
     we, clk : in std_logic; 
     waddr : in integer range 0 to 255; 
     wdata : in word_t; 
     rdata : in integer range 0 to 1023; 
     q  : out std_llgic_vector(7 downto 0)); 
end mixed_width_ram; 

architecture rtl of mixed_width_ram is 
    signal ram : ram_t; 
begin -- rtl 
    process(clk, we) 
    begin 
     if (rising_edge(clk)) then 
      if(we = '1') then 
       ram(waddr) <= wdata; 
      end if; 
      q <= ram(raddr/4)(raddr mod 4); 
     end if; 
    end process; 
end rtl;