Site Home   Archive Home   FAQ Home   How to search the Archive   How to Navigate the Archive   
Compare FPGA features and resources   

Threads starting:
1994JulAugSepOctNovDec1994
1995JanFebMarAprMayJunJulAugSepOctNovDec1995
1996JanFebMarAprMayJunJulAugSepOctNovDec1996
1997JanFebMarAprMayJunJulAugSepOctNovDec1997
1998JanFebMarAprMayJunJulAugSepOctNovDec1998
1999JanFebMarAprMayJunJulAugSepOctNovDec1999
2000JanFebMarAprMayJunJulAugSepOctNovDec2000
2001JanFebMarAprMayJunJulAugSepOctNovDec2001
2002JanFebMarAprMayJunJulAugSepOctNovDec2002
2003JanFebMarAprMayJunJulAugSepOctNovDec2003
2004JanFebMarAprMayJunJulAugSepOctNovDec2004
2005JanFebMarAprMayJunJulAugSepOctNovDec2005
2006JanFebMarAprMayJunJulAugSepOctNovDec2006
2007JanFebMarAprMayJunJulAugSepOctNovDec2007
2008JanFebMarAprMayJunJulAugSepOctNovDec2008
2009JanFebMarAprMayJunJulAugSepOctNovDec2009
2010JanFebMarAprMayJunJulAugSepOctNovDec2010
2011JanFebMarAprMayJunJulAugSepOctNovDec2011
2012JanFebMarAprMayJunJulAugSepOctNovDec2012
2013JanFebMarAprMayJunJulAugSepOctNovDec2013
2014JanFebMarAprMayJunJulAugSepOctNovDec2014
2015JanFebMarAprMayJunJulAugSepOctNovDec2015
2016JanFebMarAprMayJunJulAugSepOctNovDec2016
2017JanFebMarAprMayJunJulAugSepOctNovDec2017
2018JanFebMarAprMayJunJulAugSepOctNovDec2018
2019JanFebMarAprMayJunJulAugSepOctNovDec2019
2020JanFebMarAprMay2020

Authors:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Custom Search

Messages from 154825

Article: 154825
Subject: Re: Chisel as alternative HDL
From: David Brown <david@westcontrol.removethisbit.com>
Date: Wed, 16 Jan 2013 13:30:12 +0100
Links: << >>  << T >>  << A >>
On 16/01/13 06:35, Jecel wrote:
> On Tuesday, January 15, 2013 8:30:10 PM UTC-2, Andy wrote:
>> Diff (in CVS) does a horrible job! Try something capable like 
>> BeyondCompare. Even the comparison capapilities in TortoiseSVN are 
>> better than CVS/diff (I have not tried tortoiseCVS, it may be very 
>> similar to tortoiseSVN).
> 
> Thanks for the tip. I was talking about the diff tools normally found
> in Linux. But my point was that while it is an easier problem to
> solve for text than for graphics, it isn't always well done for text
> and I hope I can get good results for graphics.

For graphics or other binary files, you are entirely dependent on
external programs.  I know that Altium Designer has support for
subversion, and can show differences between schematic versions quite
well.  And LibreOffice can be used to show differences between
documents.  But for many types of graphics there is no good way to show
a difference.

For Linux, you can use RabbitSVN as a plug-in to Nautilus in much the
same way as TortoiseSVN in Windows, and Meld as a good gui for comparing
text files.


Article: 154826
Subject: IP core implementation of multiplier on FPGA Spartan 3e
From: deepak <dpk.losser@gmail.com>
Date: Wed, 16 Jan 2013 06:10:46 -0800 (PST)
Links: << >>  << T >>  << A >>
i was tryin to implement an ip core of multiplier on fpga spartan 3e,but in the synthesysing process it is showing some error about routing problems.

Article: 154827
Subject: Re: IP core implementation of multiplier on FPGA Spartan 3e
From: Jon <jon@beniston.com>
Date: Wed, 16 Jan 2013 07:43:41 -0800 (PST)
Links: << >>  << T >>  << A >>
Can you describe the multiplier? (Width, anything special about it, does it use the multiplication operator)

Is it using the embedded h/w multipliers in the s3e? What's the exact error message?

Jon


Article: 154828
Subject: Re: Chisel as alternative HDL
From: Andy <jonesandy@comcast.net>
Date: Wed, 16 Jan 2013 08:30:49 -0800 (PST)
Links: << >>  << T >>  << A >>
On Jan 16, 6:30=A0am, David Brown <da...@westcontrol.removethisbit.com>
wrote:
> For Linux, you can use RabbitSVN as a plug-in to Nautilus in much the
> same way as TortoiseSVN in Windows, and Meld as a good gui for comparing
> text files.

Thanks for the pointers on linux tools. Did you mean "RabbitVCS"?

RabbitVCS looks promising, but it is still version 0.15.1 (maybe a
little immature yet for professional use, e.g. something we would
deploy and recommend to the development teams).

Meld looks really good, and appears a little more mature.

Andy

Article: 154829
Subject: Re: Chisel as alternative HDL
From: Rob Gaddi <rgaddi@technologyhighland.invalid>
Date: Wed, 16 Jan 2013 09:19:28 -0800
Links: << >>  << T >>  << A >>
On Wed, 16 Jan 2013 08:30:49 -0800 (PST)
Andy <jonesandy@comcast.net> wrote:

> On Jan 16, 6:30=C2=A0am, David Brown <da...@westcontrol.removethisbit.com>
> wrote:
> > For Linux, you can use RabbitSVN as a plug-in to Nautilus in much the
> > same way as TortoiseSVN in Windows, and Meld as a good gui for comparing
> > text files.
>=20
> Thanks for the pointers on linux tools. Did you mean "RabbitVCS"?
>=20
> RabbitVCS looks promising, but it is still version 0.15.1 (maybe a
> little immature yet for professional use, e.g. something we would
> deploy and recommend to the development teams).
>=20
> Meld looks really good, and appears a little more mature.
>=20
> Andy

Rabbit's definitely a bit immature if you want to compare it to
Tortoise.  I find I still do half of my SVN management from the command
line rather than using it; thinks like copying and status checking.

I use meld as my visual diff tool, and it's absolutely great.

--=20
Rob Gaddi, Highland Technology -- www.highlandtechnology.com
Email address domain is currently out of order.  See above to fix.


Article: 154830
Subject: Re: Chisel as alternative HDL
From: Andy <jonesandy@comcast.net>
Date: Wed, 16 Jan 2013 09:26:18 -0800 (PST)
Links: << >>  << T >>  << A >>
I'm not saying there are things  you "can't" do in graphical entry, or
that only text entry can do, just that there are lots of things that
are (much) better done in text.

When you are dealing with HDL issues, there is a standard of
compliance (well, at least a workable one with VHDL), whereas there is
no non-proprietary standard for graphical entry representations or
file formats, except at the final output stage (an HDL).

If my "source" is in some proprietary tool's format, and that tool
goes away, it is extremely unlikely that any other tool will be able
to use any of what I had relied upon as my "source". Which means I
would be managing the machine-generated text as the "source" for
successive modifications/versions of the product. I'll put well
written, human-generated code up against machine-generated code
(that's why we have coding standards) for understandability and
maintainability any day of the week and twice on Sundays!

On the other hand, as long at the graphical tool generates standard
HDL, there are a lot of textual analysis tools that can still be
employed on the results. The only difference is, they would not be
dealing with the "source", and finding/translating and fixing issues
found by analyzing the outputs of the graphical entry system is, if
even possible, not usually nearly as straight-forward as when the
analyzed text IS the source.

Perhaps a different approach would be to use text as the source, and
various tools to provide graphical representations (of different
aspects) of the design for documentation to assist human analyses/
review (e.g. a hierarchy viewer, a state machine viewer, etc.) I find
the visualization tools in the Syplify Pro HDL Analyst RTL view,
especially with the ability to filter the output by several different
criteria, to be extremely helpful in understanding how that downstream
tool "sees" various aspects of my design. This is one of the reasons I
prefer behavioral design descriptions rather than highly structural
ones: there are tools that will show me the resulting structure from
my behavioral descriptoin, but there are few tools that will show me
the behavior (as other than simulation waveforms) from a highly
strucural description.

Andy

Article: 154831
Subject: Re: Data output constraint
From: "pavel.m" <4030@embeddedrelated>
Date: Wed, 16 Jan 2013 14:13:45 -0600
Links: << >>  << T >>  << A >>
>Checksum errors could very likely indicate an issue with the interface
>timing, which includes clock to output of the FPGA, and setup/hold
>time at FPGA inputs.

Thank you Gabor for the reply.
Good to know that it may be good way for my deliverance :)

>You need to check the specs on your external device to calculate the
>allowable setup and hold time at the FPGA.  Then you need to add an
>OFFSET IN BEFORE constraint to ensure that these conditions are met
>by the design.  For example if you determine that you have 3 ns setup
>and 2 ns hold time with respect to the rising edge of the "clock" net:
>
>OFFSET = IN 3 ns VALID 5 ns BEFORE "clock" RISING ;
>
>This says that the valid data window starts 3 ns before the rising
>edge of the clock input pin, and stays valid for 5 ns - that is until
>2 ns after the rising edge of clock.
>
>You can also constrain the clock to output timing like:
>
>OFFSET = OUT 5 ns AFTER "clock" RISING;
>
>This sets a maximum delay from the clock input pin to an output pad.
>Note that there is no way to constrain a minimum delay, so if you
>are using source-synchronous logic, you need to be sure that output
>timing is met by design.  Normally this means placing output flops
>in the IOB and using a DDR output register for the clock running
>on a different phase from the data to allow hold time if necessary.
>
>-- Gabor

Here is fragment of external device documentation:
graph: http://uppix.net/8/5/1/151d221e03dbb2b8414340f3f08f6.png
values: http://uppix.net/7/0/6/e5514ee21a32972ee177d6a0787b4.jpg

For data transfer from external device to FPGA:
If todly has max. 14 ns from last clock rising edge, then it has 6 ns setup
time? And toh has min. 2.5 ns. Then I should set (if only fraction is
possible):

OFFSET = IN 6 ns VALID 8.5 ns BEFORE "clock" RISING ;

?

For data transfer from FPGA to external device, which cause my problem:
This part I don't understand. In that constraint should be external device
inputhold time? Then:

OFFSET = OUT 2 ns AFTER "clock" RISING;

And that part about timing requirements. Placing output flops in IOB is
just assigning signal which I want to send out to the output pin? Like here
(data3_out is an output port):

data3_out <= data_byte(3);

And somehow use that DDR to allow 2 ns (again?) hold time?	   
					
---------------------------------------		
Posted through http://www.FPGARelated.com

Article: 154832
Subject: Re: Data output constraint
From: "pavel.m" <4030@embeddedrelated>
Date: Wed, 16 Jan 2013 15:35:07 -0600
Links: << >>  << T >>  << A >>
>And that part about timing requirements. Placing output flops in IOB is
>just assigning signal which I want to send out to the output pin? Like
here
>(data3_out is an output port):
>
>data3_out <= data_byte(3);

I see that placing registers into IOB is something what I should set.
And I read that I can do it for all I/O registers in "Map properties" or
just for selected registers in *.vhd file:

attribute IOB : string
attribute IOB of data3_out: signal is "TRUE";

Is that correct (data3_out is an output port)?
I saw also that it is possible in *.ucf file, but don't know how to do it
with port name usage.

And it is for using the nearest logic to the output pad, what ensures the
lowest setup time, correctly understand? If yes, then I suppose that the
time between that register in IOB and next connected register may be
increased. But I guess that I/O times are more important.

	   
					
---------------------------------------		
Posted through http://www.FPGARelated.com

Article: 154833
Subject: Re: Chisel as alternative HDL
From: David Brown <david@westcontrol.removethisbit.com>
Date: Thu, 17 Jan 2013 10:12:56 +0100
Links: << >>  << T >>  << A >>
On 16/01/13 18:19, Rob Gaddi wrote:
> On Wed, 16 Jan 2013 08:30:49 -0800 (PST)
> Andy <jonesandy@comcast.net> wrote:
> 
>> On Jan 16, 6:30 am, David Brown <da...@westcontrol.removethisbit.com>
>> wrote:
>>> For Linux, you can use RabbitSVN as a plug-in to Nautilus in much the
>>> same way as TortoiseSVN in Windows, and Meld as a good gui for comparing
>>> text files.
>>
>> Thanks for the pointers on linux tools. Did you mean "RabbitVCS"?
>>
>> RabbitVCS looks promising, but it is still version 0.15.1 (maybe a
>> little immature yet for professional use, e.g. something we would
>> deploy and recommend to the development teams).
>>
>> Meld looks really good, and appears a little more mature.
>>
>> Andy
> 
> Rabbit's definitely a bit immature if you want to compare it to
> Tortoise.  I find I still do half of my SVN management from the command
> line rather than using it; thinks like copying and status checking.
> 
> I use meld as my visual diff tool, and it's absolutely great.
> 

Rabbit does not have as many features as Tortoise, but don't be put off
by the version number.  Many programs and projects are fully usable
despite low version numbers - while others use high version numbers for
their initial releases.

I find Rabbit more reliable than Tortoise at getting the overlay icons
correct, but maybe that's just Nautilus being more consistent and
accurate than Windows Explorer.  But there is no doubt that Tortoise has
lots more useful subversion features.

I also do much of my subversion stuff from the command line, both in
Windows and Linux - and also some from within programs with svn support
(such as Eclipse).  But Rabbit and Tortoise are very good for quickly
viewing the state of files, as well as getting logs and differences.


Article: 154834
Subject: Re: Combination loops and false paths
From: Brian Drummond <brian@shapes.demon.co.uk>
Date: Thu, 17 Jan 2013 11:28:08 +0000 (UTC)
Links: << >>  << T >>  << A >>
On Mon, 14 Jan 2013 22:54:53 -0700, Rob Doyle wrote:

> I creating an FPGA implementation of a old DEC PDP-10 (KS-10,
> specifically) Mainframe Computer.  Why?  Because I always wanted one...
> 
> The KS-10 was microcoded and used 10x am2901 4-bit slices in the ALU.
> At this stage, most of the instruction set diagnostics simulate
> correctly.
> 
> When I synthesize this design using Xilinx ISE I get warnings about
> combinatorial loops involving the ALU - and an associated "Minimum
> period: 656.595ns (Maximum Frequency: 1.523MHz)" message...

> What should I do?

Look at the critical path reported by synthesis. Sounds like a VHDL 
coding error; that delay would equate to a chain of 3-400 LUTs between FFs 
which strongly suggests a mistake somewhere.

- Brian

Article: 154835
Subject: Re: IP core implementation of multiplier on FPGA Spartan 3e
From: deepak <dpk.losser@gmail.com>
Date: Thu, 17 Jan 2013 04:32:18 -0800 (PST)
Links: << >>  << T >>  << A >>
On Wednesday, January 16, 2013 7:43:41 AM UTC-8, Jon wrote:
> Can you describe the multiplier? (Width, anything special about it, does it use the multiplication operator)
> 
> 
> 
> Is it using the embedded h/w multipliers in the s3e? What's the exact error message?
> 
> 
> 
> Jon

I used the ip core of multiplier which is available in xilinx 12.2,then in the next step i assigned pins in the plan ahead.after that when i synthesised it gave these warnings:
WARNING:Xst:647 - Input <clk> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <a> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <b> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:1306 - Output <p> is never assigned.
,
Basically i wanted to learn how to implement an ip core on fpga kit,
i will be very thankful for any kind of help!
thanks.

Article: 154836
Subject: Re: IP core implementation of multiplier on FPGA Spartan 3e
From: deepak <dpk.losser@gmail.com>
Date: Thu, 17 Jan 2013 04:33:22 -0800 (PST)
Links: << >>  << T >>  << A >>
On Thursday, January 17, 2013 4:32:18 AM UTC-8, deepak wrote:
> On Wednesday, January 16, 2013 7:43:41 AM UTC-8, Jon wrote:
> 
> > Can you describe the multiplier? (Width, anything special about it, does it use the multiplication operator)
> 
> > 
> 
> > 
> 
> > 
> 
> > Is it using the embedded h/w multipliers in the s3e? What's the exact error message?
> 
> > 
> 
> > 
> 
> > 
> 
> > Jon
> 
> 
> 
> I used the ip core of multiplier which is available in xilinx 12.2,then in the next step i assigned pins in the plan ahead.after that when i synthesised it gave these warnings:
> 
> WARNING:Xst:647 - Input <clk> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
> 
> WARNING:Xst:647 - Input <a> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
> 
> WARNING:Xst:647 - Input <b> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
> 
> WARNING:Xst:1306 - Output <p> is never assigned.
> 
> ,
> 
> Basically i wanted to learn how to implement an ip core on fpga kit,
> 
> i will be very thankful for any kind of help!
> 
> thanks.

i was using a 2bit input

Article: 154837
Subject: Re: Data output constraint
From: GaborSzakacs <gabor@szakacs.invalid>
Date: Thu, 17 Jan 2013 09:39:41 -0500
Links: << >>  << T >>  << A >>
pavel.m wrote:
>> Checksum errors could very likely indicate an issue with the interface
>> timing, which includes clock to output of the FPGA, and setup/hold
>> time at FPGA inputs.
> 
> Thank you Gabor for the reply.
> Good to know that it may be good way for my deliverance :)
> 
>> You need to check the specs on your external device to calculate the
>> allowable setup and hold time at the FPGA.  Then you need to add an
>> OFFSET IN BEFORE constraint to ensure that these conditions are met
>> by the design.  For example if you determine that you have 3 ns setup
>> and 2 ns hold time with respect to the rising edge of the "clock" net:
>>
>> OFFSET = IN 3 ns VALID 5 ns BEFORE "clock" RISING ;
>>
>> This says that the valid data window starts 3 ns before the rising
>> edge of the clock input pin, and stays valid for 5 ns - that is until
>> 2 ns after the rising edge of clock.
>>
>> You can also constrain the clock to output timing like:
>>
>> OFFSET = OUT 5 ns AFTER "clock" RISING;
>>
>> This sets a maximum delay from the clock input pin to an output pad.
>> Note that there is no way to constrain a minimum delay, so if you
>> are using source-synchronous logic, you need to be sure that output
>> timing is met by design.  Normally this means placing output flops
>> in the IOB and using a DDR output register for the clock running
>> on a different phase from the data to allow hold time if necessary.
>>
>> -- Gabor
> 
> Here is fragment of external device documentation:
> graph: http://uppix.net/8/5/1/151d221e03dbb2b8414340f3f08f6.png
> values: http://uppix.net/7/0/6/e5514ee21a32972ee177d6a0787b4.jpg
> 
> For data transfer from external device to FPGA:
> If todly has max. 14 ns from last clock rising edge, then it has 6 ns setup
> time? And toh has min. 2.5 ns. Then I should set (if only fraction is
> possible):
> 
> OFFSET = IN 6 ns VALID 8.5 ns BEFORE "clock" RISING ;
> 

This would be correct if the clock input to both devices arrives at
the device input pin at the same time (i.e. a typical radial clock
distribution network like PCI bus) and the clock period is 20 ns.

> ?
> 
> For data transfer from FPGA to external device, which cause my problem:
> This part I don't understand. In that constraint should be external device
> inputhold time? Then:
> 
> OFFSET = OUT 2 ns AFTER "clock" RISING;

No.  The OFFSET OUT constrains the *maximum* time from the clock pin to
the data output.  This really affects the setup time at the external
device and should be set to the clock period minus the setup requirement
(again assuming a radial clock distribution).  The hold time at the
external device needs to be met by design, either due to the absolute
minimum guaranteed delay from clock to output on the FPGA, or by using
a phase-shifted clock.

On the other hand, if you don't have a radial clocking scheme, you need
to also deal with the difference in clock arrival time (clock skew)
between the FPGA and the external device.  And in all instances you
should also factor in the board-level propagation delay due to trace
lengths.  These become more important at higher clock frequencies
(for setup time) but are always importantant for hold time regardless
of the clock frequency.

> 
> And that part about timing requirements. Placing output flops in IOB is
> just assigning signal which I want to send out to the output pin? Like here
> (data3_out is an output port):
> 
> data3_out <= data_byte(3);
> 
> And somehow use that DDR to allow 2 ns (again?) hold time?	   
> 					
> ---------------------------------------		
> Posted through http://www.FPGARelated.com

Article: 154838
Subject: Re: Data output constraint
From: GaborSzakacs <gabor@szakacs.invalid>
Date: Thu, 17 Jan 2013 09:45:42 -0500
Links: << >>  << T >>  << A >>
pavel.m wrote:
>> And that part about timing requirements. Placing output flops in IOB is
>> just assigning signal which I want to send out to the output pin? Like
> here
>> (data3_out is an output port):
>>
>> data3_out <= data_byte(3);
> 
> I see that placing registers into IOB is something what I should set.
> And I read that I can do it for all I/O registers in "Map properties" or
> just for selected registers in *.vhd file:
> 
> attribute IOB : string
> attribute IOB of data3_out: signal is "TRUE";
> 
> Is that correct (data3_out is an output port)?

I believe the proper element to apply the IOB constraint to is the
actual register that drives the output.  So if data3_out is just
a continous assign to data_byte(3) and data_byte(3) is assigned
in a clocked process, then data_byte(3) should have the IOB = TRUE
attribute.  You could also globally push registers into the IOB,
but that may affect your ability to meet internal timing.

> I saw also that it is possible in *.ucf file, but don't know how to do it
> with port name usage.
> 
> And it is for using the nearest logic to the output pad, what ensures the
> lowest setup time, correctly understand? If yes, then I suppose that the
> time between that register in IOB and next connected register may be
> increased. But I guess that I/O times are more important.
> 

Actually meeting the timing constraints is most important.  If you only
need to guarantee a certain input setup and clock to output timing, then
you can leave the global IOB setting at "auto" and let the tools decide
where to place the registers in order to balance internal and external
timing requirements.  On the otehr hand, if you have to keep interface
skew to a minimum (as in a source-synchronous design) then you will need
to push registers in the IOB, because the constraints only control
maximum delay and not skew.

> 	   
> 					
> ---------------------------------------		
> Posted through http://www.FPGARelated.com

Article: 154839
Subject: Re: Data output constraint
From: "pavel.m" <4030@embeddedrelated>
Date: Thu, 17 Jan 2013 13:47:29 -0600
Links: << >>  << T >>  << A >>
Dear Gabor,

first of all thank you for your patience. 
Because I'm not sure about all of this and I feel that I'm not capable to
do it myself I have to give more details of my design:
- crystal clock-oscillator generates single 50MHz clock, which comes into
FPGA,
- the process where I have to send data out uses rising_edge(clock)
instruction,
- there is FSM, where two states are used for sending data out, this is
because I use 4 lines for data output and I want to send bytes, so in one
state 4 MSB are sent, in second state 4 LSB are sent, something like this:

                when WRITE_DATA_MSB =>   

                     data3_out <= data_byte(3);
                     data2_out <= data_byte(2);
                     data1_out <= data_byte(1);
                     data0_out <= data_byte(0);

                     state <= WRITE_DATA_LSB;

                when WRITE_DATA_LSB =>
                           
                     data_byte <= some_new_value; --new data
                           
                     state <= WRITE_DATA_MSB;

                     data3_out <= data_byte(7);
                     data2_out <= data_byte(6);
                     data1_out <= data_byte(5);
                     data0_out <= data_byte(4);

There is also condition in WRITE_DATA_MSB, when it should finish jumping
between these two states (when some amount of data bytes will be sent
out).

That "clock", which is used also for that process, must be sent to the
external device with data. Is that topology what you called
"Source-Synchronous" system? Then I think I should use what you recommend:
push registers in the IOB, because in that topology I want minimum skew.
And from what you said that registers should be:

attribute IOB : string
attribute IOB of data_byte: signal is "TRUE"; (corrected register name)

And for clock, I don't understand what is "radial clocking scheme". I
couldn't find it, but I suppose that it is not what I have, because I send
my 50 MHz clock from FPGA to the external device. So there is propagation
delay and other factors which cause that clock on which FPGA works and
clock on external device input pin are different. If these clocks would be
the same ("radial clocking") I could use:

OFFSET = IN 6 ns VALID 8.5 ns BEFORE "clock" RISING ; (as posted before)
OFFSET = OUT 14 ns AFTER "clock" RISING; [this is corrected: 20ns(clock
period) - 6ns(setup time requirement of external device)]

But I should somehow recalculate that values taking into account that
delays? How? 
I suppose that should be here also Clock Forwarding technique applied for
clock sending...

Sorry that I ask also for the things that you described, but writing it in
my words and asking you if it is true make me sure that I something
understand or not. It is not easy subject and additional factor which makes
it harder to understand is that I'm not native english speaker.

Best regards,
Pavel	   
					
---------------------------------------		
Posted through http://www.FPGARelated.com

Article: 154840
Subject: Re: Combination loops and false paths
From: rickman <gnuarm@gmail.com>
Date: Thu, 17 Jan 2013 15:03:26 -0500
Links: << >>  << T >>  << A >>
On 1/15/2013 12:54 AM, Rob Doyle wrote:
>
> I creating an FPGA implementation of a old DEC PDP-10 (KS-10,
> specifically) Mainframe Computer. Why? Because I always wanted one...
>
> The KS-10 was microcoded and used 10x am2901 4-bit slices in the ALU.
> At this stage, most of the instruction set diagnostics simulate correctly.
>
> When I synthesize this design using Xilinx ISE I get warnings about
> combinatorial loops involving the ALU - and an associated "Minimum
> period: 656.595ns (Maximum Frequency: 1.523MHz)" message...
>
> My understanding is that if combination loops really existed then the
> simulation wouldn't stabilize. I can't really add pipelining or
> registers to the design without affecting the microcode - and I don't
> want to do that.
>
> Most of the information that I've read about "false paths" assume two
> clocked processes not a combinatorial loop.
>
> Anyway. I'm not sure how to resolve this. I can mark the path as a
> false path but I think that it will ignore /all/ the timing (even the
> desired timing) through that path.
>
> What should I do?
>
> Rob.

I took a look at the block diagram and I don't see any combinatorial 
loops.  However, they use latches for the RAM outputs.  These are 
combinatorial if implemented that way.  Typically latches are used 
because they can provide speed advantages since the data will flow 
through before being held while D type registers don't change outputs 
until the clock edge.

Are the RAM and output latches in the path being reported as too long? 
If so, I would recommend changing the latches to rising edge registers. 
  This should cut these loops.  The RAM is level sensitive which may be 
a problem in an FPGA.  I think all of the sequential elements are edge 
sensitive these days.  I supposed you could make it out of latches; it's 
not that many elements.

The clock runs down the center of the block diagram cutting the data 
paths and preventing any internal loops I can see.  Of course, there 
could be combinatorial loops created by the way it is used.  The only 
one I see is created if you loop the ALU output Y back to the ALU input 
D.  This could happen if you try to put these busses on a tri-state bus. 
  Since tri-states aren't used in an FPGA, you are better off using 
multiple separate busses to drive all the various inputs hanging on the 
tri-state bus.

I think it would be very interesting to implement this in a low power 
FPGA and see just how efficient it can become.  What target were you 
thinking of?  I am currently working with the iCE40 family from Lattice 
and it has very impressive power consumption.  You likely could run a 
design at some 10's of MHz while drawing the power level of an LED... a 
small LED.

Any interest in making this a group project?  Or are you keeping all the 
fun to yourself?

BTW, where did you get documentation on the PDP-10 sufficient to design 
an equivalent?  Just from the instruction manual?  Or do you have more 
details?

Rick

Article: 154841
Subject: Re: Combination loops and false paths
From: glen herrmannsfeldt <gah@ugcs.caltech.edu>
Date: Thu, 17 Jan 2013 20:49:48 +0000 (UTC)
Links: << >>  << T >>  << A >>
rickman <gnuarm@gmail.com> wrote:
> On 1/15/2013 12:54 AM, Rob Doyle wrote:

>> I creating an FPGA implementation of a old DEC PDP-10 (KS-10,
>> specifically) Mainframe Computer. Why? Because I always wanted one...

>> The KS-10 was microcoded and used 10x am2901 4-bit slices in the ALU.
>> At this stage, most of the instruction set diagnostics simulate correctly.

>> When I synthesize this design using Xilinx ISE I get warnings about
>> combinatorial loops involving the ALU - and an associated "Minimum
>> period: 656.595ns (Maximum Frequency: 1.523MHz)" message...

>> My understanding is that if combination loops really existed then the
>> simulation wouldn't stabilize. I can't really add pipelining or
>> registers to the design without affecting the microcode - and I don't
>> want to do that.

Loops with an odd number of inversions won't stabilize, but with an
even number they should be fine. 

(snip)

> I took a look at the block diagram and I don't see any combinatorial 
> loops.  However, they use latches for the RAM outputs.  These are 
> combinatorial if implemented that way.  Typically latches are used 
> because they can provide speed advantages since the data will flow 
> through before being held while D type registers don't change outputs 
> until the clock edge.

The tools should be good enough to figure out latches. 

As I wrote above, though, be sure that there is no (odd number)
of inverters in the loop.
 
> Are the RAM and output latches in the path being reported as too long? 
> If so, I would recommend changing the latches to rising edge registers. 
>  This should cut these loops.  The RAM is level sensitive which may be 
> a problem in an FPGA.  I think all of the sequential elements are edge 
> sensitive these days.  I supposed you could make it out of latches; it's 
> not that many elements.

The BRAM on most FPGAs are synchronous (clocked). That might not
match what you need for some older designs. If it isn't too big,
and you really need asynchronous RAM, you have to make it out
of CLB logic.
 
> The clock runs down the center of the block diagram cutting the data 
> paths and preventing any internal loops I can see.  Of course, there 
> could be combinatorial loops created by the way it is used.  The only 
> one I see is created if you loop the ALU output Y back to the ALU input 
> D.  This could happen if you try to put these busses on a tri-state bus. 
>  Since tri-states aren't used in an FPGA, you are better off using 
> multiple separate busses to drive all the various inputs hanging on the 
> tri-state bus.

As I understand it, the Xilinx tools, at least, know how to convert
tristate logic to MUX logic. I suppose in some cases that might 
generate unexpected, or even false, loops.

I believe that the KA-10 was done in asynchronous (non-clocked) logic.
That might make an interesting FPGA project.

-- glen

Article: 154842
Subject: Re: Combination loops and false paths
From: Andy <jonesandy@comcast.net>
Date: Thu, 17 Jan 2013 14:09:39 -0800 (PST)
Links: << >>  << T >>  << A >>
You might be able to get around the async/sync ram issues by using the
other edge of your clock (and if necessary, a dual-port bram could run
off different edges for read & write).

There are also ways to build a DDR register out of two registers and 3
XOR (or XNOR) gates, without gating the clock. Google "flancter
circuit". It is STA-friendly too. That might be another trick you
could use.

If the loops were not stable, it would show up even in RTL sim
(assuming the conditions needed to make it unstable were met). Since
it works with the loops in there (in simulation), I assume it is at
least not always unstable.

Andy


Article: 154843
Subject: Re: Combination loops and false paths
From: rickman <gnuarm@gmail.com>
Date: Thu, 17 Jan 2013 18:50:49 -0500
Links: << >>  << T >>  << A >>
On 1/17/2013 3:49 PM, glen herrmannsfeldt wrote:
> rickman<gnuarm@gmail.com>  wrote:
>> On 1/15/2013 12:54 AM, Rob Doyle wrote:
>
>>> I creating an FPGA implementation of a old DEC PDP-10 (KS-10,
>>> specifically) Mainframe Computer. Why? Because I always wanted one...
>
>>> The KS-10 was microcoded and used 10x am2901 4-bit slices in the ALU.
>>> At this stage, most of the instruction set diagnostics simulate correctly.
>
>>> When I synthesize this design using Xilinx ISE I get warnings about
>>> combinatorial loops involving the ALU - and an associated "Minimum
>>> period: 656.595ns (Maximum Frequency: 1.523MHz)" message...
>
>>> My understanding is that if combination loops really existed then the
>>> simulation wouldn't stabilize. I can't really add pipelining or
>>> registers to the design without affecting the microcode - and I don't
>>> want to do that.
>
> Loops with an odd number of inversions won't stabilize, but with an
> even number they should be fine.
>
> (snip)
>
>> I took a look at the block diagram and I don't see any combinatorial
>> loops.  However, they use latches for the RAM outputs.  These are
>> combinatorial if implemented that way.  Typically latches are used
>> because they can provide speed advantages since the data will flow
>> through before being held while D type registers don't change outputs
>> until the clock edge.
>
> The tools should be good enough to figure out latches.

Figure out in what context?  The tool can't know when the latch is 
enabled or disabled.  When enabled it is transparent and so is logic. 
I'm not sure what your point is.  For timing a latch is combinational 
logic and has to be figured into the timing paths.  In fact, that is 
usually why latches are used, because they improve timing.


> As I wrote above, though, be sure that there is no (odd number)
> of inverters in the loop.
>
>> Are the RAM and output latches in the path being reported as too long?
>> If so, I would recommend changing the latches to rising edge registers.
>>   This should cut these loops.  The RAM is level sensitive which may be
>> a problem in an FPGA.  I think all of the sequential elements are edge
>> sensitive these days.  I supposed you could make it out of latches; it's
>> not that many elements.
>
> The BRAM on most FPGAs are synchronous (clocked). That might not
> match what you need for some older designs. If it isn't too big,
> and you really need asynchronous RAM, you have to make it out
> of CLB logic.

Yes, not only are the block RAMs synchronous, the LUT RAMs (distributed) 
are also synchronous.  That is why I say you have to make async RAM out 
of latches.


>> The clock runs down the center of the block diagram cutting the data
>> paths and preventing any internal loops I can see.  Of course, there
>> could be combinatorial loops created by the way it is used.  The only
>> one I see is created if you loop the ALU output Y back to the ALU input
>> D.  This could happen if you try to put these busses on a tri-state bus.
>>   Since tri-states aren't used in an FPGA, you are better off using
>> multiple separate busses to drive all the various inputs hanging on the
>> tri-state bus.
>
> As I understand it, the Xilinx tools, at least, know how to convert
> tristate logic to MUX logic. I suppose in some cases that might
> generate unexpected, or even false, loops.

That should not create loops unless the loop is already there in the 
connected logic.  Translating tristate busses create multiple sets of 
multiplexors which are all distinct, preventing loops... unless the rest 
of the logic connects input to output.


> I believe that the KA-10 was done in asynchronous (non-clocked) logic.
> That might make an interesting FPGA project.

Doing async logic in an FPGA is not so easy.  You need timing info that 
is hard to get.

Rick

Article: 154844
Subject: Re: Combination loops and false paths
From: Rob Doyle <radioengr@gmail.com>
Date: Thu, 17 Jan 2013 17:20:05 -0700
Links: << >>  << T >>  << A >>
On 1/15/2013 7:21 PM, rickman wrote:
 > On 1/15/2013 12:54 AM, Rob Doyle wrote:
 >>
 >> I creating an FPGA implementation of a old DEC PDP-10 (KS-10,
 >> specifically) Mainframe Computer. Why? Because I always wanted
 >> one...
 >>
 >> The KS-10 was microcoded and used 10x am2901 4-bit slices in the
 >> ALU. At this stage, most of the instruction set diagnostics
 >> simulate correctly.
 >>
 >> When I synthesize this design using Xilinx ISE I get warnings
 >> about combinatorial loops involving the ALU - and an associated
 >> "Minimum period: 656.595ns (Maximum Frequency: 1.523MHz)"
 >> message...
 >>
 >> My understanding is that if combination loops really existed then
 >> the simulation wouldn't stabilize. I can't really add pipelining
 >> or registers to the design without affecting the microcode - and I
 >>  don't want to do that.
 >>
 >> Most of the information that I've read about "false paths" assume
 >> two clocked processes not a combinatorial loop.
 >>
 >> Anyway. I'm not sure how to resolve this. I can mark the path as a
 >> false path but I think that it will ignore /all/ the timing (even
 >> the desired timing) through that path.
 >>
 >> What should I do?
 >
 > Do you know why the tool is complaining?  Did you write the code
 > describing the ALU?  Off the top of my head, I can't think of why an
 >  ALU would have a combinatorial loop.  It should have two input data
 >  busses, a number of control inputs, an output data bus and some
 > output status signals.

Oops.  Sorry I guess I relied to rickman instead of following up with 
the group.   I'm resending...

I guess I'm using term ALU and am2901 interchangeably.  I'll be more
specific.

There is nothing wrong with the am2901 proper.  It is what it is.

 > I don't recall the details of the 2901 bit slice and my data books
 > are not handy.  That's the problem with paper books, you can't just
 > shove them on your hard drive...  Does this part have an internal
 > register file?  Even so, that means the part would have a clock and
 > not a combinatorial loop.

 > Maybe this is because of some internal bus that is shared in a way
 > that looks like a loop even though it would never be used that way?

Exactly.

The problems is that am2901 output goes to a bus that eventually routes
back to the am2901 input for some unused (as best I can tell)
configuration of the microcode.  This all happens with no registers in
the loop.

The am2901 does have an internal dual-ported register file.  Register
file writes from the ALU output are clocked.  Register file reads to the
ALU input are latched only. The am2901 control inputs and register file
addresses all originate from the microcode which is registered.

The am2901 has a single input bus which is combinatorial through the ALU
to output bus.  Therefore all am2901 ops require at least one register
(or the constant zero) as an ALU source.

I think I know what to do.  It looks like ISE supports a
FROM-THRU-THRU-THRU-THRU-TO timing constraint - with an indefinite
number of THRUs.  I think I just want to very specifically exclude the
paths that the tool is whining about and leave everything else.

 > I may have to find my old AMD data book.  That could be an
 > archeological dig!

I guess that it is just a design from another day - a whole lot less
synchronous than anything I've done in an FPGA before.

I have enjoyed going back through that all.   I even found my "Mick and
Brick" book.  I'll probably do a VAX 11/780 next which also used
bit-sliced parts.

Bob.









Article: 154845
Subject: Re: Combination loops and false paths
From: Rob Doyle <radioengr@gmail.com>
Date: Thu, 17 Jan 2013 17:59:34 -0700
Links: << >>  << T >>  << A >>
On 1/17/2013 1:03 PM, rickman wrote:

> BTW, where did you get documentation on the PDP-10 sufficient to
> design an equivalent?  Just from the instruction manual?  Or do you
> have more details?

Folks have done a remarkable job at archiving design information,
software, and hardware for these historic machines.  Notably Paul Allen
(of Microsoft Fame) sponsors a museum that maintains a few of these
machines in working order.  See http://www.livingcomputermuseum.org/

The folks at bitsavers.org are frantically scanning documents/books and 
imaging magnetic media before it becomes unreadable.

AMD Info is at:

http://bitsavers.org/pdf/amd/

All the KS10/PDP10 information is at:

http://bitsavers.org/pdf/dec/pdp10/KS10/

Microcode source/listings and processor diagnostics are available from:

http://pdp-10.trailing-edge.com/klad_sources/index.html

A webpage that describes my/our project is at:

http://www.techtravels.org/KS10FPGA/

I put a block diagram of the KS10 CPU on the techtravels website.
Referring to that block diagram, the false paths are from the ALU output
through the DBM mux, through the DBUS Mux, and back into the ALU.
There is another false path though the SCAD.   (The SCAD is a 12-bit
mini-ALU built from 3x 74S181s that is used for managing floating-point
exponents and loop constructs in the microcode).

> Any interest in making this a group project?  Or are you keeping all
> the fun to yourself?

This is definitely a group project.  Right now, I'm doing all the FPGA 
work by myself -

If you are interested in participating, contact me off-list.

You used the term 'archeology'.  It sure feels like that...

Rob.





Article: 154846
Subject: Re: Combination loops and false paths
From: glen herrmannsfeldt <gah@ugcs.caltech.edu>
Date: Fri, 18 Jan 2013 01:57:12 +0000 (UTC)
Links: << >>  << T >>  << A >>
Rob Doyle <radioengr@gmail.com> wrote:

(snip)

> I guess I'm using term ALU and am2901 interchangeably.  
> I'll be more specific.
 
> There is nothing wrong with the am2901 proper.  It is what it is.

I suppose, but it was designed way before the tools we use now.
 
(snip)

> The problems is that am2901 output goes to a bus that eventually routes
> back to the am2901 input for some unused (as best I can tell)
> configuration of the microcode.  This all happens with no registers in
> the loop.
 
(snip)

> I guess that it is just a design from another day - a whole lot less
> synchronous than anything I've done in an FPGA before.
 
> I have enjoyed going back through that all.   I even found my "Mick and
> Brick" book.  I'll probably do a VAX 11/780 next which also used
> bit-sliced parts.

Years ago, maybe just about when it was new, I bought "Mick and Brick."

Then, about 20 years ago, it got lost in a move. A few weeks ago I
bought a used one from half.com for a low price. (In case I decide
to do some 2901 designs in FPGAs.)

The discussion on combinatorial loops reminds me of the wrap around
carry on ones complement adders. If done the obvious way, it is a
combinatorial loop, but hopefully one that, in actual use, resolves
itself. 

-- glen

Article: 154847
Subject: Re: Combination loops and false paths
From: glen herrmannsfeldt <gah@ugcs.caltech.edu>
Date: Fri, 18 Jan 2013 02:09:09 +0000 (UTC)
Links: << >>  << T >>  << A >>
rickman <gnuarm@gmail.com> wrote:

(snip, I wrote)

>> The BRAM on most FPGAs are synchronous (clocked). That might not
>> match what you need for some older designs. If it isn't too big,
>> and you really need asynchronous RAM, you have to make it out
>> of CLB logic.
 
> Yes, not only are the block RAMs synchronous, the LUT RAMs (distributed) 
> are also synchronous.  That is why I say you have to make async RAM out 
> of latches.

The are now? They didn't used to be. I am somewhat behind in the
generations of FPGAs.
 
(snip, I also wrote)

>> I believe that the KA-10 was done in asynchronous (non-clocked) logic.
>> That might make an interesting FPGA project.
 
> Doing async logic in an FPGA is not so easy.  You need timing info that 
> is hard to get.

The whole idea behind asynchronous logic is that you don't need to know
any timing information. Otherwise known as self-timed logic, there is
enough hand-shaking such that every signal changes when it is ready, no
sooner and no later. If you use dual-rail logic:

http://en.wikipedia.org/wiki/Asynchronous_system#Asynchronous_datapaths

then all timing just works.

If you mix synchronous and asynchronous logic, then things get more
interesting.

-- glen

Article: 154848
Subject: Button clock
From: "tupadre" <4060@embeddedrelated>
Date: Fri, 18 Jan 2013 14:32:08 -0600
Links: << >>  << T >>  << A >>
Hi to everyone!

This is my first message here so first of all thanks to everyone to let me
post here!

I have a homework, it consists on writing a processor and make it work in a
Spartan 3. I did the first but the second one is getting difficult. I just
want to show my profesor that processor is working well so I want to
generate a clock event with a button or switch just like here:
http://fpgawiki.dustingram.com/index.php?title=Button_Clock

My UCF is this one:

#PACE: Start of Constraints generated by PACE

NET "act_reg3" CLOCK_DEDICATED_ROUTE = FALSE;

#PACE: Start of PACE I/O Pin Assignments
NET "an0"  LOC = "E13"  ;
NET "an3"  LOC = "F14"  ;
NET "an2"  LOC = "G14"  ;
NET "an1"  LOC = "d14"  ;

#This is a button to simulate a clock
NET "simulated_clk"  LOC = "M13"  ;


#########################  8 Leds
###########################################
NET "mult_lec"  LOC = "K12"  ;
NET "mult_esc"  LOC = "P14"  ;
NET "mult_ret"  LOC = "L12"  ;
NET "mult_pc"  LOC = "N14"  ;
NET "reg_w"  LOC = "P13"  ;
NET "call_w"  LOC = "N12"  ;
NET "sel_alu"  LOC = "P12"  ;

#I use this for another thing
NET "clk"  LOC = "T9"  ;

###################################### Segments  
##########################################
NET "segmentos<6>"  LOC = "E14"  ;
NET "segmentos<5>"  LOC = "G13"  ;
NET "segmentos<4>"  LOC = "N15"  ;
NET "segmentos<3>"  LOC = "P15"  ;
NET "segmentos<2>"  LOC = "R16"  ;
NET "segmentos<1>"  LOC = "F13"  ;
NET "segmentos<0>"  LOC = "N16"  ;
NET "segmentos<7>"  LOC = "P16"  ;


#######################################  Switches
###########################################
NET "act_reg1"  LOC = "F12"  ;
NET "act_reg2"  LOC = "G12"  ;
NET "act_reg3"  LOC = "H14"  ;


#PACE: Start of PACE Area Constraints

#PACE: Start of PACE Prohibit Constraints

#PACE: End of Constraints generated by PACE




-------------------------------------------------------------------

And here is a fragment of my processor:

----PC process
process(inicio,simulated_clk)
 
variable pc_out: std_logic_vector (15 downto 0); 
variable pc_high : std_logic_vector(15 downto 0);
begin
	--Si es la primera vez que se carga
	if inicio='0' then 
		pc<="0000000000000000"; 
		reg_ret<="0000000000000000";
		pc_out:="0000000000000000";
	--Se ha cargado más veces
	elsif simulated='1' and simulated_clk'event then  
		pc_out:=pc;

...
end process;


I don't know why it doesn't work. As I said I just want to simulate a clock
so to show my proffesor how the processor works step by step (instruction
by instruction).

Hope you can help. Thanks!

PD: Sorry for my poor English.

	   
					
---------------------------------------		
Posted through http://www.FPGARelated.com

Article: 154849
Subject: Re: Button clock
From: Nicolas Matringe <nicolas.matringe@fre.fre>
Date: Fri, 18 Jan 2013 22:11:42 +0100
Links: << >>  << T >>  << A >>
Le 18/01/2013 21:32, tupadre a écrit :
> Hi to everyone!
[...]
> And here is a fragment of my processor:
>
> ----PC process
> process(inicio,simulated_clk)
>
> variable pc_out: std_logic_vector (15 downto 0);
> variable pc_high : std_logic_vector(15 downto 0);
> begin
> 	--Si es la primera vez que se carga
> 	if inicio='0' then
> 		pc<="0000000000000000";
> 		reg_ret<="0000000000000000";
> 		pc_out:="0000000000000000";
> 	--Se ha cargado más veces
> 	elsif simulated='1' and simulated_clk'event then
> 		pc_out:=pc;
>
> ...
> end process;
>
>
> I don't know why it doesn't work. As I said I just want to simulate a clock
> so to show my proffesor how the processor works step by step (instruction
> by instruction).
>
> Hope you can help. Thanks!

Hello
Your clock edge condition looks wrong, it should be :
  	elsif simulated_clk = '1' and simulated_clk'event then
or you can use the rising_edge function instead :
          elsif rising_edge(simulated_clk) then

Nicolas



Site Home   Archive Home   FAQ Home   How to search the Archive   How to Navigate the Archive   
Compare FPGA features and resources   

Threads starting:
1994JulAugSepOctNovDec1994
1995JanFebMarAprMayJunJulAugSepOctNovDec1995
1996JanFebMarAprMayJunJulAugSepOctNovDec1996
1997JanFebMarAprMayJunJulAugSepOctNovDec1997
1998JanFebMarAprMayJunJulAugSepOctNovDec1998
1999JanFebMarAprMayJunJulAugSepOctNovDec1999
2000JanFebMarAprMayJunJulAugSepOctNovDec2000
2001JanFebMarAprMayJunJulAugSepOctNovDec2001
2002JanFebMarAprMayJunJulAugSepOctNovDec2002
2003JanFebMarAprMayJunJulAugSepOctNovDec2003
2004JanFebMarAprMayJunJulAugSepOctNovDec2004
2005JanFebMarAprMayJunJulAugSepOctNovDec2005
2006JanFebMarAprMayJunJulAugSepOctNovDec2006
2007JanFebMarAprMayJunJulAugSepOctNovDec2007
2008JanFebMarAprMayJunJulAugSepOctNovDec2008
2009JanFebMarAprMayJunJulAugSepOctNovDec2009
2010JanFebMarAprMayJunJulAugSepOctNovDec2010
2011JanFebMarAprMayJunJulAugSepOctNovDec2011
2012JanFebMarAprMayJunJulAugSepOctNovDec2012
2013JanFebMarAprMayJunJulAugSepOctNovDec2013
2014JanFebMarAprMayJunJulAugSepOctNovDec2014
2015JanFebMarAprMayJunJulAugSepOctNovDec2015
2016JanFebMarAprMayJunJulAugSepOctNovDec2016
2017JanFebMarAprMayJunJulAugSepOctNovDec2017
2018JanFebMarAprMayJunJulAugSepOctNovDec2018
2019JanFebMarAprMayJunJulAugSepOctNovDec2019
2020JanFebMarAprMay2020

Authors:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Custom Search