📄 textio.vhd
字号:
elsif v(0)=v(1) and v(0)=v(2) and v(0)=v(3) then
char:= to_char(v(0));
else
char:='?';
end if;
return(char);
end hexchar;
function inttostr( value : INTEGER; base : INTEGER;
numlen : INTEGER :=0; zeros: BOOLEAN:=FALSE) return STRING is
variable str : STRING (1 to MAXSTRLEN);
variable s1 : STRING (MAXSTRLEN downto 1);
variable pos,x,xn,x1 : INTEGER;
begin
x := abs(value);
pos := 0;
while x>0 or pos=0 loop
pos:=pos+1;
xn := x / base;
x1 := x - xn * base ;
x := xn;
s1(pos) := to_char(x1);
end loop;
if value<0 then
pos:=pos+1;
s1(pos):='-';
end if;
if pos>numlen then
str(1 to pos) := s1 (pos downto 1);
str(pos+1) := NUL;
else
case ZEROS is
when TRUE => str := (others => '0');
when FALSE => str := (others => ' ');
end case;
str( (1+numlen-pos) to numlen) := s1(pos downto 1);
str(numlen+1) := NUL;
end if;
return(str);
end inttostr;
function vecttostr( value : std_logic_vector; len : INTEGER; base : INTEGER;
numlen : INTEGER :=0;
zeros: BOOLEAN:=FALSE) return STRING is
variable str : STRING (1 to MAXSTRLEN);
variable s1 : STRING (MAXSTRLEN downto 1);
variable pos, len4 : INTEGER;
variable x : DWORD;
variable vect4 : std_logic_vector(3 downto 0);
begin
x:=value;
if len<32 then
x(31 downto len) := (others =>'0');
end if;
case base is
when 2 => for i in 0 to len-1 loop
s1(i+1) := to_char(value(i));
end loop;
pos:=len;
when 16 => len4 := ((len+3)/4);
for i in 0 to len4-1 loop
vect4 := x( 3+(4*i) downto 4*i);
s1(i+1) := hexchar(vect4);
end loop;
pos:=len4;
when others => s1:=strcopy("ESAB LAGELLI");
end case;
if pos>numlen then
str(1 to pos) := s1 (pos downto 1);
str(pos+1) := NUL;
else
case ZEROS is
when TRUE => str := (others => '0');
when FALSE => str := (others => ' ');
end case;
str( (1+numlen-pos) to numlen) := s1(pos downto 1);
str(numlen+1) := NUL;
end if;
return(str);
end vecttostr;
---------------------------------------------------------------------------
-- Multi Type input handlers
--
function fmt ( x : BOOLEAN) return T_FMT is
variable fm : T_FMT;
begin
fm.f_type := INT;
if x then fm.f_integer := 1;
else fm.f_integer := 0;
end if;
return(fm);
end fmt;
function fmt ( x : INTEGER) return T_FMT is
variable fm : T_FMT;
begin
fm.f_type := INT;
fm.f_integer := x;
return(fm);
end fmt;
function fmt ( x : std_logic_vector) return T_FMT is
variable fm : T_FMT;
begin
fm.f_type := VECT;
fm.f_vector(x'length-1 downto 0) := x;
fm.f_length := x'length;
return(fm);
end fmt;
function fmt ( x : string ) return T_FMT is
variable fm : T_FMT;
begin
fm.f_type := STRG;
fm.f_string(x'range) := x;
if x'length+1<MAXSTRLEN then
fm.f_string(x'length+1) := NUL;
end if;
fm.f_length := x'length;
return(fm);
end fmt;
function fmt ( x : std_logic) return T_FMT is
variable fm : T_FMT;
variable x1 : std_logic_vector ( 0 downto 0);
begin
x1(0) := x;
fm.f_type := VECT;
fm.f_vector(x1'length-1 downto 0) := x1;
fm.f_length := x1'length;
return(fm);
end fmt;
---------------------------------------------------------------------------
-- The Main Print Routine
--
procedure printf( str : TEXTSTR;
Params : T_FMT_ARRAY ) is
--file FSTR : TEXT is out "STD_OUTPUT"; -- Required for MTI Simulation (Veribest change)
--file FSTR : TEXT is out "./output.out"; -- Substitute for Cadence Leapfrog
variable ll : LINE;
variable str1,pstr : STRING (1 to MAXSTRLEN);
variable ip,op,pp,iplen : INTEGER;
variable numlen : INTEGER;
variable zeros : BOOLEAN;
variable more : BOOLEAN;
variable intval : INTEGER;
variable vectval: DWORD;
variable len : INTEGER;
variable ftype : T_NUMTYPE;
begin
iplen := str'length;
ip:=1; op:=0; pp:=params'low;
while ip<= iplen and str(ip)/=NUL loop
if str(ip) = '%' then
more:=TRUE;
numlen:=0; zeros:=FALSE;
while more loop
more:=FALSE;
ip:=ip+1;
ftype := params(pp).f_type;
intval := params(pp).f_integer;
vectval:= params(pp).f_vector;
len := params(pp).f_length;
case str(ip) is
when '0' => ZEROS:=TRUE;
more:=TRUE;
when '1' to '9' =>
numlen:= 10* numlen + character'pos(str(ip))-48;
more := TRUE;
when '%' => pstr := strcopy("%");
when 'd' => case ftype is
when INT => pstr := inttostr(intval,10,numlen,zeros);
when VECT => if is01(vectval,len) then
intval:= conv_integer(vectval(len-1 downto 0));
pstr := inttostr(intval,10,numlen,zeros);
end if;
when others => pstr := strcopy("INVALID PRINTF d:" & str);
end case;
pp:=pp+1;
when 'h' => case ftype is
when INT => pstr := inttostr(intval,16,numlen,zeros);
when VECT => if is01(vectval,len) then
intval:= conv_integer(vectval(len-1 downto 0));
pstr := inttostr(intval,16,numlen,zeros);
end if;
when others => pstr := strcopy("INVALID PRINTF h:" & str);
end case;
pp:=pp+1;
when 'b' => case ftype is
when INT => vectval:= conv_std_logic_vector(intval,32);
len:=1;
for i in 1 to 31 loop
if vectval(i)='1' then
len:=i;
end if;
end loop;
pstr := vecttostr(vectval,len,2,numlen,zeros);
when VECT => pstr := vecttostr(vectval,len,2,numlen,zeros);
when others => pstr := strcopy("INVALID PRINTF b:" & str);
end case;
pp:=pp+1;
when 'x' => case ftype is
when INT => pstr := inttostr(intval,16,numlen,zeros);
when VECT => pstr := vecttostr(vectval,len,16,numlen,zeros);
when others => pstr := strcopy("INVALID PRINTF x:" & str);
end case;
pp:=pp+1;
when 's' => case ftype is
when STRG => pstr:=params(pp).f_string;
when others => pstr := strcopy("INVALID PRINTF s:" & str);
end case;
pp:=pp+1;
when others => pstr := strcopy("ILLEGAL FORMAT");
end case;
end loop;
len := strlen(pstr);
for i in 1 to len loop
str1(op+i) := pstr(i);
end loop;
ip:=ip+1;
op:=op+len;
elsif str(ip)='\' then
case str(ip+1) is
when 'n' => str1(op+1):= NUL;
write( ll , str1 );
-- writeline( FSTR, ll); -- MTI
writeline(STD.TEXTIO.OUTPUT, ll); -- Veribest
op := 0; ip:=ip+1;
str1(op+1) := NUL;
when others =>
end case;
ip:=ip+1;
else
op:=op+1;
str1(op) := str(ip);
ip:=ip+1;
end if;
end loop;
if op>0 then
str1(op+1):=NUL;
write( ll , str1 );
-- writeline(FSTR, ll); -- MTI
writeline(STD.TEXTIO.OUTPUT, ll); -- Veribest
end if;
end printf;
procedure printf( str : TEXTSTR; params : T_FMT ) is
variable f_fmt : T_FMT_ARRAY ( 1 to 1);
begin
f_fmt(1) := params;
printf(str,f_fmt);
end printf;
procedure printf( str : TEXTSTR ) is
variable fm : T_FMT_ARRAY ( 1 to 1);
begin
fm(1).f_type := NONE;
printf(str,fm);
end printf;
procedure ifprintf( enable : BOOLEAN;
str : TEXTSTR;
Params : T_FMT_ARRAY ) is
begin
if enable then
printf(str,params);
end if;
end ifprintf;
procedure ifprintf( enable : BOOLEAN; str : TEXTSTR; params : T_FMT ) is
variable f_fmt : T_FMT_ARRAY ( 1 to 1);
begin
if enable then
f_fmt(1) := params;
printf(str,f_fmt);
end if;
end ifprintf;
procedure ifprintf( enable : BOOLEAN; str : TEXTSTR ) is
variable fm : T_FMT_ARRAY ( 1 to 1);
begin
if enable then
fm(1).f_type := NONE;
printf(str,fm);
end if;
end ifprintf;
end textio;
---------------------------------------------------------------------------
-- This a Test For the above Routines
--
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use work.textio.all;
entity textio_test is
end textio_test;
architecture TB of textio_test is
begin
process
variable dw : std_logic_vector ( 9 downto 0);
variable xx : std_logic_vector(15 downto 0);
begin
wait for 1 ns ;
printf("Textio Test strings v1.2");
printf("Note I think MTI uses variable width Fonts");
xx:= conv_std_logic_vector( 16#AAAA#,16);
printf("Using 04x %04x",fmt(xx));
printf("Using 04u %04u",fmt(xx));
printf("-d...123456 = %d",fmt(123456));
printf("-8d..123456 = %8d",fmt(123456));
printf("-08d.123456 = %08d",fmt(123456));
printf("-02d.123456 = %02d",fmt(123456));
printf("This is a Binary %016b",fmt(16#55AA#));
printf("This is a Decimal %d",fmt(1234));
printf("This is a Hex %h",fmt(16#1234#));
printf("This is a Simple String");
printf("This is a Simple String with a CRLF\nin the middle");
printf("Read Location %d = %h",fmt(123456)&fmt(16#654321#));
printf("-d...-123456 = %d",fmt(-123456));
printf("-d...-123456 = %08d",fmt(-123456));
dw := ( others => '0');
printf("-x...000 = %x",fmt(dw));
dw := "0101010101";
printf("-x...155 = %x",fmt(dw));
printf("-b...155 = %b",fmt(dw));
dw := "0101U10101";
printf("-x...1?5 = %x",fmt(dw));
printf("-b...1?5 = %b",fmt(dw));
dw := "01UUUU0101";
printf("-x...1U5 = %x",fmt(dw));
printf("-b...1U5 = %b",fmt(dw));
wait for 1 ns;
wait;
end process;
end TB;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -