2016-02-24 29 views
-3

我在它的方面描述圖像的文本文件的RGB分量我要加載的FPGA該文件產生RGB信號,因此,如果您能好心開導我,我將感謝如何在VHDL中的RAM上加載文本文件?

歐凱所以這是我想出來的,但是這個綜合需要永久完成,所以你認爲這裏的問題是什麼?

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
use STD.TEXTIO.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity RGB_Gen is 

    port(CLK : in STD_LOGIC; 
     EN : in STD_LOGIC; 
     R,G,B : out STD_LOGIC); 

end RGB_Gen; 

architecture Behavioral of RGB_Gen is 

    Type ram is array (0 to 611) of BIT_VECTOR(203 downto 0); 

    impure function InitRamFromFile(Filename : in string) return ram is 

    File readFile : text is in Filename; 
    Variable lineRead : Line; 
    Variable my_ram : ram; 

    begin 

     for i in ram'range loop 
     readline(readFile, lineRead); 
     read(lineRead, my_ram(i)); 
    end loop; 

    return my_ram; 

    end function; 

    function toSTD(B : in Bit) return STD_LOGIC is 
    begin  
     if B = '1' then 
      return '1'; 
     else 
      return '0'; 
     end if; 
    end function; 

    Signal my_ram : ram := InitRamFromFile("C:\Users\Mos_X\Desktop\output.txt"); 

    begin 

    process(CLK) 

    Variable X : Integer := 0; 
    Variable Y : Integer := 0; 

    begin 

    if rising_edge(CLK) then 
     if EN = '0' then 
      R <= '0'; 
      G <= '0'; 
      B <= '0'; 
     else 
      R <= toSTD((my_ram(Y)(X))); 
      G <= toSTD((my_ram(Y + 204)(X))); 
      G <= toSTD((my_ram(Y + 408)(X)));  
     end if; 

     if X = 203 then 
      X := 0; 
     if Y = 203 then 
      Y := 0; 
     else 
      Y := Y + 1; 
      end if; 
     else 
      X := X + 1; 
     end if; 

    end if; 

end process; 

end Behavioral; 
+1

如果綜合速度很慢,你會問它做了一些艱難的事情,一個三端口RAM(ROM)機智h 204位寬端口。您有一個包含三個204位到1位多路複用器的進程。考慮三個RAM(ROM)1位寬或浪費一點內存並使用4位寬的東西。 – user1155120

+0

是否有將線讀取轉換爲STD_LOGIC_VECTOR的方法?我想我在那裏使用read(lineRead,my_ram(i))是不正確的。綜合性問題現在對我來說不是什麼大問題,我的首要任務就是讓它工作。 – Mostafa

+0

從RAM中讀取時,您正在分配'G'兩次。這是打算?你正在使用哪個綜合工具? –

回答

-1

所以問題是,當使能信號爲0,這是使靜態的,所以這

if rising_edge(CLK) then 
     if EN = '0' then 
      R <= '0'; 
      G <= '0'; 
      B <= '0'; 
     else 
      R <= toSTD((my_ram(Y)(X))); 
      G <= toSTD((my_ram(Y + 204)(X))); 
      G <= toSTD((my_ram(Y + 408)(X))); 

      if X = 203 then 
       X := 0; 
      if Y = 203 then 
       Y := 0; 
      else 
      Y := Y + 1; 
       end if; 
      else 
       X := X + 1; 
      end if; 
     end if; 
    end if; 

代替此

if rising_edge(CLK) then 
     if EN = '0' then 
      R <= '0'; 
      G <= '0'; 
      B <= '0'; 
     else 
      R <= toSTD((my_ram(Y)(X))); 
      G <= toSTD((my_ram(Y + 204)(X))); 
      G <= toSTD((my_ram(Y + 408)(X)));  
     end if; 

     if X = 203 then 
      X := 0; 
     if Y = 203 then 
      Y := 0; 
     else 
      Y := Y + 1; 
      end if; 
     else 
      X := X + 1; 
     end if; 

    end if; 

在代碼中的兩個計數器甚至被遞增將解決問題

+2

這個問題在你的問題中並不明顯。 titlei **如何在VHDL中的RAM上加載文本文件?**其中您添加了自己加載RAM的方法。而*** Okey,所以這就是我想出的,但有一個問題綜合是永遠完成,所以你認爲這裏的問題是什麼??!***,你甚至沒有指出什麼問題是。你在問如何得到這個綜合?您的答案地址中哪些問題是您的答案? – user1155120

+0

我想知道在編寫所有這些代碼之前,將文本文件的內容加載到fpga的內存中的最有效的方式,但是因爲您都認爲這個問題太廣泛了,而我並沒有看到這種方式,所以我繼續說我的想法,並試圖從中得出結果,最後我得到了圖像在屏幕上,但大約5-10分鐘的綜合 – Mostafa

相關問題