Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   VHDL (http://www.velocityreviews.com/forums/f18-vhdl.html)
-   -   Using Altera LPM megafunctions in Quartus II and VHDL in general (http://www.velocityreviews.com/forums/t365142-using-altera-lpm-megafunctions-in-quartus-ii-and-vhdl-in-general.html)

Shannon 08-18-2006 01:33 PM

Using Altera LPM megafunctions in Quartus II and VHDL in general
 
Hello all.

I've successfully used an LPM counter in my code but I can't help
feeling that I just got lucky. Something seems missing. I used the
"Megawizard thingy".

I cut and pasted the component declaration from one of the files it
created and I cut and pasted the component instantiation from one of
the files it created (editing it for my code of course). Then I added
the vhdl file it created to my project in the project window. That's
it.

I feel like I'm getting away with this but it's not rigorous.
Shouldn't I need a library use clause or something? I'd like to say
again that everything is working fine but it just seems like something
is being assumed and when I try to move this code elsewhere its going
to break.

Shannon

Mike Treseler 08-18-2006 03:22 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
Shannon wrote:

> I've successfully used an LPM counter in my code but I can't help
> feeling that I just got lucky. Something seems missing. I used the
> "Megawizard thingy".


Portability and simplicity are missing.
On the upside, you were able to get something
working without first learning vhdl for synthesis.

> I cut and pasted the component declaration from one of the files it
> created and I cut and pasted the component instantiation from one of
> the files it created (editing it for my code of course). Then I added
> the vhdl file it created to my project in the project window. That's
> it.


The alternative is to
declare a variable (or signal)
for the counter and add this
single line to your clocked process:

a_v := a_v + 1;

Then you can use the counter value a_v
for whatever you like in the rest of the
process. No components or instances required.

> I feel like I'm getting away with this but it's not rigorous.
> Shouldn't I need a library use clause or something? I'd like to say
> again that everything is working fine but it just seems like something
> is being assumed and when I try to move this code elsewhere its going
> to break.


If you don't mind the code clutter, all will be fine
until you change devices to one of the many
not made by Altera. Your lpm components are
just syntax errors to brands X, Y and Z.
This is deal you make with the wizard.

Learn synthesis or be prepared to redo
your design.

Have a look at the "clk enabled counters" example here
http://home.comcast.net/~mike_treseler/
for one way to write portable counters.

-- Mike Treseler


KJ 08-18-2006 04:05 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 

Mike Treseler wrote:
> Your lpm components are
> just syntax errors to brands X, Y and Z.
> This is deal you make with the wizard.


Actually 'LPM' (Library of parameterizable modules) is fairly portable
and is (I think) an EIA standard it's the MegaWizard produced files
that are not and are specific to company 'A'. Within LPM, besides the
stupid things like 'and', 'or', etc. there are some useful ones like
'lpm_divide', 'lpm_ram', 'lpm_rom', 'lpm_fifo' (and variants on those).
But you don't need a wizard to use these parts either, you simply
instantiate the lpm component hooking up signals, defining the
generics, etc just like you would any other entity.

Kevin


Mike Treseler 08-18-2006 06:41 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
KJ wrote:

> Actually 'LPM' (Library of parameterizable modules) is fairly portable
> and is (I think) an EIA standard


The lpm models were written by Altera and
were held by the now-defunct edif.org in
the public domain. The models had complex
string generics and were designed to be
fronted by a wizard application to
collect and fill in the option strings.
The files were last updated by Altera in 1999
and are now held by eia.

Xilinx has tolerated the models for synthesis
but you can find very little information
about lpm on their website.
Xilinx infers matching netlists, but
they are not named lpm.
Altera supports
the existing models, but there has not been
a new one in a long time.

> it's the MegaWizard produced files
> that are not and are specific to company 'A'. Within LPM, besides the
> stupid things like 'and', 'or', etc. there are some useful ones like
> 'lpm_divide', 'lpm_ram', 'lpm_rom', 'lpm_fifo' (and variants on those).
> But you don't need a wizard to use these parts either,


True for Altera. Tough otherwise since the source
code is no longer public.

> you simply
> instantiate the lpm component hooking up signals, defining the
> generics, etc just like you would any other entity.


Quartus will also infer these for you from code.


-- Mike Treseler

Shannon 08-18-2006 07:13 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
On Fri, 18 Aug 2006 11:41:32 -0700, Mike Treseler
<mike_treseler@comcast.net> wrote:

>KJ wrote:
>
>> Actually 'LPM' (Library of parameterizable modules) is fairly portable
>> and is (I think) an EIA standard

>
>The lpm models were written by Altera and
>were held by the now-defunct edif.org in
>the public domain. The models had complex
>string generics and were designed to be
>fronted by a wizard application to
>collect and fill in the option strings.
>The files were last updated by Altera in 1999
>and are now held by eia.
>
>Xilinx has tolerated the models for synthesis
>but you can find very little information
>about lpm on their website.
>Xilinx infers matching netlists, but
>they are not named lpm.
>Altera supports
>the existing models, but there has not been
>a new one in a long time.
>
>> it's the MegaWizard produced files
>> that are not and are specific to company 'A'. Within LPM, besides the
>> stupid things like 'and', 'or', etc. there are some useful ones like
>> 'lpm_divide', 'lpm_ram', 'lpm_rom', 'lpm_fifo' (and variants on those).
>> But you don't need a wizard to use these parts either,

>
>True for Altera. Tough otherwise since the source
>code is no longer public.
>
>> you simply
>> instantiate the lpm component hooking up signals, defining the
>> generics, etc just like you would any other entity.

>
>Quartus will also infer these for you from code.
>
>
> -- Mike Treseler


It seems a bit much just for a simple counter to have to write piles
of code like Mike linked to in his first response. That is why the lpm
counter seemed so simple to me. The lpm counter made the code look
nice and clean and neat and readable. Also, I assumed the lpm code
had been properly tested and vetted so that it reduces the amount of
code testing/debuging I need to do.

Harsh comments from Mike aside, what would be the "correct" way of
creating a "clean" reusable counter that includes: clock, count
enable, synchronous load, data in, and data out?

As an aside to Mike I'd like to add this:

I'm old school on the net and so my skin is pretty thick. But you
might want to conscider toning down your snide comments a bit. Act
like the person you are responding to is right in the room with you.
Maybe even act like he is a customer. I'm sure you have lots of good
things to say to help out newbies but acting like a jerk gets in the
way. I don't want to start a flame war here. My email address is
visible. I would be happy to take this offline.

Shannon

David Ashley 08-18-2006 10:12 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
Shannon wrote:
> As an aside to Mike I'd like to add this:
>
> I'm old school on the net and so my skin is pretty thick. But you
> might want to conscider toning down your snide comments a bit. Act
> like the person you are responding to is right in the room with you.
> Maybe even act like he is a customer. I'm sure you have lots of good
> things to say to help out newbies but acting like a jerk gets in the
> way. I don't want to start a flame war here. My email address is
> visible. I would be happy to take this offline.
>
> Shannon


Shannon,

Sorry to butt in here, I have nothing to contribute to this discussion
technically except that as a beginner myself I'm very afraid of the
wizard approach to developing solutions. It seems like if you use the
wizard you can point and click and without really having any clue
what you just did, or what is going on behind the scenes, you've got
something to work! But what have you done? And I've seen as soon
as something comes up that isn't that trivial, you have to then go to
a massive amount of effort to work *around* the wizard abstraction
to add your own VHDL code and get it integrated...my experience
comes from watching someone else fight the Xilinx tools.

Bottom line there is the wizard seems to be a crutch that maybe makes
a newby feel productive, but in the end you might be better off
without it. Just edit the raw VHDL directly and build up a library of
your own VHDL source you can draw upon. The wizards seem to
be done for marketing hype -- do professionals in the industry who
are here to stay really depend on them? I don't know, I'm not a
professional yet.

Anyway the real point of this post -- I didn't read anything in Mike's
posts in this thread that seemed harsh or snide -- was there some
posting I missed? None of my business except as a curious lurker.

-Dave

KJ 08-20-2006 01:47 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
>>> it's the MegaWizard produced files
>>> that are not and are specific to company 'A'. Within LPM, besides the
>>> stupid things like 'and', 'or', etc. there are some useful ones like
>>> 'lpm_divide', 'lpm_ram', 'lpm_rom', 'lpm_fifo' (and variants on those).
>>> But you don't need a wizard to use these parts either,

>>
>>True for Altera. Tough otherwise since the source
>>code is no longer public.
>>

Synplicity also supports LPM which, for those people who use that tool,
makes the vendor choice moot since Synplify is not tied to brand 'A' or 'X'.

>>> you simply
>>> instantiate the lpm component hooking up signals, defining the
>>> generics, etc just like you would any other entity.

>>
>>Quartus will also infer these for you from code.
>>


While I agree that lpm_counter (and a good chunk of lpm as well) would be
better off written more clearly simply in VHDL or Verilog than it would be
to instantate the lpm part I do not agree that things like lpm_divide and
lpm_fifo would fit into that same mold at least not at this moment in time.
Re-writing code to implement a fifo or a divider is wasted time unless done
for the learning experience in which case it may be time well spent.

> It seems a bit much just for a simple counter to have to write piles
> of code like Mike linked to in his first response. That is why the lpm
> counter seemed so simple to me. The lpm counter made the code look
> nice and clean and neat and readable.


And that is pretty much the deciding factor....what makes the code "look
nice and clean and neat and readable" which I think would translate into
"more readily supportable" which should be a goal (albeit hard to measure)
of anyone writing code.

Mike's point (with which I agree) is that for the case of a counter in a
real design it will be much more understandable to simply write 'x := x + 1'
then it would be to instantiate lpm_counter.

> Also, I assumed the lpm code
> had been properly tested and vetted so that it reduces the amount of
> code testing/debuging I need to do.
>

Yes it has. If the tool supports it (and several do support lpm) than
you're correct.

KJ



Ben Twijnstra 08-20-2006 07:27 PM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
Shannon wrote:

> Harsh comments from Mike aside, what would be the "correct" way of
> creating a "clean" reusable counter that includes: clock, count
> enable, synchronous load, data in, and data out?


Counters are easily written - like some other posters already said, just
declare a signal, and, when appropriate say something like

-- At the top of your file say
library ieee;
use ieee.std_logic_1164.all;
use ieee.num_std.all;

-- somewhere in the architecture declaration area, say
signal data_out : unsigned(0 to 999);
-- assume data_in to be an unsigned(0 to 999) on the entity port list
-- assume clock, count_enable and sync_load to be std_logic
....
-- Now, somewhere in the actual architecture body say

instance_name: process(clock, count_enable, data_in)
begin
if rising_edge(clock) then
if sync_load = '1' then
data_out <= data_in;
elsif count_enable = '1' then
data_out <= data_out + 1;
end if;
end if;
end process;

See how easy this is?

Now, with division, things are a lot more difficult. Especially if I can't
think my way out of using a divider, I'll allways use a wizard-generated
divider - greater minds than mine have sweated over the efficient
algorithms that are used in those beasts. For a multiplier I simply use
the '*' operator - life can be so simple...

Best regards,


Ben

Mark McDougall 08-21-2006 12:57 AM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 
Shannon wrote:

> I cut and pasted the component declaration from one of the files it
> created and I cut and pasted the component instantiation from one of
> the files it created (editing it for my code of course). Then I added
> the vhdl file it created to my project in the project window. That's
> it.


I think everyone in this thread has gone out on a tangent and he
responses have nothing to do with the question Shannon actually asked!?!

The point is not whether or not using the LPM is portable or even the
best solution for a counter (clearly it's not) but whether or not
Shannon is using the LPM component correctly.

In short Shannon, yes, that's exactly what you need to do. The
megawizard "thingy" merely assists in parameterising the component with
a point-and-click interface. You could of course achieve exactly the
same in pure VHDL yourself - you'd end up with the component declaration
and the VHDL file you included from the megawizard output.

Naturally you also need to instantiate your component, hence the second
step you took. The third step, adding the VHDL file, just imports the
(thin) wrapper that the megawizard created with all your parameters for
that particular instance.

As for including libraries etc, you notice the wrapper VHDL file you
included uses the altera_mf_components library.

Regards

--
Mark McDougall, Engineer
Virtual Logic Pty Ltd, <http://www.vl.com.au>
21-25 King St, Rockdale, 2216
Ph: +612-9599-3255 Fax: +612-9599-3266

KJ 08-21-2006 02:41 AM

Re: Using Altera LPM megafunctions in Quartus II and VHDL in general
 

"Mark McDougall" <markm@vl.com.au> wrote in message
news:44e90499$0$4137$5a62ac22@per-qv1-newsreader-01.iinet.net.au...
>
> I think everyone in this thread has gone out on a tangent and he
> responses have nothing to do with the question Shannon actually asked!?!
>


Well, to be fair there were some implicit questions in the original post
regarding portability of the code that has been produced. But I see you've
continued the tradition of going off on a tangent by yourself not answering
the one single question that was in the original post (pasted below for
those that forgot)

> I feel like I'm getting away with this but it's not rigorous.
> Shouldn't I need a library use clause or something?


The answer: No the library use clause is not needed if you use direct
instantiation (i.e.something of the form U1 : entity work.MyComponent port
map(...);

KJ




All times are GMT. The time now is 01:41 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.