Integer with leading zeros to string

H

hssig

Hi,

I have the following integer declaration:

signal test_num : integer := 0555;

Now I want to make a string out of it:

signal test_string : string (1 to 4);
begin
test_string <= integer'image(test_num);

Modelsim complains "Array lengths do not match. Left is 4 (1 to 4).
Right is 3 (1 to 3)."

How can I convert test_num (ranging from 0001 to 9999) to a string
correctly taking into account the leading zeros?

Cheers,
hssig
 
H

hssig

The following should be displayed:


report "This should be displayed " & integer'image(test_num) severity
note;

-> This should be displayed 0555

cheers,
hssig
 
J

Jonathan Bromley

How can I convert test_num (ranging from 0001 to 9999) to a string
correctly taking into account the leading zeros?

Don't forget that the integer doesn't know about leading
zeros. You are entitled to write them in the integer literal,
but they are of course NOT stored in the integer itself. So
you need a format mechanism:

function format(
value : natural; --- the numeric value
width : positive; -- number of characters
leading : character := ' ')
return string --- guarantees to return "width" chars
is
constant img: string := integer'image(value);
variable str: string(1 to width) := (others => leading);
begin
if img'length > width then
report "Format width " & integer'image(width)
& " is too narrow for value " & img
severity warning;
str := (others => '*');
else
str(width+1-img'length to width) := img;
end if;
return str;
end;

....

---- this line should give "0055"
constant N: integer := 55;
report "value is " & format(integer'image(N), 4, '0');

Any use?

Dealing with negative integers is left as an exercise :)
 
J

Jonathan Bromley

function format(
value : natural; --- the numeric value
width : positive; -- number of characters
leading : character := ' ')
return string --- guarantees to return "width" chars
[...]

constant N: integer := 55;
report "value is " & format(integer'image(N), 4, '0');

oops, obviously the first argument should
be N rather than integer'image(N).
Hasty end-of-working-day post.
 
A

Andy

Don't forget that the integer doesn't know about leading
zeros.  You are entitled to write them in the integer literal,
but they are of course NOT stored in the integer itself.  So
you need a format mechanism:

VHDL integers do store leading zeroes, up to at least 32 binary bits
total. However, as you stated, standard output formats do not display
them. Just because you initialize an integer with a literal which
happens to be formatted with leading zeroes does not mean that the
display output from that same integer will automatically be formatted
with leading zeroes.

Andy
 
J

Jonathan Bromley

VHDL integers do store leading zeroes, up to at least 32 binary bits
total. However, as you stated, standard output formats do not display
them. Just because you initialize an integer with a literal which
happens to be formatted with leading zeroes does not mean that the
display output from that same integer will automatically be formatted
with leading zeroes.

yeah, guess I didn't say very clearly what I meant :)

let's try again: there is no information stored in the
integer variable that indicates whether or not its
original textual representation had leading zeros (and,
indeed, no information about any other aspect of its
original textual representation except the integer's
numeric value).

Ho hum....

Jonathan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,576
Members
45,054
Latest member
LucyCarper

Latest Threads

Top