constants declaration

B

Benjamin Todd

does anyone know a quick method of declaring an alternating pattern with a
variable length?

constant FAIL_LOW : std_logic_vector (WATCH_LENGTH-1 downto 0) := (others
=> '0');
-- above is great, you change WATCH_LENGTH and the rest is ok
constant WATCH_STARTUP : std_logic_vector(WATCH_LENGTH-1 downto 0) :=
"10101010";
-- with this you have to make sure you dont forget to re-write the value!

Ben

--
Benjamin Todd
European Organisation for Nuclear Research
Accelerator and Beam -- Control -- Infrastructure Division
CERN, Geneva, Switzerland, CH-1211
Building 864 Room 1 - A24
 
T

Tim Hubberstey

Benjamin said:
does anyone know a quick method of declaring an alternating pattern with a
variable length?

constant FAIL_LOW : std_logic_vector (WATCH_LENGTH-1 downto 0) := (others
=> '0');
-- above is great, you change WATCH_LENGTH and the rest is ok
constant WATCH_STARTUP : std_logic_vector(WATCH_LENGTH-1 downto 0) :=
"10101010";
-- with this you have to make sure you dont forget to re-write the value!

A general solution is to define a function:

function alternate(size : natural) return std_logic_vector is
variable v_result : std_logic_vector(size-1 downto 0);
begin
for i in 0 to size-1 loop
if ( (i mod 2) = 0 ) then
v_result(i) := '0';
else
v_result(i) := '1';
end if;
end loop;
return v_result;
end alternate;

and use it to initialize your constant:

constant FAIL_LOW : std_logic_vector(WATCH_LENGTH-1 downto 0) :=
alternate(WATCH_LENGTH);

A quick and dirty solution is to define a constant that is as large as
WATCH_LENGTH could ever reasonably be, initialize it with your pattern,
and then take a slice of it to initialize your variable size vector:

constant pattern : std_logic_vector(31 downto 0) :=
"10101010101010101010101010101010";
constant FAIL_LOW : std_logic_vector(WATCH_LENGTH-1 downto 0) :=
pattern(WATCH_LENGTH-1 downto 0);

This may be a bit less typing but has obvious problems if you can't put
an upper bound on WATCH_LENGTH.
 
B

Benjamin Todd

thanks!

Tim Hubberstey said:
value!

A general solution is to define a function:

function alternate(size : natural) return std_logic_vector is
variable v_result : std_logic_vector(size-1 downto 0);
begin
for i in 0 to size-1 loop
if ( (i mod 2) = 0 ) then
v_result(i) := '0';
else
v_result(i) := '1';
end if;
end loop;
return v_result;
end alternate;

and use it to initialize your constant:

constant FAIL_LOW : std_logic_vector(WATCH_LENGTH-1 downto 0) :=
alternate(WATCH_LENGTH);

A quick and dirty solution is to define a constant that is as large as
WATCH_LENGTH could ever reasonably be, initialize it with your pattern,
and then take a slice of it to initialize your variable size vector:

constant pattern : std_logic_vector(31 downto 0) :=
"10101010101010101010101010101010";
constant FAIL_LOW : std_logic_vector(WATCH_LENGTH-1 downto 0) :=
pattern(WATCH_LENGTH-1 downto 0);

This may be a bit less typing but has obvious problems if you can't put
an upper bound on WATCH_LENGTH.
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top