Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > VHDL > Using Altera LPM megafunctions in Quartus II and VHDL in general

Reply
Thread Tools

Using Altera LPM megafunctions in Quartus II and VHDL in general

 
 
Shannon
Guest
Posts: n/a
 
      08-18-2006
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
 
Reply With Quote
 
 
 
 
Mike Treseler
Guest
Posts: n/a
 
      08-18-2006
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

 
Reply With Quote
 
 
 
 
KJ
Guest
Posts: n/a
 
      08-18-2006

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

 
Reply With Quote
 
Mike Treseler
Guest
Posts: n/a
 
      08-18-2006
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
 
Reply With Quote
 
Shannon
Guest
Posts: n/a
 
      08-18-2006
On Fri, 18 Aug 2006 11:41:32 -0700, Mike Treseler
<(E-Mail Removed)> 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
 
Reply With Quote
 
David Ashley
Guest
Posts: n/a
 
      08-18-2006
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
 
Reply With Quote
 
KJ
Guest
Posts: n/a
 
      08-20-2006
>>> 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


 
Reply With Quote
 
Ben Twijnstra
Guest
Posts: n/a
 
      08-20-2006
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
 
Reply With Quote
 
Mark McDougall
Guest
Posts: n/a
 
      08-21-2006
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
 
Reply With Quote
 
KJ
Guest
Posts: n/a
 
      08-21-2006

"Mark McDougall" <(E-Mail Removed)> wrote in message
news:44e90499$0$4137$(E-Mail Removed)...
>
> 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


 
Reply With Quote
 
 
 
Reply

Thread Tools

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 Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Altera Quartus, libraries and mixed VHDL / (SYSTEM)VERILOG error Peter Bluer VHDL 1 01-07-2010 06:05 PM
Quartus II LPM simulation feiman VHDL 0 02-12-2009 11:06 AM
Altera Quartus II VHDL code compilation process ssylee VHDL 1 10-26-2008 06:40 AM
portable (VHDL) vs. non-portable (altera LPM) approaches to signed computations Eli Bendersky VHDL 1 03-01-2006 02:43 PM
Adding constraints in Simplify and Altera Quartus Juan Carlos Allica VHDL 2 01-25-2006 12:28 PM



Advertisments