Text 如何在VHDL中在ram上加载文本文件?

Text 如何在VHDL中在ram上加载文本文件?,text,vhdl,rgb,ram,Text,Vhdl,Rgb,Ram,我有一个文本文件,它描述了一个图像的RGB组件,我想把这个文件加载到FPGA上,产生一个RGB信号,所以如果你能告诉我,我将非常感激 好的,这就是我想到的,但是有一个问题,合成要花很长时间才能完成,所以你认为这里的问题是什么 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use STD.TEXTIO.ALL; -- Uncomment the following library decl

我有一个文本文件,它描述了一个图像的RGB组件,我想把这个文件加载到FPGA上,产生一个RGB信号,所以如果你能告诉我,我将非常感激

好的,这就是我想到的,但是有一个问题,合成要花很长时间才能完成,所以你认为这里的问题是什么

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用STD.TEXTIO.ALL;
--如果使用,请取消注释以下库声明
--具有有符号或无符号值的算术函数
--使用IEEE.NUMERIC_STD.ALL;
--如果正在实例化,请取消对以下库声明的注释
--此代码中的任何Xilinx原语。
--UNISIM图书馆;
--使用UNISIM.VComponents.all;
实体RGB_Gen是
端口(时钟:在标准逻辑中;
EN:标准逻辑;
R、 G,B:输出标准逻辑);
结束RGB_Gen;
RGB_Gen的架构是
类型ram是位_向量(203到0)的数组(0到611);
不纯函数InitRamFromFile(文件名:字符串形式)返回ram为
文件读取文件:文件名中包含文本;
变量行读取:行;
变量my_ram:ram;
开始
对于ram'range循环中的i
readline(readFile,lineRead);
读(lineRead,我的内存(i));
端环;
归还我的内存;
末端功能;
函数toSTD(B:位)返回标准_逻辑为
开始
如果B='1',则
返回“1”;
其他的
返回“0”;
如果结束;
末端功能;
信号my_ram:ram:=InitRamFromFile(“C:\Users\Mos_X\Desktop\output.txt”);
开始
过程(CLK)
变量X:整数:=0;
变量Y:整数:=0;
开始
如果上升沿(CLK),则
如果EN='0',则

R因此问题在于,即使启用信号为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;
如果上升沿(CLK),则
如果EN='0',则

R如果合成速度慢,你已经要求它做一些艰难的事情,一个有204个位宽端口的三端口RAM(ROM)。您有一个包含三个204位到1位多路复用器的进程。考虑三个RAM(ROM)1位宽或浪费一点内存,并使用4位宽。有一种方法来转换线读取到STDyLogic矢量??我认为我在那里使用read(lineRead,my_ram(i))所做的是不正确的。现在,合成问题对我来说不是什么大问题,我的首要任务是让它工作。当从RAM读取时,您将分配
G
两次。这是有意的吗?你在使用哪种合成工具?这个问题在你的问题中并不明显。标题:如何用VHDL在ram上加载文本文件?其中您添加了一种自己加载ram的方法。好的,这就是我想出来的,但是有一个问题,合成要花很长时间才能完成,所以你认为这里的问题是什么??!,你甚至没有指出问题所在。你是在问如何让它合成吗?在我写所有代码之前,我想知道什么是将文本文件的内容加载到fpga内存中的最有效的方法,但是因为你们都认为这个问题太宽泛了,我不这么认为,所以我继续说出我的想法,试图从中得到一个结果,最后我得到了答案图像将显示在屏幕上,但合成时间约为5-10分钟
 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;