簡體   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