繁体   English   中英

将未知大小的文件行读取为VHDL中的字符串

[英]Read file line of unknown size as string in VHDL

我有的

我正在尝试建立一个测试平台,其中包含一行的文件,可能的字符为“ 1”和“ 0”。 我必须全部阅读它们,并在我的DUT中一一使用。

因此,在我的TB中,我定义了以下过程,以便读取文件并将其值传递给我的DUT。

stim_proc: process

 file input_file: TEXT is in "DatosEntrada.dat";

 variable rdline : LINE;
 variable line_content : string ( 1 to 4);
 variable readed_char : character;

 variable j : integer := 0;

begin       

 while not endfile(input_file) loop

   readline(input_file, rdline);

   --read(rdline, line_content);

   for j in 1 to rdline'length-1 loop

     readed_char := line_content(j);

     if (readed_char = '1') then
       input <= '1';
     else
       input <= '0'; 
     end if;

     wait for clk_period;

   end loop;

 end loop;

end process;

我认为这正在发生

我正在执行第一次readline读取文件的第一行(也是唯一行)。 此后,此循环不应再执行。

然后,来自file的数据应位于rdline 所以我必须处理它。 为了做到这一点,我试图在rdline长度上循环,但是此循环没有执行。

for j in 1 to rdline'length-1 loop

因此,我认为我需要阅读此行才能对其进行循环,然后尝试将其数据移至string var。 问题是像字符串这样的向量var需要具有定义的大小,而我不知道文件行大小

我尝试了什么

我尝试了不同的方法来完成它,例如每次将4个字符从rdline到一个字符串中,进行处理,然后重复。 但是,我无法使其工作。

我在Google上发现了很多有关使用VHDL读取文件的示例,但是它们都是一样的,并且都定义了行格式,例如列或期望的整数,其中我只有一行的未知文本。

我想可以通过以某种方式从rdline var读取来实现,但是我无法实现。 您能帮我编码吗?

先感谢您

您的示例不是MCVE

readed_char := line_content(j); 未加载line_content时不起作用。 否则,您尝试读取值的尝试基本上是合理的。

行的结尾不包含在读取的LINE缓冲区中,没有理由不读取rdline的最后一个字符。 除了水平制表符外,行尾由一个或多个格式执行器发出信号,仅存在行内容。

还有一个推断,您与时钟沿有一定关系,而不仅仅是时钟周期。 以下示例说明了这一点。 请注意,您还可以使用wait for time_value提供距边缘的偏移量。

在循环语句中声明了循环常数。 您声明的变量j与循环使用的j不同。 循环语句将j隐藏在外部声明性区域(process语句中的变量声明)中。

您的代码会将字符串缓冲区中除“ 1”以外的任何其他字符都视为“ 0”。 我没有改变,请演示一下。 您应该意识到其影响。

LINE是分配的字符串,其长度取决于读取文件中一行的长度。 每次您调用readline时,rdline指向的字符串都会更新。 它不会泄漏内存,先前的缓冲区rdline指向释放。 您可以使用'RIGHT属性来读取长度,或者在这种情况下只需消耗所有字符即可。

VHDL工具实现中可能存在行长限制。 除了字符串的最大长度(POSITIVE'RIGHT)外,标准中没有其他定义。

MCVE:

library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;

entity foo is
end entity;

architecture fum of foo is
    signal input:           std_logic ;
    signal clk:             std_logic := '0';
    constant clk_period:    time := 10 ns;
begin

stim_proc: 
    process
        file input_file: TEXT is in "DatosEntrada.dat";
            variable rdline:    LINE;
            -- variable line_content : string ( 1 to 4);
            -- variable readed_char : character;
            -- variable j:         integer := 0;
    begin       
        while not endfile(input_file) loop
            readline(input_file, rdline);
            --read(rdline, line_content);
            -- for j in 1 to rdline'length - 1 loop -- EOL not in rdline
            for j in rdline'range loop
                -- readed_char := line_content(j);
                -- if readed_char = '1' then
                if rdline(j) = '1' then   -- changed
                    input <= '1';
                else
                    input <= '0'; 
                end if;
                -- wait for clk_period;  -- sync to edge instead
                wait until falling_edge(clk); -- input related to clk edge
            end loop;
        end loop;
        wait;     -- added prevents needless loops
    end process;

CLOCK:
    process
    begin
        wait for clk_period/2;
        clk <= not clk;
        if now > 32 * clk_period then
            wait;
        end if;
    end process;

end architecture;

对于DatosEntrada.dat,其中包含:

11011110001HELLO11230000

产生:

foo.png

您可以在其中看到的所有非“ 1”字符都被解释为“ 0”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM