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 156375

Article: 156375
Subject: Re: Cyclone V hard memory controller
From: sunny.yin.xu@gmail.com
Date: Thu, 20 Mar 2014 01:58:56 -0700 (PDT)
Links: << >>  << T >>  << A >>
=E5=9C=A8 2013=E5=B9=B411=E6=9C=8815=E6=97=A5=E6=98=9F=E6=9C=9F=E4=BA=94UTC=
+8=E4=B8=8B=E5=8D=888=E6=97=B630=E5=88=8659=E7=A7=92=EF=BC=8Cbaum=E5=86=99=
=E9=81=93=EF=BC=9A
> Hi,
>=20
>=20
>=20
> I try to implement a DDR3 hard memory controller in a Cyclone v device
>=20
> a 5CGXFC3B6F23C7.
>=20
>=20
>=20
> I created an DDR3 hard memory controller IP core with the Megawizard,=20
>=20
> integrated the core in my design and added my design files in Quartus.
>=20
>=20
>=20
> The fitter of Quartus gives following error message
>=20
>=20
>=20
> Error (15332): Port SHIFTEN of cyclonev_pll_reconfig
>=20
> "HeadTop:I_HeadTop|DDR3Controller:I_MemCtrlBlk|Ddr3MemCtrl:Ddr3MemCtrl_1|=
Ddr3MemCtrl_000=20
>=20
>=20
>=20
> 2:ddr3memctrl_inst|Ddr3MemCtrl_pll0:pll0|pll1~PLL_RECONFIG" has 11=20
>=20
> connections, but the maximum
>=20
> bus width of port SHIFTEN is 9
>=20
>=20
>=20
> In the file Ddr3MemCtrl_pll0 there are 11 generic_pll instances and as=20
>=20
> far as I know the Cyclone Pll has only 9 clock outputs so I assume the=20
>=20
> error message refers to this and barks about the two additional clock=20
>=20
> outputs.
>=20
>=20
>=20
> In the Megawizard there is no switch to select the number of clock=20
>=20
> outputs of the hard memory controller.
>=20
>=20
>=20
> I tried to synthesise the example created by the Megawizard, but the=20
>=20
> funny thing is this example is not for the Cyclone V device I specified=
=20
>=20
> in Quartus and the fitter ends with an error message too.
>=20
> This time not about the Pll but about some errors with output pins.
>=20
>=20
>=20
> So my question is:
>=20
> Has anybody implemented successfully a design with a DDR3 hard memory=20
>=20
> controller in a Cyclone v device or stumbled on the same error message=20
>=20
> as above.
>=20
>=20
>=20
> Btw. I use Quartus 13.1 according to Altera the latest version but IMHO=
=20
>=20
> not the greatest.
>=20
>=20
>=20
> Robert

Hi,Robert=20
     Did you resolve this problem? I also meet it in 5CGXFC5C6F23C7N with Q=
uartus 13.1.My QSYS used clock bridge and mm bride.if ddr3.av0 is connected=
 with mm bridge or ddr3.av0 is connected with cpu data,this error will happ=
en.There is no error in Quartus 13.0.

Article: 156376
Subject: Re: Cyclone V hard memory controller
From: sunny.yin.xu@gmail.com
Date: Thu, 20 Mar 2014 02:05:05 -0700 (PDT)
Links: << >>  << T >>  << A >>
=E5=9C=A8 2013=E5=B9=B411=E6=9C=8815=E6=97=A5=E6=98=9F=E6=9C=9F=E4=BA=94UTC=
+8=E4=B8=8B=E5=8D=888=E6=97=B630=E5=88=8659=E7=A7=92=EF=BC=8Cbaum=E5=86=99=
=E9=81=93=EF=BC=9A
> Hi,
>=20
>=20
>=20
> I try to implement a DDR3 hard memory controller in a Cyclone v device
>=20
> a 5CGXFC3B6F23C7.
>=20
>=20
>=20
> I created an DDR3 hard memory controller IP core with the Megawizard,=20
>=20
> integrated the core in my design and added my design files in Quartus.
>=20
>=20
>=20
> The fitter of Quartus gives following error message
>=20
>=20
>=20
> Error (15332): Port SHIFTEN of cyclonev_pll_reconfig
>=20
> "HeadTop:I_HeadTop|DDR3Controller:I_MemCtrlBlk|Ddr3MemCtrl:Ddr3MemCtrl_1|=
Ddr3MemCtrl_000=20
>=20
>=20
>=20
> 2:ddr3memctrl_inst|Ddr3MemCtrl_pll0:pll0|pll1~PLL_RECONFIG" has 11=20
>=20
> connections, but the maximum
>=20
> bus width of port SHIFTEN is 9
>=20
>=20
>=20
> In the file Ddr3MemCtrl_pll0 there are 11 generic_pll instances and as=20
>=20
> far as I know the Cyclone Pll has only 9 clock outputs so I assume the=20
>=20
> error message refers to this and barks about the two additional clock=20
>=20
> outputs.
>=20
>=20
>=20
> In the Megawizard there is no switch to select the number of clock=20
>=20
> outputs of the hard memory controller.
>=20
>=20
>=20
> I tried to synthesise the example created by the Megawizard, but the=20
>=20
> funny thing is this example is not for the Cyclone V device I specified=
=20
>=20
> in Quartus and the fitter ends with an error message too.
>=20
> This time not about the Pll but about some errors with output pins.
>=20
>=20
>=20
> So my question is:
>=20
> Has anybody implemented successfully a design with a DDR3 hard memory=20
>=20
> controller in a Cyclone v device or stumbled on the same error message=20
>=20
> as above.
>=20
>=20
>=20
> Btw. I use Quartus 13.1 according to Altera the latest version but IMHO=
=20
>=20
> not the greatest.
>=20
>=20
>=20
> Robert

The same error will be happend when I tested it with DDR3 soft controller.

Article: 156377
Subject: Re: full functional coverage
From: al.basili@gmail.com (alb)
Date: 20 Mar 2014 16:17:02 GMT
Links: << >>  << T >>  << A >>
Hi Jim,

Jim Lewis <usevhdl@gmail.com> wrote:
[]
>> I've found a third option which might be quite interesting 
>> especially when dealing with standard buses:
[]
> This is ok at a testbench level, but if you wanted to use it 
> inside your system, you will need to check and see if your synthesis
> tool is tolerant of user defined resolution functions.  

I guess that's a kind of a lesson learned the hard way. I do not have as 
of now any working example that follows the option above mentioned, but 
if I manage to give it a try I'll post some results/impressions.

> You will want to make sure that the error injector (on the
> generation side) communicates with the checker (on the receiver
> side) so that the checker knows it is expecting a particular type
> of error.  In addition, you will want your test case generator to
> be able to initiate errors in a non-random fashion.

Right. My idea was to use the 'error injector' as a /slave/ but I do not 
yet know how to connect it to my transaction generator (or whatever is 
the appropriate name for it). I may potentially use global signals, but 
I'm not a big fan of them since they tend to increase universe entropy 
drastically!

In my framework I use two global records to communicate with the 
'server' and I could in principle extend them to pass the information 
further along within the defective module. It is not entirely clean 
though, in fact the server cannot handshake with the defective module 
since it does not know it has been so configured. Well, we can imagine 
that if the global records elements are filled it is because the client 
wants to inject those errors, so the server can assume the defective 
module is in place and will handshake with it. Uhm, this is getting 
interesting...

> For my testbenches, I like each BFM to be able to generate any
> type of error that the DUT can gracefully handle.  Then I set
> up the transactions so they can communicate this information.
> To randomly generate stimulus and inject errors, I use the
> OSVVM randomization methods to do this at the test case generation
> level (TestCtrl).    

And indeed the mechanism would work even if the BFM are encapsulated 
within internal components of the DUT and implement the error injection 
as suggested above.

BTW I just put my hands on 'Comprehensive functional verification' Wile, 
Goss, Roesner, it's a 700 pages volume on the verification cycle, I 
guess it'll keep me busy for some time ;-)

Al

Article: 156378
Subject: Re: full functional coverage
From: al.basili@gmail.com (alb)
Date: 20 Mar 2014 16:17:05 GMT
Links: << >>  << T >>  << A >>
Hi Jim,
Jim Lewis <usevhdl@gmail.com> wrote:
[]
>> I do not quite understand the reason to split testcases in separate 
>> architectures, I use to envelop the TbMemIO in what I call 'harness' and 
>> instantiate it in each of my testcases. The harness grows as BFMs become 
>> available and it never breaks an earlier testcase since the newly 
>> inserted BFM was not used in earlier testcases.
> This separation is important for reuse at different level of testing.  
> Separate that test case from that models that implement the exact 
> interface behavior.  The models can be implemented with either a 
> procedure in a package (for simple behaviors) or an entity and 
> architecture (for more complex models - this is what the paper I 
> referenced shows).

I think I did not correctly phrased what I meant. I do understand the 
importance of testcases to be separate. I have my 'client/server' model 
in place, where my transaction happens between them and then the server 
implements each call with a specific low level transaction, involving 
the BFM for each interface. In this way my client may operate as long as 
the server interface is kept the same.

What I did not understand in your paper was the 'need' of a separate 
architecture instead of a separate file with a new entity/architecture.

The harness I referred to earlier is what instantiate the DUT and all 
the necessary BFMs, the client/server transaction happens with a pair of 
global records (to_srv_ctrl/fr_srv_ctrl) which handles the 'handshake' 
in the transaction. The harness grows as more BFMs become available and 
more interfaces are being implemented.

>> Unfortunately cost and time are not yet available. I'd love to follow 
>> that course but as of now I need to rely on my own trials and 
>> guidance like yours ;-)
> Do you work for free?  If not, I suspect the cost of you learning by 
> reading, trial and error, and  searching the internet when you run 
> into issues is going to cost much more than a class.  You seem to be
> progressing ok though.  

I'm used to learn by reading (and asking). On top of this, my actual job 
description does not require these skills...another reason for not being 
able to ask for such a course! But I'm not giving up ;-)

Al

Article: 156379
Subject: Re: full functional coverage
From: Jim Lewis <usevhdl@gmail.com>
Date: Thu, 20 Mar 2014 12:34:29 -0700 (PDT)
Links: << >>  << T >>  << A >>
Hi Al,
Maybe this time I will answer the right question.  :)

> What I did not understand in your paper was the 'need' of a separate
> architecture instead of a separate file with a new entity/architecture.=
=20
There are two issues.  The obvious one is having multiple copies of the sam=
e entity can lead to maintenance issues if the interface changes.=20

The not so obvious is the impact of compile rules.  Dependencies in VHDL ar=
e on primary units (entity, package declaration, configuration declaration)=
 and not secondary design units (architecture or package body). =20

Lets assume the TestCtrl entity and architecture are in separate files and =
I am not using configurations.   I can compile my design and test hierarchy=
 and run test1.  Now to run test2, all I need to do is compile test2 archit=
ecture and I can restart the testbench and it runs (because the most recent=
ly compiled architecture is selected). =20

Going further, when I add configurations, I can compile my design, test hie=
rarchy, test1 architecture, and configuration1, and then run configuration1=
.  Then I can compile test2 architecture and configuration2, and then run c=
onfiguration2.  To re-run configuration1, all I need to do is select run co=
nfiguration1. =20

On the other hand, if we put the entity in the same file as the architectur=
e, then the process gets much harder.  If you compile test1, since the enti=
ty was recompiled, the testbench hierarchy above TestCtrl must also be reco=
mpiled, then you can start a simulation.  To run test2, again compile test2=
 and the testbench hierarchy above TestCtrl, and then start a simulation.  =
 Configuration declarations would require this same compile extensive proce=
ss.=20

I note some simulators work around some of this stuff with switches and aut=
omatically.  With switches works well, but is tedious.  Automatically works=
 most of the time, but from time to time it does not and that makes for deb=
ug sessions in which you are chasing a nonexistent problem. =20

Hope I answered the right question this time. =20

Cheers,
Jim

Article: 156380
Subject: Re: Xilinx ISERDESE2 deserializer primitive behaviour
From: matt.lettau@gmail.com
Date: Fri, 21 Mar 2014 11:36:33 -0700 (PDT)
Links: << >>  << T >>  << A >>
On Thursday, March 20, 2014 1:41:55 AM UTC-7, Carl wrote:
> Hi,
>=20
> =20
>=20
> I'm having some problems to understand the exact behavior of the ISERDESE=
2 primitive. What I need to understand is exactly how the unit will distrib=
ute the serial input to the bits in the output (paralell) words, or in othe=
r words, how ISERDESE aligns the frames on the incoming serial data stream =
in order to deliver the paralell words.
>=20
> =20
>=20
> Here is a screenshot showing the signals on some of the ports of a cascad=
ed (width expansion) ISERDES-pair:
>=20
> http://forums.xilinx.com/t5/image/serverpage/image-id/11986i790019220C796=
0F0/
>=20
>=20
>=20
> This example is actually from a simulation of the example design that is =
generated by Coregen (SelectIO Interface Wizard). Width is 14 bits, DDR mod=
e. The VHDL file can be downloaded here:
>=20
> http://forums.xilinx.com/xlnx/attachments/xlnx/7Series/3904/2/selectio_if=
_wiz_v4_1.zip
>=20
> =20
>=20
> The signal iserdes_q_vec is a vector [slave q8..q3] & [master q8..q1].
>=20
> =20
>=20
> From the input (ddly) and output (iserdes_q_vec) I can clearly see how th=
e frame is aligned - I have marked the frame by the two cursors. It is clea=
r that the ddly input within this frame (10000111100100) is what appears on=
 iserdes_q_vec on the next rising edge of clkdiv.
>=20
> =20
>=20
> The reason for this particular alignment is however unknown to me. I've l=
ooked in the User Guide (ug471) but can't find info on this.
>=20
> =20
>=20
> I tried to de-assert rst in various ways but couldn't really make anythin=
g out of the results (in this design, rst is de-asserted synchronously with=
 clkdiv, as suggested by the user guide).
>=20
> =20
>=20
> In my case, I have no training pattern and hance can't find the right ali=
gnment with bitslip operations. In my case, for the serial data, clkdiv is =
equal to the frame clock. From the simulation I can of course determine how=
 the frame is placed in the serial data, and fix the paralell words in cust=
om logic, but then I need to understand why I get this particular offset, a=
nd be convinced that I will always get exactly this particular offset.
>=20
> =20
>=20
> I would intuitively have expected clkdiv to act as a frame clock as well,=
 but nothing in the UG suggests that, and according to the simulation, that=
 is also clearly not the case.
>=20
> =20
>=20
> Device: xc7k160t-2
>=20
> =20
>=20
> Thanks in advance,
>=20
> Carl

I don't think you can rely on the real hardware presenting the parallel wor=
d in any particular bit alignment or offset. You will want to add a trainin=
g sequence that is run at startup to bitslip the iserdes appropriately, and=
 then turn the interface lose for general traffic.

Article: 156381
Subject: Re: Xilinx ISERDESE2 deserializer primitive behaviour
From: GaborSzakacs <gabor@alacron.com>
Date: Fri, 21 Mar 2014 15:44:37 -0400
Links: << >>  << T >>  << A >>
matt.lettau@gmail.com wrote:
> On Thursday, March 20, 2014 1:41:55 AM UTC-7, Carl wrote:
>> Hi,
>>
>>  
>>
>> I'm having some problems to understand the exact behavior of the ISERDESE2 primitive. What I need to understand is exactly how the unit will distribute the serial input to the bits in the output (paralell) words, or in other words, how ISERDESE aligns the frames on the incoming serial data stream in order to deliver the paralell words.
>>
>>  
>>
>> Here is a screenshot showing the signals on some of the ports of a cascaded (width expansion) ISERDES-pair:
>>
>> http://forums.xilinx.com/t5/image/serverpage/image-id/11986i790019220C7960F0/
>>
>>
>>
>> This example is actually from a simulation of the example design that is generated by Coregen (SelectIO Interface Wizard). Width is 14 bits, DDR mode. The VHDL file can be downloaded here:
>>
>> http://forums.xilinx.com/xlnx/attachments/xlnx/7Series/3904/2/selectio_if_wiz_v4_1.zip
>>
>>  
>>
>> The signal iserdes_q_vec is a vector [slave q8..q3] & [master q8..q1].
>>
>>  
>>
>> From the input (ddly) and output (iserdes_q_vec) I can clearly see how the frame is aligned - I have marked the frame by the two cursors. It is clear that the ddly input within this frame (10000111100100) is what appears on iserdes_q_vec on the next rising edge of clkdiv.
>>
>>  
>>
>> The reason for this particular alignment is however unknown to me. I've looked in the User Guide (ug471) but can't find info on this.
>>
>>  
>>
>> I tried to de-assert rst in various ways but couldn't really make anything out of the results (in this design, rst is de-asserted synchronously with clkdiv, as suggested by the user guide).
>>
>>  
>>
>> In my case, I have no training pattern and hance can't find the right alignment with bitslip operations. In my case, for the serial data, clkdiv is equal to the frame clock. From the simulation I can of course determine how the frame is placed in the serial data, and fix the paralell words in custom logic, but then I need to understand why I get this particular offset, and be convinced that I will always get exactly this particular offset.
>>
>>  
>>
>> I would intuitively have expected clkdiv to act as a frame clock as well, but nothing in the UG suggests that, and according to the simulation, that is also clearly not the case.
>>
>>  
>>
>> Device: xc7k160t-2
>>
>>  
>>
>> Thanks in advance,
>>
>> Carl
> 
> I don't think you can rely on the real hardware presenting the parallel word in any particular bit alignment or offset. You will want to add a training sequence that is run at startup to bitslip the iserdes appropriately, and then turn the interface lose for general traffic.

Which really sucks when you have no training pattern as noted in the OP.
In the past, I've used DDR registers instead of ISERDES in cases where
there was no way to have a training pattern.  However I never needed to
do this above 585 Mbps.  In my case I was doing Camera Link (7:1 serial
with 1x word clock), and I "deserialized" the clock to get a framing
signal.  It might be possible to do the same with ISERDES, if you can
relay on multiple ISERDES to come up in the same phase each time.  Then
applying the same number of bitslips to all ISERDES (including the one
"deserializing" the clock) should allow you to find the right alignment
by applying bitslip until the deserialized clock has the right phase
(1100011 for Camera Link).

-- 
Gabor

Article: 156382
Subject: Re: Xilinx ISERDESE2 deserializer primitive behaviour
From: langwadt@fonz.dk
Date: Sat, 22 Mar 2014 13:35:51 -0700 (PDT)
Links: << >>  << T >>  << A >>
Den fredag den 21. marts 2014 20.44.37 UTC+1 skrev Gabor:
> matt.lettau@gmail.com wrote:
>=20
> > On Thursday, March 20, 2014 1:41:55 AM UTC-7, Carl wrote:
>=20
> >> Hi,
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> I'm having some problems to understand the exact behavior of the ISERD=
ESE2 primitive. What I need to understand is exactly how the unit will dist=
ribute the serial input to the bits in the output (paralell) words, or in o=
ther words, how ISERDESE aligns the frames on the incoming serial data stre=
am in order to deliver the paralell words.
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> Here is a screenshot showing the signals on some of the ports of a cas=
caded (width expansion) ISERDES-pair:
>=20
> >>
>=20
> >> http://forums.xilinx.com/t5/image/serverpage/image-id/11986i790019220C=
7960F0/
>=20
> >>
>=20
> >>
>=20
> >>
>=20
> >> This example is actually from a simulation of the example design that =
is generated by Coregen (SelectIO Interface Wizard). Width is 14 bits, DDR =
mode. The VHDL file can be downloaded here:
>=20
> >>
>=20
> >> http://forums.xilinx.com/xlnx/attachments/xlnx/7Series/3904/2/selectio=
_if_wiz_v4_1.zip
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> The signal iserdes_q_vec is a vector [slave q8..q3] & [master q8..q1].
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> From the input (ddly) and output (iserdes_q_vec) I can clearly see how=
 the frame is aligned - I have marked the frame by the two cursors. It is c=
lear that the ddly input within this frame (10000111100100) is what appears=
 on iserdes_q_vec on the next rising edge of clkdiv.
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> The reason for this particular alignment is however unknown to me. I'v=
e looked in the User Guide (ug471) but can't find info on this.
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> I tried to de-assert rst in various ways but couldn't really make anyt=
hing out of the results (in this design, rst is de-asserted synchronously w=
ith clkdiv, as suggested by the user guide).
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> In my case, I have no training pattern and hance can't find the right =
alignment with bitslip operations. In my case, for the serial data, clkdiv =
is equal to the frame clock. From the simulation I can of course determine =
how the frame is placed in the serial data, and fix the paralell words in c=
ustom logic, but then I need to understand why I get this particular offset=
, and be convinced that I will always get exactly this particular offset.
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> I would intuitively have expected clkdiv to act as a frame clock as we=
ll, but nothing in the UG suggests that, and according to the simulation, t=
hat is also clearly not the case.
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> Device: xc7k160t-2
>=20
> >>
>=20
> >> =20
>=20
> >>
>=20
> >> Thanks in advance,
>=20
> >>
>=20
> >> Carl
>=20
> >=20
>=20
> > I don't think you can rely on the real hardware presenting the parallel=
 word in any particular bit alignment or offset. You will want to add a tra=
ining sequence that is run at startup to bitslip the iserdes appropriately,=
 and then turn the interface lose for general traffic.
>=20
>=20
>=20
> Which really sucks when you have no training pattern as noted in the OP.
>=20
> In the past, I've used DDR registers instead of ISERDES in cases where
>=20
> there was no way to have a training pattern.  However I never needed to
>=20
> do this above 585 Mbps.  In my case I was doing Camera Link (7:1 serial
>=20
> with 1x word clock), and I "deserialized" the clock to get a framing
>=20
> signal.  It might be possible to do the same with ISERDES, if you can
>=20
> relay on multiple ISERDES to come up in the same phase each time.  Then
>=20
> applying the same number of bitslips to all ISERDES (including the one
>=20
> "deserializing" the clock) should allow you to find the right alignment
>=20
> by applying bitslip until the deserialized clock has the right phase
>=20
> (1100011 for Camera Link).
>=20

I've done something similar for an AD9228 ADC, bitslip applied until the=20
deserialized frame clock shows the correct pattern
=20
-Lasse

Article: 156383
Subject: debug access to memory (JTAG?)
From: "mnentwig" <24789@embeddedrelated>
Date: Mon, 24 Mar 2014 15:56:43 -0500
Links: << >>  << T >>  << A >>
Hi,

I'm looking for a vendor-independent solution to configure RAM contents on
an FPGA without rebuilding the RTL. Is there such a thing?
Xilinx has their proprietary data2mem interface that let me replace data in
the bitstream file, but it requires a lot of "low-level" work to describe
how the RAM is formed from primitives. What I'm looking for is a generic
solution, in the same way as putting initial values into inferred RAM, but
without having to recompile everything.

I've built my own "homespun" loader using a hardware UART interface, i.e.
some FTDI breakout board, and it works well enough within its limitations
(extra gates, possibility of bus contention with the design). Now I was
wondering, as this seems like such a common problem, is there any known
"simple" way for this? JTAG maybe? I did some superficial search here but
JTAG seemed to get quite complex, if I stay away from vendor-dependent
tools.	   
					
---------------------------------------		
Posted through http://www.FPGARelated.com

Article: 156384
Subject: looking for a basic PCIe example
From: revkarol@gmail.com
Date: Mon, 24 Mar 2014 17:27:04 -0700 (PDT)
Links: << >>  << T >>  << A >>
Hi,

I'm looking for a high-speed PCI express example, like the one given in this video:

https://www.youtube.com/watch?v=IOHgltR11QY&noredirect=1

but obviously my google-fu is failing me because I can't find an example matching the video.  

Does anyone have a DMA example as he shows, or something similar.  I've been using Xillybus thus far, which is great but isn't useful for high-speed transfers.

Advance thanks,
Karol.

Article: 156385
Subject: Re: 3/4 Punctured Convolution encoding
From: eyecatcherdear@gmail.com
Date: Tue, 25 Mar 2014 22:31:55 -0700 (PDT)
Links: << >>  << T >>  << A >>
On Wednesday, 15 January 2014 11:37:04 UTC+5, Tim Wescott wrote:
> On Sat, 11 Jan 2014 23:31:10 -0800, eyecatcherdear wrote: > Hi I have to =
perform punctured convolution encoding at 3/4 rate on > Verilog. Can anyone=
 provide me the source code to perform puncturing? I > am able to perform c=
onvolution coding. Don't know how to implement > puncturing on it.I have to=
 maintain an output data rate of 100 MHz. OK. It's not even close to April,=
 so this isn't an April fool's joke. What part of removing one of every fou=
r bits are you having trouble with? -- Tim Wescott Wescott Design Services =
http://www.wescottdesign.com

haha..well actually i have performed puncturing..sorry for the incomplete p=
ost.but that is at different output rate approach. I want to know if there =
is method in which i can maintain same rate for input and output without ha=
lting the data and just obtain a punctured code.  Though my code works just=
 fine. I have PLL clock generation core limitation in my design. So the pro=
blem arises.

Article: 156386
Subject: Re: Initializing color bars on CH7301
From: jigarmori@gmail.com
Date: Wed, 26 Mar 2014 00:47:48 -0700 (PDT)
Links: << >>  << T >>  << A >>
I'm using virtex 5 ML506 board. I want to display image on monitor. Kit has DVI connections. So please tell me, is it necessary to program DVI using IIC? or It works with giving only data, sync signals, and clocks..

Article: 156387
Subject: Re: looking for a basic PCIe example
From: "rupertlssmith@googlemail.com" <rupertlssmith@googlemail.com>
Date: Wed, 26 Mar 2014 01:35:10 -0700 (PDT)
Links: << >>  << T >>  << A >>
On Tuesday, March 25, 2014 12:27:04 AM UTC, Karol Hennessy wrote:
> Hi,
> 
> 
> 
> I'm looking for a high-speed PCI express example, like the one given in this video:
> 
> 
> 
> https://www.youtube.com/watch?v=IOHgltR11QY&noredirect=1
> 
> 
> 
> but obviously my google-fu is failing me because I can't find an example matching the video.  
> 
> 
> 
> Does anyone have a DMA example as he shows, or something similar.  I've been using Xillybus thus far, which is great but isn't useful for high-speed transfers.
> 
> 
> 
> Advance thanks,
> 
> Karol.


Hi,

Never heard of Xillybus before, so I was curious to take a look at it. 

Why is it not useful for high-speed transfers? Page 17 of this manual discusses high speed IO. I only skim read it, but it seems to discuss the relevant technique, mapping user space RAM as a DMA buffer.

http://xillybus.com/downloads/doc/xillybus_host_programming_guide_linux.pdf

Rupert

Article: 156388
Subject: Re: looking for a basic PCIe example
From: Karol Hennessy <revkarol@gmail.com>
Date: Thu, 27 Mar 2014 03:09:37 -0700 (PDT)
Links: << >>  << T >>  << A >>
Hi Rupert,

On his website, he says the limits are about 400 MB/s for most devices, which is nothing like the PCIe bandwidth (assuming you've more than one lane).

http://xillybus.com/pcie-download

The limitation seems to be due to the bus width/CPU overhead.  The author explains it here:

http://forum.xillybus.com/viewtopic.php?f=2&t=42

To talk to another device, I'll have to write my own driver I think.  That's probably too much work for what I want so, I'll probably use some sort of high speed Gb connection.

If you don't need warp-speed, I'd still recommend xillybus.  It's extremely easy to use, even for a n00b like me.  

Thanks for the response,
Karol.

On Wednesday, 26 March 2014 09:35:10 UTC+1, rupert...@googlemail.com  wrote:
> On Tuesday, March 25, 2014 12:27:04 AM UTC, Karol Hennessy wrote:
> 
> > Hi,
> 
> > 
> 
> > 
> 
> > 
> 
> > I'm looking for a high-speed PCI express example, like the one given in this video:
> 
> > 
> 
> > 
> 
> > 
> 
> > https://www.youtube.com/watch?v=IOHgltR11QY&noredirect=1
> 
> > 
> 
> > 
> 
> > 
> 
> > but obviously my google-fu is failing me because I can't find an example matching the video.  
> 
> > 
> 
> > 
> 
> > 
> 
> > Does anyone have a DMA example as he shows, or something similar.  I've been using Xillybus thus far, which is great but isn't useful for high-speed transfers.
> 
> > 
> 
> > 
> 
> > 
> 
> > Advance thanks,
> 
> > 
> 
> > Karol.
> 
> 
> 
> 
> 
> Hi,
> 
> 
> 
> Never heard of Xillybus before, so I was curious to take a look at it. 
> 
> 
> 
> Why is it not useful for high-speed transfers? Page 17 of this manual discusses high speed IO. I only skim read it, but it seems to discuss the relevant technique, mapping user space RAM as a DMA buffer.
> 
> 
> 
> http://xillybus.com/downloads/doc/xillybus_host_programming_guide_linux.pdf
> 
> 
> 
> Rupert

Article: 156389
Subject: [cross-post][long] svn workflow for fpga development
From: al.basili@gmail.com (alb)
Date: 27 Mar 2014 13:44:34 GMT
Links: << >>  << T >>  << A >>
Hi everyone,

this is not really a question, but more some food for thoughts on how to 
optimize an fpga development flow leveraging the benefit of a vcs.

I've been using svn since sometime now and I cannot imagine a world 
without a vcs under your belt when dealing with complex systems in a 
collaborative environment.

In the past I've always followed two simple rules:
 1. never break the trunk
 2. commit often

The reasons behind these two rules are quite simple and I stick to them 
because from them it derives a set of additional rules which allow you 
to respect the one above.

The first rule is there because without it anyone new in the team cannot 
simply checkout a copy and rely on it. This implies that commits to the 
trunk are performed when a feature or a bugfix is completed and does not 
break compatibility with the rest of the system.

Allowing a newcomer to easily get into the flow alleviates hours of 
training, but even experienced designers do need to rely on a stable 
version to perform their regression testing and/or add features to it.

The second rule is needed because the very purpose of a vcs is to track 
changes as regularly as possible so that you (or somebody else) can roll 
back and forth and use what is most appropriate at any given time.

Apparently the two rules are in contraddiction since the first advocates 
few commits (only the good ones) and the second lots of commits (even 
broken ones). To benefit from both of the two worlds 'branching' come to 
rescue. When branching the trunk we set up our working environment in a 
clean way and we can mess up with it as long as we want, until the 
feature/bugfix is complete. Only at that point we can merge it back into 
the trunk so that the trunk gets all the goodies we worked on.

Working on a branch leaves (no pun intended) the trunk safe from 
exploration efforts and allows everyone to rely upon it. After all, an 
healthy trunk means an healthy tree.

The pitfall here is that too often people branch and then never sync 
with the evolving trunk, so when it is time to merge it is a hell! 
Syncing regularly with the trunk allows to keep the branch on track 
without the risk to fight when it is time to close the branch and move 
on.

I have deliberately left out of the flow the concept of tagging because 
that is not adding too much to this conversation and might be treated 
separately (maybe another thread ;-)).

If you find this flow somehow lacking important features and/or missing 
completely essential points which are relevant to fpga development flow 
I'd appreciate if you could share your thoughts.

Al

-- 
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?

Article: 156390
Subject: Re: [cross-post][long] svn workflow for fpga development
From: gtwrek@sonic.net (Mark Curry)
Date: Thu, 27 Mar 2014 18:07:42 +0000 (UTC)
Links: << >>  << T >>  << A >>
In article <bpioa2F3io8U1@mid.individual.net>, alb <al.basili@gmail.com> wrote:
>
>this is not really a question, but more some food for thoughts on how to 
>optimize an fpga development flow leveraging the benefit of a vcs.
>
>I've been using svn since sometime now and I cannot imagine a world 
>without a vcs under your belt when dealing with complex systems in a 
>collaborative environment.
>
>In the past I've always followed two simple rules:
> 1. never break the trunk
> 2. commit often

I'll add my 2 cents.  Rule 1 is not as important in my experience.  
Having a regular regression (nightly, weekly, whatever), that runs
on a clean checkout of the trunk is more important.  Then you
can easily identify what broke the trunk.  The version control
tools allow's everyone to continue working (by unmerging the 
offending commit).  

Rules 2 is spot on.  Check in early, check in often.

Working on branches is great, but as you indicated, merging
sucks.  The tools (SVN at least) allow easy branching,
but are shitty when it comes to merges.  

If you've got a version control tool that allows for 
easy merging back to the trunk, then you've got the best
of all.

Atria (clearcase) really did this well, but was hell for admin, and 
performance sucked.  

I've no experience with the more modern distributed vcs (git, mercurial).  
Someone else hopefully will chime in here on how well they 
handle branches and merges... 

--Mark


Article: 156391
Subject: Re: [cross-post][long] svn workflow for fpga development
From: Tom Gardner <spamjunk@blueyonder.co.uk>
Date: Thu, 27 Mar 2014 19:17:50 +0000
Links: << >>  << T >>  << A >>
On 27/03/14 13:44, alb wrote:
> In the past I've always followed two simple rules:
>   1. never break the trunk
>   2. commit often

So, what do you put on the trunk and what's on the branches?

One strategy which works for some types of system and
some ways of team working is:
   - to have the trunk for development
   - whenever you reach a milestone of some sort,
     create a branch containing the milestone
   - whenever the regression tests have passed,
     check in to the trunk (hopefully frequently)
   - if it is necessary to save when regression
     tests have not been passed, checkin to a branch

Thus
   - the head of the trunk always contains the latest
     working system.
   - significant historical waypoints can be found on
     a branch



Article: 156392
Subject: Re: built in adc in fpga????
From: tmcdon4ld@gmail.com
Date: Thu, 27 Mar 2014 13:55:56 -0700 (PDT)
Links: << >>  << T >>  << A >>
On Friday, November 8, 2013 5:25:23 AM UTC-6, shrinivas gotur wrote:
> hi guys,
> 
>         i was wondering whether can i have built in adc in fpga  with good (say 12 or 14 bit) resolution and 0-5v input range will be available in market. please revert back soon if u know any.i am waiting

You might find these of interest.
http://davidkessner.wordpress.com/?s=fpga

Article: 156393
Subject: Re: MapLib:93 - Illegal LOC on symbol "clk.PAD" (pad signal=clk) or
From: ahmad2smile@gmail.com
Date: Thu, 27 Mar 2014 22:33:46 -0700 (PDT)
Links: << >>  << T >>  << A >>
Still gives out error if you have clock for other signals.. in other modules..

"Pack:1107 - Unable to combine the following symbols into a single IOB"

I tried to set the "clock buffers" to just 1 so that It can contain the 1st clock in Project and It worked for Me!  

Article: 156394
Subject: lattice Diamond on Linux - programming doesn't work...
From: Brane2 <brankob@avtomatika.com>
Date: Fri, 28 Mar 2014 03:22:22 -0700 (PDT)
Links: << >>  << T >>  << A >>
I've managed to manually install Diamond ( latest 3.1 64-bit) on my Gentoo.

Now everything seems to be working, except programming the chip on board.

I am playing with their MachXO2 breakout board and such boards have FTDI-2232 chip for programming.

If doesn't matter if I start programming tool within Diamond or manually, it behaves the same.

It detects the FTDI chip, when I plug USB cable in the board and then start cable detect:

"Board with FTDI USB Host Chip detected.
INFO - Multiple cables detected!"

But if I try to scan chips in JTAG chain, i get:

"ERROR - Scan Failed - Creating Blank Programmer Project
The other process currently running. Cannot continue."


And programming attempt gets me:

"The other process currently running. Cannot continue."


So program can detect that the FTDI chip on breakout board is accessible, it just can't do anything with it.


I tried everything. I replaced the HW, cable, used different USB port, changed the FTDI VCP access library for newer one etc etc.

Nothing works. I don't think Diamond is that sensitive to library version since it packs all tricky libraries by itself.

Only thing I haven't checked yet is how the dynamic loader finds and loads them. It might be that some system libs are used instead of bundled ones.

Other thing that comes to mind is that maybe something within kernel changed wrt to files and maps in /sys directory ( sysfs).

After that, I'm out of options.

I am usiong a workaround atm - standalone programmer util on separate WinXP machine and I am about to try if I can do the same with 32-bit Linux version ( after failing with 64-bit one).


My system is:

AMD Phenom II x4  955BE stock
8 GiB RAM
Radeon 6850
all open source drivers AFAIR

Gentoo 64-bit with systemd+udev
xfce desktop

kernel gentoo-sources-3.13.7, without usb-serial and ftdi module driver 
( if present they hog the ftdi chip and make two extra ttyS devices, while programmer expects to be able to access the chip directly)

And I had to add manually extra rule in udev so that at usb plugin udev would create device with right ownership and access rights so that programmer util could access it:


SUBSYSTEM=="usb" , ACTION=="add"  , ATTR{idVendor}=="0403" , MODE="666" , OWNER="brane2" , GROUP="users"


So, if anyone has an idea, it is welcome.



Article: 156395
Subject: Re: [cross-post][long] svn workflow for fpga development
From: al.basili@gmail.com (alb)
Date: 28 Mar 2014 13:24:42 GMT
Links: << >>  << T >>  << A >>
Hi Mark,

In comp.arch.fpga Mark Curry <gtwrek@sonic.net> wrote:
[]
>>In the past I've always followed two simple rules:
>> 1. never break the trunk
>> 2. commit often
> 
> I'll add my 2 cents.  Rule 1 is not as important in my experience.  
> Having a regular regression (nightly, weekly, whatever), that runs
> on a clean checkout of the trunk is more important.  Then you
> can easily identify what broke the trunk.  The version control
> tools allow's everyone to continue working (by unmerging the 
> offending commit).  

and this is where I wanted to go in the first place, but there's no 
regression running regularly. Indeed the whole verification process is a 
bit of a mess, but that's another story! [1]

In the event you *do not* have a regular regression you may now 
understand why rule 1 is in place. Without it, any commit may break the 
trunk silently until the next guy performs a sim and nothing works 
anymore.

Without a regression in place every commit can break the trunk and it 
will take time before the issue comes out. Being able to branch and 
commit without fearing to break anything allows much more freedom to the 
developer to trace her/his changes.

> Rules 2 is spot on.  Check in early, check in often.

this one is vital. You want to keep track of what you are doing, but you 
need to preserve the team sanity as well, so it would be too risky to 
allow everyone to commit early and often on a trunk.

> Working on branches is great, but as you indicated, merging
> sucks.  The tools (SVN at least) allow easy branching,
> but are shitty when it comes to merges.  

This happens because people branch and do not sync with the trunk 
regularly. I'm quite interested in understanding the technical reasons 
behind the merging issue in svn, sure is that without this possibility 
there's no way out of using only the trunk.
 
> If you've got a version control tool that allows for 
> easy merging back to the trunk, then you've got the best
> of all.

The reason for this post is because I'm trying to raise arguments to 
convince people in the team to use svn and to profit from it. Proposing 
yet another tool to somebody who doesn't even see why we need a vcs is 
pointless and will only undermine the whole effort.

> I've no experience with the more modern distributed vcs (git, mercurial).  
> Someone else hopefully will chime in here on how well they 
> handle branches and merges... 

I'm tempted about moving on to git, but I guess that it would be already 
a big success if the team accepts a fair usage of svn. On my own, I'll 
probably experiment with git-svn which seems to be a valuable tool to 
profit of git performances in an svn environment.

Al

[1] I'll soon post something about regression testing...and yes, that's 
a menace!

Article: 156396
Subject: Re: [cross-post][long] svn workflow for fpga development
From: Sean Durkin <news_MONTH@tuxroot.de>
Date: Fri, 28 Mar 2014 15:18:48 +0100
Links: << >>  << T >>  << A >>
alb wrote:
>> Working on branches is great, but as you indicated, merging
>> sucks.  The tools (SVN at least) allow easy branching,
>> but are shitty when it comes to merges.  
> 
> This happens because people branch and do not sync with the trunk 
> regularly. I'm quite interested in understanding the technical reasons 
> behind the merging issue in svn, sure is that without this possibility 
> there's no way out of using only the trunk.

In my experience merging in SVN works fine if every file is touched only
by a single person. It only breaks in this situation:

- Alice and Bob check out the latest trunk or create local branchges for
themselves
- they start making their changes
- Bob is done and commits a change to file XYZ or merges his changed
branch to the trunk.
- Alice also works on her stuff, but also on file XYZ, but on the
version that she originally checked out, not the one Bob has changed in
the meantime.
- Now Alice wants to merge her changes. Amongst others, her merge
includes a changed version of file XYZ. But her version does not have
the changes Bob made earlier. So now the SVN client sees that that
file's revision in her branch that this new file is based on is older
than the one in the trunk. Committing her file would probably mean
reversing Bob's changes to XYZ, which could be intentional or a mistake.
There's no way for the client to know for sure, so it just quits and
complains and forces the user to manually decide which changes to apply.
If this happens for a single file in a merge, the entire merge doesn't
work, because half a merge would probably break everything.

As long as every file is edited exclusively by one person, there should
be no problem (at least I haven't had any). In past projects, this was
mostly a problem with top-level files. Everyone is responsible for a
module they work on exclusively, but if they add or change ports of that
module, that has to be accounted for up through the hierarchy. So
instead of changing the top-level-file, they should inform the person
responsible for that file that the ports need to be changed. This is
additional overhead but better than breaking merges completely; it never
was a big problem for us, but I see it can be problematic in bigger
projects with more people.

I guess (don't know since I haven't looked into it) git and mercurial
have some sort of mechanism to lock files or portions of files or track
every detail you change, so during a merge the client can do
step-by-step modifications of shared files, which maybe can resolve more
uncertainties.

Have fun,
Sean

Article: 156397
Subject: Re: Xilinx ISERDESE2 deserializer primitive behaviour
From: Carl <carwer0@gmail.com>
Date: Fri, 28 Mar 2014 08:46:04 -0700 (PDT)
Links: << >>  << T >>  << A >>
Thanks for comments.

Yes, it does seem like there's no good solution for this (when no training =
pattern is available).

Good ideas from Gabor and Lasse about deserialising the frame clock. Howeve=
r, in my case, the data and the frame clock would come from different ports=
 on the ISERDESE2 (DDLY and D respectively) since the data comes from a pad=
 through an IDELAY and the frame clock comes from an MMCM. I don't know if =
I can then fully trust the deserialised data to be in phase.

I decided to drop the ISERDES and do my deserialiser in logic instead. A pi=
ty I can't use the silicon resources though; a deterministic behaviour of t=
he primitive, and it being documented, would have been enough.

Article: 156398
Subject: Re: Xilinx ISERDESE2 deserializer primitive behaviour
From: Tom Gardner <spamjunk@blueyonder.co.uk>
Date: Fri, 28 Mar 2014 18:32:03 +0000
Links: << >>  << T >>  << A >>
On 20/03/14 08:41, Carl wrote:
> I'm having some problems to understand the exact behavior of the ISERDESE2 primitive. What I need to understand is exactly how the unit will distribute the serial input to the bits in the output (paralell) words, or in other words, how ISERDESE aligns the frames on the incoming serial data stream in order to deliver the paralell words.
>
> In my case, I have no training pattern and hance can't find the right alignment with bitslip operations.

I may be missing something, but if there is no training pattern then surely all alignments are equally valid.

If not, then you need to specify how you know when the alignment is correct.
Then take the ISERDES output, apply the specified algorithm, and (if necessary) shift the ISERDES output appropriately.

Article: 156399
Subject: Re: Xilinx ISERDESE2 deserializer primitive behaviour
From: KJ <kkjennings@sbcglobal.net>
Date: Fri, 28 Mar 2014 12:32:11 -0700 (PDT)
Links: << >>  << T >>  << A >>
On Friday, March 28, 2014 2:32:03 PM UTC-4, Tom Gardner wrote:
> I may be missing something, but if there is no training pattern then sure=
ly all=20
> alignments are equally valid. If not, then you need to specify how you kn=
ow=20
> when the alignment is correct. Then take the ISERDES output, apply the=20
> specified algorithm, and (if necessary) shift the ISERDES output appropri=
ately.

What you're missing is when the pattern is simply specified and therefore a=
 'given'.  An example, as Gabor mentioned, is Camera Link which specifies u=
se of specific parts that are recommended for use for that interface.  Thos=
e parts sync it up so that the incoming low speed clock edges occurs on par=
ticular high speed clock cycle.  No training pattern is needed.

With the FPGA SERDES primitives, no such alignment occurs automatically.  F=
urthermore, multriple SERDES primitives are not guaranteed to be aligned wi=
th each other so each needs to be bit-slipped independently.

When you try to implement a Camera Link interface (or any SERDES interface =
that normally uses those same TI interface parts) using an FPGA, you will w=
ant to either have control of both ends (so you can insert a training patte=
rn) or come up with creative work arounds (like Gabor seems to have found).

Kevin Jennings




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