Потому что есть несколько способов содрать шкуру с кошки:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- library std;
use std.textio.all;
entity changed_morten is
end entity;
architecture foo of changed_morten is
signal clk: std_logic := '0';
signal rst: std_logic := '1';
signal cnt_1: unsigned (7 downto 0);
signal cnt_3: unsigned (7 downto 0);
function string_it (arg:unsigned) return string is
variable ret: string (1 to arg'LENGTH);
variable str: string (1 to 3); -- enumerated type "'X'"
alias varg: unsigned (1 to arg'LENGTH) is arg;
begin
if arg'LENGTH = 0 then
ret := "";
else
for i in varg'range loop
str := std_logic'IMAGE(varg(i));
ret(i) := str(2); -- the actual character
end loop;
end if;
return ret;
end function;
begin
PRINT:
process (clk) is
variable line_v : line;
variable str: string (1 to 3); -- size matches charcter enumeration
file out_file : text open write_mode is "out.txt";
begin
if rising_edge(clk) then
str := std_logic'IMAGE(rst);
write ( line_v,
str(2) & " " &
string_it(cnt_1) & " " &
string_it(cnt_3) & " "
);
writeline(out_file, line_v);
end if;
end process;
COUNTER1:
process (clk,rst)
begin
if rst = '1' then
cnt_1 <= (others => '0');
elsif rising_edge(clk) then
cnt_1 <= cnt_1 + 1;
end if;
end process;
COUNTER3:
process (clk,rst)
begin
if rst = '1' then
cnt_3 <= (others => '0');
elsif rising_edge(clk) then
cnt_3 <= cnt_3 + 3;
end if;
end process;
RESET:
process
begin
wait until rising_edge(clk);
wait until rising_edge(clk);
wait until rising_edge(clk);
rst <= '0';
wait;
end process;
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
if Now > 210 ns then
wait;
end if;
end process;
end architecture;
И в основном потому, что выражение лица Мортена
"" & std_logic'image(sl)(2); -- "" & character to get string
не принимается ghdl, это не проиндексированное имя, строка безымянная.
Проблема, по-видимому, вызвана тем, что вызов функции ('IMAGE) не распознается как префикс для проиндексированного имени. Для любых пользователей ghdl вы захотите использовать промежуточную целевую строку с именем для вывода вызова функции атрибута (показанной в функции string_it и в строке в процессе PRINT). Я отправил отчет об ошибке.
Дополнение
Другой способ выразить функцию возврата строки to_bstring(sl : std_logic) Мортена:
function to_bstring(sl : std_logic) return string is
variable sl_str_v : string(1 to 3) := std_logic'image(sl); -- character literal length 3
begin
return "" & sl_str_v(2); -- "" & character to get string
end function;
И причина, по которой это работает, заключается в том, что вызовы функций динамически обрабатываются, что означает, что строка sl_str_v создается каждый раз при вызове функции.
См. IEEE Std 1076-1993 12.5 Dynamic Elaboration, b.:
Выполнение вызова подпрограммы включает в себя разработку списка параметров интерфейса соответствующего объявления подпрограммы; это включает разработку каждого объявления интерфейса для создания соответствующих формальных параметров. Затем фактические параметры связываются с формальными параметрами. Наконец, если указатель подпрограммы не украшен атрибутом FOREIGN, определенным в пакете STANDARD, декларативная часть тела соответствующей подпрограммы разрабатывается и выполняется последовательность операторов в теле подпрограммы.
Описание динамической обработки вызова подпрограммы немного расширено в IEEE Std 1076-2008, 14.6.
person
Community
schedule
21.06.2014