FPGA Central - World's 1st FPGA / CPLD Portal

FPGA Central

World's 1st FPGA Portal

 

Go Back   FPGA Groups > NewsGroup > VHDL

VHDL comp.lang.vhdl newsgroup / Usenet

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 11-21-2006, 09:37 AM
kclo4
Guest
 
Posts: n/a
Default Sign extension

Hi everybody,

I'd like to know if there is any smart way to extend the sign of
std_logic_vector

for exemple :

data_in : in std_logic_vector(11 downto 0);
data_out : out std_logic_vector(13 downto 0);

I want to adjust data_in to data_out size, so what i used to do is:

data_out <= data_in(11) & data_in(11) & data_in;

But for huge different size it's painfull and not really nice.
Is there a smarter way to do it?? May be I should do a function with a
loop that do it??

Thank you
Reply With Quote
  #2 (permalink)  
Old 11-21-2006, 09:54 AM
Nicolas Matringe
Guest
 
Posts: n/a
Default Re: Sign extension

kclo4 a écrit :
> Hi everybody,
>
> I'd like to know if there is any smart way to extend the sign of
> std_logic_vector
>
> for exemple :
>
> data_in : in std_logic_vector(11 downto 0);
> data_out : out std_logic_vector(13 downto 0);
>
> I want to adjust data_in to data_out size, so what i used to do is:
>
> data_out <= data_in(11) & data_in(11) & data_in;
>
> But for huge different size it's painfull and not really nice.
> Is there a smarter way to do it?? May be I should do a function with a
> loop that do it??


Use ieee.numeric_std package, signed vectors instead of std_logic_vector
and resize function.

data_out <= resize(data_in, data_out'length);

Nicolas
Reply With Quote
  #3 (permalink)  
Old 11-21-2006, 01:29 PM
OL
Guest
 
Posts: n/a
Default Re: Sign extension

kclo4 a écrit :
> Hi everybody,
>
> I'd like to know if there is any smart way to extend the sign of
> std_logic_vector
>
> for exemple :
>
> data_in : in std_logic_vector(11 downto 0);
> data_out : out std_logic_vector(13 downto 0);
>
> I want to adjust data_in to data_out size, so what i used to do is:
>
> data_out <= data_in(11) & data_in(11) & data_in;
>
> But for huge different size it's painfull and not really nice.
> Is there a smarter way to do it?? May be I should do a function with a
> loop that do it??
>
> Thank you


You have it for free in the std_logic_arith package:
function SXT(ARG: STD_LOGIC_VECTOR; SIZE: INTEGER) return STD_LOGIC_VECTOR;

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
[...]
data_out <= SXT(data_in, data_out'LENGTH);

You also have the EXT function, which is the simple extension function
_without_ sign extension.
Reply With Quote
  #4 (permalink)  
Old 11-21-2006, 01:55 PM
Andy
Guest
 
Posts: n/a
Default Re: Sign extension

Many users don't recommend using non-ieee packages such as
std_logic_arith, etc. that were developed by synopsys and compiled into
the ieee library without ieee permission/standardization. Since they
are not standard, their implementation can and does vary between
vendors of simulation and synthesis tools.

Better to type a little more and use ieee standard packages that are
uniform in their implementation across all vendors. If you need to keep
data_in and data_out as SLV:

data_out <= std_logic_vector(resize(signed(data_in), data_out'length));

Andy


OL wrote:
> kclo4 a écrit :
> > Hi everybody,
> >
> > I'd like to know if there is any smart way to extend the sign of
> > std_logic_vector
> >
> > for exemple :
> >
> > data_in : in std_logic_vector(11 downto 0);
> > data_out : out std_logic_vector(13 downto 0);
> >
> > I want to adjust data_in to data_out size, so what i used to do is:
> >
> > data_out <= data_in(11) & data_in(11) & data_in;
> >
> > But for huge different size it's painfull and not really nice.
> > Is there a smarter way to do it?? May be I should do a function with a
> > loop that do it??
> >
> > Thank you

>
> You have it for free in the std_logic_arith package:
> function SXT(ARG: STD_LOGIC_VECTOR; SIZE: INTEGER) return STD_LOGIC_VECTOR;
>
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_SIGNED.ALL;
> [...]
> data_out <= SXT(data_in, data_out'LENGTH);
>
> You also have the EXT function, which is the simple extension function
> _without_ sign extension.


Reply With Quote
  #5 (permalink)  
Old 11-21-2006, 01:57 PM
Andy
Guest
 
Posts: n/a
Default Re: Sign extension

Or if you use appropriately constrained subtypes of integer for
data_out and data_in:

data_out <= data_in;

Andy


Nicolas Matringe wrote:
> kclo4 a écrit :
> > Hi everybody,
> >
> > I'd like to know if there is any smart way to extend the sign of
> > std_logic_vector
> >
> > for exemple :
> >
> > data_in : in std_logic_vector(11 downto 0);
> > data_out : out std_logic_vector(13 downto 0);
> >
> > I want to adjust data_in to data_out size, so what i used to do is:
> >
> > data_out <= data_in(11) & data_in(11) & data_in;
> >
> > But for huge different size it's painfull and not really nice.
> > Is there a smarter way to do it?? May be I should do a function with a
> > loop that do it??

>
> Use ieee.numeric_std package, signed vectors instead of std_logic_vector
> and resize function.
>
> data_out <= resize(data_in, data_out'length);
>
> Nicolas


Reply With Quote
  #6 (permalink)  
Old 11-21-2006, 04:13 PM
Ralf Hildebrandt
Guest
 
Posts: n/a
Default Re: Sign extension

Nicolas Matringe schrieb:


> Use ieee.numeric_std package, signed vectors instead of std_logic_vector
> and resize function.
>
> data_out <= resize(data_in, data_out'length);


Respectively with std_ulogic_vector and the desired conversions:

-- either
data_out<=std_ulogic_vector(resize(unsigned(data_i n), data_out'length));
-- or
data_out<=std_ulogic_vector(resize( signed(data_in), data_out'length));

(I only want to point it out that sign extension of std_ulogic_vectors
strongly depends on the fact whether signed or unsigned data
representation is desired.)

Ralf
Reply With Quote
  #7 (permalink)  
Old 11-21-2006, 10:30 PM
Andy
Guest
 
Posts: n/a
Default Re: Sign extension

There is no "sign extension" of unsigned representations, since there
is no sign bit. A resize of an unsigned representation to a larger size
just appends enough zeroes to fit, whereas sign extension replicates
the MSB enough times to fit.

The numeric_std.resize() function is overloaded to perform a sign
extend operation when called with a signed argument and return value
(assuming it is increasing the size of the argument).

Andy


Ralf Hildebrandt wrote:
> Nicolas Matringe schrieb:
>
>
> > Use ieee.numeric_std package, signed vectors instead of std_logic_vector
> > and resize function.
> >
> > data_out <= resize(data_in, data_out'length);

>
> Respectively with std_ulogic_vector and the desired conversions:
>
> -- either
> data_out<=std_ulogic_vector(resize(unsigned(data_i n), data_out'length));
> -- or
> data_out<=std_ulogic_vector(resize( signed(data_in), data_out'length));
>
> (I only want to point it out that sign extension of std_ulogic_vectors
> strongly depends on the fact whether signed or unsigned data
> representation is desired.)
>
> Ralf


Reply With Quote
  #8 (permalink)  
Old 11-22-2006, 08:41 AM
Ralf Hildebrandt
Guest
 
Posts: n/a
Default Re: Sign extension

Andy schrieb:

> There is no "sign extension" of unsigned representations, since there
> is no sign bit. A resize of an unsigned representation to a larger size
> just appends enough zeroes to fit, whereas sign extension replicates
> the MSB enough times to fit.


Yes, I know - but I wanted to point out, that nobody can say, what is
inside a std_logic_vector: just bits, signed or unsigned data.
And even adding zeros while resizing an unsigned vector is some kind of
sign extension, because an unsigned vector has always an implicit zero
as sign.

Ralf
Reply With Quote
  #9 (permalink)  
Old 11-22-2006, 06:51 PM
Magne Munkejord
Guest
 
Posts: n/a
Default Re: Sign extension

kclo4 wrote:
> Hi everybody,
>
> I'd like to know if there is any smart way to extend the sign of
> std_logic_vector
>
> for exemple :
>
> data_in : in std_logic_vector(11 downto 0);
> data_out : out std_logic_vector(13 downto 0);
>
> I want to adjust data_in to data_out size, so what i used to do is:
>
> data_out <= data_in(11) & data_in(11) & data_in;
>
> But for huge different size it's painfull and not really nice.
> Is there a smarter way to do it?? May be I should do a function with a
> loop that do it??
>
> Thank you



Don't need any libraries or loops if you do this:

data_out(11 downto 0) <= data_in;
data_out(13 downto 12) <= (13 downto 12 => data_in(11));
Reply With Quote
  #10 (permalink)  
Old 11-22-2006, 09:21 PM
Nicolas Matringe
Guest
 
Posts: n/a
Default Re: Sign extension

Ralf Hildebrandt a écrit :

> (I only want to point it out that sign extension of std_ulogic_vectors
> strongly depends on the fact whether signed or unsigned data
> representation is desired.)


I assumed that sign extension was only needed for signed vectors.

Nicolas
Reply With Quote
  #11 (permalink)  
Old 11-23-2006, 09:38 AM
Alexis GABIN
Guest
 
Posts: n/a
Default Re: Sign extension

Thanks you all for your usefull answers,


> Don't need any libraries or loops if you do this:
>
> data_out(11 downto 0) <= data_in;
> data_out(13 downto 12) <= (13 downto 12 => data_in(11));


I like this way but shouldn't it be? :
data_out(13 downto 12) <= (others => data_in(11));

Probably both work?, I will try myself to check

Thanks

alexis


Reply With Quote
Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Sign extension issue in Xilinx Multiplier CoreGen version10 Vivek Menon FPGA 1 12-16-2008 07:24 PM
Systemverilog array: .sum(), but not sign-extension? atass Verilog 3 11-20-2008 09:06 AM
16 to 32 bit Sign Extention Mahurshi Akilla Verilog 3 04-24-2007 05:56 PM
. What is the sign-and-magnitude of the following 4's complement number? (Leave answer in base 4). [email protected] FPGA 4 12-14-2006 07:42 AM
UNSIGNED and sign exteension andy VHDL 2 11-16-2004 06:47 PM


All times are GMT +1. The time now is 11:55 AM.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright 2008 @ FPGA Central. All rights reserved