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 13200

Article: 13200
Subject: Re: Content Addressable Memorys
From: Marc Delvaux <mdel@globespan.net>
Date: Thu, 19 Nov 1998 11:00:15 -0500
Links: << >>  << T >>  << A >>
This is a multi-part message in MIME format.
--------------014C7FCCC92EBA5769EEDAA8
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit



Brian Drummond wrote:

> On 19 Nov 1998 08:26:03 +0000, Alistair McEwan <aam@pierrot.comlab>
> wrote:
>
> >
> >
> >Hi,
> >
> >I am looking for sources of information on Content Addressable
> >Memorys.  In particular, I want to find up to date details and
> >specifications of CAM chip suppliers and CAM boards.
> >
> Search for MUSIC Semiconductors.

http://www.music-ic.com/Definetely MUSIC, but it may depend on your application.Motorola has dedicated CAM for ATM applications.
GEC-Plessey used to have CAM (still active?)

Note that the use of CAM should always be compared to
using a variety of search techniques.  CAM are very nice but
also power hungry and using external ones is not always that
simple because of the interface defined by MUSIC e.g.
This would be specially important if you are using inside a FPGA.

>
>
> - Brian



--------------014C7FCCC92EBA5769EEDAA8
Content-Type: text/x-vcard; charset=us-ascii; name="vcard.vcf"
Content-Transfer-Encoding: 7bit
Content-Description: Card for Marc Delvaux
Content-Disposition: attachment; filename="vcard.vcf"

begin:          vcard
fn:             Marc Delvaux
n:              Delvaux;Marc
org:            GlobeSpan Semiconductors
adr:            100 Schulz Drive;;;Red Bank;NJ;07701;USA
email;internet: mdel@globespan.net
title:          LSI designer
tel;work:       +1 (732) 345 7502
tel;fax:        +1 (732) 345 7592
tel;home:       +1 (732) 578 9255
x-mozilla-cpt:  ;0
x-mozilla-html: TRUE
version:        2.1
end:            vcard


--------------014C7FCCC92EBA5769EEDAA8--

Article: 13201
Subject: Re: VHDL testbench supporting reconfiguration?
From: mj <mjenkins@iastate.edu>
Date: Thu, 19 Nov 1998 11:29:15 -0600
Links: << >>  << T >>  << A >>
ds12 wrote:
> 
> do you know if it is possible to test/control a run-time reconfigurable
> design using VHDL?
> 
> and how would you go about doing that?

I've done several testbenches that use a simulation control file to
support configuration, running specific tests, etc..

it takes some work, but here's how to do it:

1. create a simulation control file with a known format, ie each line
contains a keyword with known parameters.  let's say you want to write
to some registers and then run a test, then write in different values
and run the same test, your control file might look like:
	write 0001 ff99 -- write <address> <data>
	write 0002 ff99
 	trans		-- do a transmit
	write 0001 ff88 -- write in new data
	write 0002 ff88
	trans		-- do another transmit

2. set up the testbench to read in the control file (this example is in
VHDL '87) and do some action based on the data read in. This example
supports the control file format above:

	LIBRARY ieee;
	USE ieee.std_logic_1164.all;
	USE std.textio.all;

	ENTITY design_tb IS END;

	ARCHITECTURE testbench OF design_tb IS
	....
	BEGIN
	  MAIN : PROCESS
		file sim_control   : text is in simctl.txt -- this file contains the
tb info
		variable InLine    : line; -- a pointer to the line of info in the
file
		variable Mode      : string(1 to 5); -- space to hold the test
		variable Address   : string(1 to 4); -- space to hold the address for
a write
		variable Data	   : string(1 to 4); -- space to hold the data for a
write
		variable LineCount : natural := 0;   -- space to keep track of what
line you are on
	  BEGIN
		IF endfile (sim_control) THEN
		  ASSERT false
		  REPORT "Error opening control file"
		  SEVERITY error;
		  WAIT;
		END IF;

		WHILE NOT endfile (sim_control) LOOP
		  -- get the next line of info from the control file
		  ReadLine(sim_control,InLine);
		  LineCount := LineCount + 1;
		  
		  Mode := InLine.all(1 to 5);
		  
		  -- switch on the Mode to see what to do
		  CASE Mode IS -- don't put parentheses around Mode

			WHEN "write" => -- put quotes around each string
			  Address := InLine.all(7 to 10);
			  Data := InLine.all(12 to 15);
			
			  -- do the write
			  WriteProcedure(Address,Data,....);

			WHEN "trans" =>
			  -- do the transmit
			  TransmitData(....);

			WHEN others => NULL:
		  END CASE;

		  -- after all the tests have been completed, suspend the process
		  WAIT;
	  END PROCESS Main;


This is a very basic example.  There are many more advanced things that
can be built upon this simple framework.  As always, let me know if you
have any questions.

.Mj.

mailto:mjenkins@iastate.edu

-- 

Learn from the mistakes of others...you can't live long enough
to make them all yourself.
Article: 13202
Subject: Re: DES in VHDL?
From: Mathias Schmalisch <sm15@e-technik.uni-rostock.de>
Date: Thu, 19 Nov 1998 18:32:53 +0100
Links: << >>  << T >>  << A >>
Dies ist eine mehrteilige Nachricht im MIME-Format.
--------------2BAE75FF41FC3B298204994C
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

I designed and optimized a DES with 16 loops in VHDL for Xilinx FPGA.

The unconstrained synthesis resulted in 227 CLBs on a XC4020-3 and a speed
of 23.5 MHz = 94Mbits/s.

I also implemented a interface for a 8051µC and in such a way the DES can
work as coprocessor.

--

Mathias Schmalisch
sm15@e-technik.uni-rostock.de

--------------2BAE75FF41FC3B298204994C
Content-Type: text/x-vcard; charset=us-ascii; name="vcard.vcf"
Content-Transfer-Encoding: 7bit
Content-Description: Visitenkarte für Mathias Schmalisch
Content-Disposition: attachment; filename="vcard.vcf"

begin:          vcard
fn:             Mathias Schmalisch
n:              Schmalisch;Mathias
org:            University Rostock
email;internet: sm15@e-technik.uni-rostock.de
x-mozilla-cpt:  ;0
x-mozilla-html: FALSE
version:        2.1
end:            vcard


--------------2BAE75FF41FC3B298204994C--

Article: 13203
Subject: Re: XNF issue
From: Le mer Michel <michel.lemer@ago.fr>
Date: Thu, 19 Nov 1998 19:40:23 +0100
Links: << >>  << T >>  << A >>
Ray Andraka wrote:

> The M1 tools do not use the xnf format.  They do currently have the
> ability to import xnf files, but there is no guarantee this will be
> supported in future releases.
>
> Utku Ozcan wrote:
>
> > I have heard that Xilinx won't support XNF. Is this true?
> >
> > Utku
>
> --
> -Ray Andraka, P.E.
> President, the Andraka Consulting Group, Inc.
> 401/884-7930     Fax 401/884-7950
> email randraka@ids.net
> http://users.ids.net/~randraka

So, what will happen with Coregen ?

Michel.

Article: 13204
Subject: Re: Synthesizeablel fifo
From: Rickman <spamgoeshere4@yahoo.com>
Date: Thu, 19 Nov 1998 16:41:48 -0500
Links: << >>  << T >>  << A >>
Ray Andraka wrote:
> 
> That flip flop doesn't have to be set/reset on the transition to the equal state.
> It can be set/reset based on a gross comparison of the read and write counters.  The
> trick is if the fifo is more than half full, it will be full when the pointers
> become equal unless it first becomes less than half full and vice-versa.  Where I
> work in schematics, I don't have a synthesizable version of this.
> 
> Johnny Smooth wrote:
> 
> > Ray Andraka wrote in message <3652DA19.BD7F31CE@ids.net>...
> > >Not so smooth there Johnny,
> > >
> > >You don't need storage for N+1 words for an N deep fifo.  Read=Write means
> > either
> > >empty or full.  The direction this condition was entered from differentiates
> > the
> > >two conditions. This uses an extra flip-flop in the control logic, but has the
> >
> > And what might you clock it with?  That little flipflop is the problem.  Because
> > the
> > two interfaces are asynchronous AND the flags must be valid AT ALL TIMES,
> > there is really no good safe way to know what the last op was.  Have you tried

I believe your original objection to Johnny's method was that he was
using an arithmetic compare in order to set the full/empty flags (in
addition to wasting one location of memory). But your "gross comparison"
will require an arithmetic compare of the two pointers, no? I think that
Johnny may be right about a simpler circuit. When the two clocks are
asynchronous, you can never make an assumption about when the output of
both counters are stable. So the arithmetic compare would be very
difficult. On the other hand, a gray coded counter could be examined for
equality without worring about races. With only a single bit changing,
you will either see the old value or the new value. 

I believe Johnny needed a compare of A+1 = B. This can be done by using
the D inputs to the A counter FFs since the D inputs will always have
the next value on them (A+1). So this also becomes an equality compare. 

So then the only problem is the metastability issue. Of course the best
way to handle this is to synchronize one of the inputs to the clock of
the other and run the entire FIFO from that clock. That is what I did in
my last design. But I am sure that is not an available solution in many
cases. 


-- 

Rick Collins

redsp@XYusa.net

remove the XY to email me.
Article: 13205
Subject: Xilinx 5.2/6 tools v M1.5 tools for an XC4013E part.....
From: "Austin Franklin" <dark4room@ix.netcom.com>
Date: 19 Nov 1998 22:17:42 GMT
Links: << >>  << T >>  << A >>
Hi,

I just converted a working, in production, design from the 5.2/6 tools over
to the new M1.5 (with updates) tools.

The design made all but three TIMESPECs with the old tools (and these
TIMESPECS it didn't make were intentional...), yet with the supposed 'new
and improved' tools, it could do no better than 14 missed TIMESPECS.  Very
dissappointing.

Anyone else have similar experiences?

Also, EPIC is very awkward to use, and is missing some very very usefull
features the old XACT/XDE tool has, like probes....

Is there a DOS based download program with the new tools (I guess I could
use the old XCHECKER???), or do I have to convert all the 486/16M/120M DOS
notebooks we use in the lab for downloading over to CD based (NT only comes
on CD) NT machines???

Does anyone else feel these new tools are a giant step backwards in
functionality and usability?

Austin Franklin
darkroom@ix.netcom.com

Article: 13206
Subject: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: "John J. Hovey" <hovey@arlut.utexas.edu>
Date: Thu, 19 Nov 1998 17:05:41 -0600
Links: << >>  << T >>  << A >>
This is a multi-part message in MIME format.
--------------B15BDFF9F619397CF1E8A486
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hello anybody and everybody!

	I have been working on a complex host/daughter card system for the PCI
bus which is using a total of 5 Xilinx FPGA's along with a host of other
components.  We chose the XL series of the 4000 architecture for the
extended RAM features and Versa-ring routing.  As it happened the
smaller devices of the family are only available in the low voltage XL
versions.
	Now that I have been attempting to implement the designs I am finding
major problems with designs that are logically correct but do not
function as expected in the real world.  These designs pass the timing
constraints I'm using but do not function at all or stop in the middle
of processing loops.  At times the state machines hold in an apparent
meta-stable state.
	I have found conditions where active signals associated with completely
separate logic functions effect the operation of state machines in the
same device.
	I have also found a condition where the logic will function only if the
3.3 VDC supply to the Xilinx devices is raised to 3.52 VDC, and not
below.
	Is anyone experiencing the same type of problems with this or any other
device family from Xilinx. 

P.S.

Long live Altera!!

John J. Hovey
ARL: University of Texas
--------------B15BDFF9F619397CF1E8A486
Content-Type: text/x-vcard; charset=us-ascii; name="vcard.vcf"
Content-Transfer-Encoding: 7bit
Content-Description: Card for John Hovey
Content-Disposition: attachment; filename="vcard.vcf"

begin:          vcard
fn:             John Hovey
n:              Hovey;John
email;internet: hovey@arlut.utexas.edu
x-mozilla-cpt:  ;0
x-mozilla-html: FALSE
version:        2.1
end:            vcard


--------------B15BDFF9F619397CF1E8A486--

Article: 13207
Subject: Re: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: "Austin Franklin" <dark4room@ix.netcom.com>
Date: 19 Nov 1998 23:25:01 GMT
Links: << >>  << T >>  << A >>
> 	Now that I have been attempting to implement the designs I am finding
> major problems with designs that are logically correct but do not
> function as expected in the real world.  These designs pass the timing
> constraints I'm using but do not function at all or stop in the middle
> of processing loops.  At times the state machines hold in an apparent
> meta-stable state.

Did you do functional simulation to verify that your design works in the
first place?

What front end are you using (an HDL or schematic)?

It sounds to me like you have two possible problems.  First, if you are
using an HDL, the HDL may not be giving you the results you believe you
'should' be getting.  This can be either to wrong code, or erroneous HDL
compilation.  Secondly, sounds like you have timing problems, dispite your
belief you make timing.  Are you sure you have ALL your timing paths
specified, and did you verify that all the paths are correct?

Austin Franklin
darkroom@ix.netcom.com

Article: 13208
Subject: Configuring using Parallel port
From: karl@ehk.epson.com.hk ("Karl Yung")
Date: Thu, 19 Nov 1998 16:28:48 -0800
Links: << >>  << T >>  << A >>
You can try the following Web Site:http://www.xess.com/FPGAKarl



   -**** Posted from Supernews, Discussions Start Here(tm) ****-
http://www.supernews.com/ - Host to the the World's Discussions & Usenet
Article: 13209
Subject: Re: Example of clock circuit needed !
From: leslie.yip@asmpt.com
Date: Fri, 20 Nov 1998 01:20:45 GMT
Links: << >>  << T >>  << A >>
Hello

I have designed I2C circuit on Xilinx XC42XXE FPGA. I lost the simulation file
but I have a hardcopy. If you would like to read the source, email to me and I
will reply to you ----- email:
leslieyip@ctimail.com

In article <36519683.EF48F3E3@yahoo.com>,
  Rickman <spamgoeshere4@yahoo.com> wrote:
> Le mer Michel wrote:
> >
> > ovilup wrote:
> >
> > > Hello !
> > >
> > > I am working on an I2C controller. Now, I am designing the
> > > internal clock generator. I have an 1.5 MHz internal clock,
> > > from which I have to generate the 100 KHz, 90 KHz, 44 KHz
> > > 1.5 KHz SCL clocks.
> > >
> > > Any examples of such an clock generator would be appreciated !
> > >
> > > Thank you in advance.
> > > OL
> >
> > Hello
> >
> > I do not know exactly what it is but I heard about the direct numeric
> > synthesis. It is use in the signal generators to privide a wave of a
> > specific frequency.
> >
> > Bye.
> > Michel.
>
> If I may add my two cents worth to the thread. NCO and DDS are the same
> in this context. Both use an phase angle accumulator with a constant
> phase step. The output of the phase accumulator can be used directly by
> picking the top bit, or by using some number of top bits to generate a
> sine wave via a translation table. This digital sine wave would be
> converted to an analog signal via a DAC, filtered to remove the "jitter"
> component, and run into a comparator to generate a symetrical square
> wave, jitter free clock. This is a lot of work for what Ovilup is doing.
>
> Unfortunately, OL's frequencies are not exact multiples, so that you
> can't just divide the 1.5 MHz down to get 90 kHz or 44 kHz exactly. So a
> slightly different master frequency is needed or one of the above
> methods need to be used, depending on the accuracy required.
>
> --
>
> Rick Collins
>
> redsp@XYusa.net
>
> remove the XY to email me.
>

-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/       Search, Read, Discuss, or Start Your Own    
Article: 13210
Subject: Re: Synthesizeablel fifo
From: leslie.yip@asmpt.com
Date: Fri, 20 Nov 1998 01:29:37 GMT
Links: << >>  << T >>  << A >>
Below is the Synthesiable code of 3-level FIFO on ALtera. For the simulation
file and waveform file, email to me.

Leslie Yip
CityU of Hong Kong


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity FIFO is
  port( NRST:			in	std_logic;
        WR,RD:			in	std_logic;
        DIN:			in	std_logic_vector(15 downto 0);

        EMPTY,FULL:		out	std_logic;
        DOUT:			out	std_logic_vector(15 downto 0)
	);
end FIFO;

architecture FIFO_ARCH of FIFO is
type RAM_TYPE is array(2 downto 0) of std_logic_vector(15 downto 0);
signal WCNT,RCNT: std_logic_vector(1 downto 0); --integer range 0 to 2;
signal T_WCNT,T_RCNT: integer range 0 to 2;
signal MEM: RAM_TYPE := RAM_TYPE'(
"0000000000000000",
"0000000000000000",
"0000000000000000");		-- FIFO memory

-- signal DWEN,DDWEN,RWEN : std_logic;
-- signal DOE,DDOE,ROE : std_logic;
-- signal TDOUT : std_logic_vector(15 downto 0);

begin

process(NRST,WR)
begin
  if NRST = '0' then
    for i in MEM'range loop
	 MEM(i)<= (others=>'0');
  end loop;
  elsif WR='1' and WR'event then
	  MEM(T_WCNT) <= DIN;
  end if;
end process;

  T_WCNT <= conv_integer(WCNT);
  T_RCNT <= conv_integer(RCNT);

process(NRST,WR)
begin
 if NRST='0' then
     WCNT <= "00";

 elsif WR='1' and WR'event then
	 if WCNT = 2 then
         WCNT <= "00";
	 else
	   WCNT <= WCNT +1;
	 end if;
 end if;
end process;


process(NRST,RD)
begin
 if NRST='0' then
     RCNT <=  "00";

 elsif RD='1' and RD'event then
	 if RCNT = 2 then
	     RCNT <= "00";
	 else
	     RCNT <= RCNT + 1;
	 end if;
 end if;
end process;


--process(NRST,REN)
--begin
-- if REN='1' then
--     DOUT <= TDOUT;
-- else
--     DOUT <= (others=>'Z');
-- end if;
--end process;

  DOUT <= MEM(T_RCNT);




process(WCNT,RCNT)
begin
  if WCNT = RCNT then
    EMPTY <= '1';
  else
    EMPTY <= '0';
  end if;

  if 	(RCNT=0 and WCNT=2) or
	(RCNT=1 and WCNT=0) or
	(RCNT=2 and WCNT=1) then
	FULL <= '1';
  else
	FULL <= '0';
  end if;
end process;

end FIFO_ARCH;


In article <3650C15B.BBA0EC00@worldnet.att.net>,
  James LaLone <lalone@worldnet.att.net> wrote:
> Can someone shed light on building a fifo that can be synthesized?
> The pointers, and ram, are no problem.  What I'm having problems with
> are the flags.  Of course, the fifo that I want to build have
> asynchronous read and write clocks.
> I've looked over Xilinx applications XAPP051 and XAPP131, but they still
> leave me with some implementation questions.
>
> Thanks in advance,
> -Jim
>

-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/       Search, Read, Discuss, or Start Your Own    
Article: 13211
Subject: Re: Xilinx 5.2/6 tools v M1.5 tools for an XC4013E part.....
From: mushh@jps.net (David Decker)
Date: Fri, 20 Nov 1998 03:46:43 GMT
Links: << >>  << T >>  << A >>
Austin,

The Xact6 floorplanner used to be useful as a viewer to show me where
my RLOCs were. M1.5 can not even do that. (Now, I use Fliptronic's
Chipview)

M1.5 doesn't seem to have any good report to show which paths are not
covered by any time specs, or multiple time specs.

I do think the place and rout does a good job assuming Data Path
RLOCs, and comprehensive time specs, and effort set to max and
clean-ups set to 5. I've heard that the M1.5 default efforts are lower
than Xact6, so give it a try at a higher effort, 

Cheers,



Dave Decker
Diablo Research Co. LLC

Please use only one 'h' in mush. I'm trying to reduce the spam.



"Animals .  .  . are not brethren they are not 
underlings;  they are other nations, 
caught with ourselves in the net of life and time, 
fellow prisoners of the splendor and travail of 
the earth."
Henry Beston -  The Outermost House
Article: 13212
Subject: Re: Synthesizeablel fifo
From: Ray Andraka <no_spam_randraka@ids.net>
Date: Fri, 20 Nov 1998 00:34:42 -0500
Links: << >>  << T >>  << A >>
Depends on the size of the fifo.  For a 16 deep fifo, you can use a pair of 2 bit gray
counters for each pointer.  The top one indicates which quadrant of the fifo the pointer
is in, the bottom  points to one of the four entries.  The top halves of the two pointers
feed one 4 lut to do the gross compare. Since the counters are gray coded, you don't have
the multi-bit race problem.  This works great for a 16 deep fifo.  Bigger than that, and
you get into more complexity.  In that case, I suppose the cost of an extra word becomes a
smaller percentage of the fifo so it may not be so bad.  I don't often have a need for an
async fifo deeper than 16 entries in an FPGA.

Rickman wrote:

> Ray Andraka wrote:
> >
> > That flip flop doesn't have to be set/reset on the transition to the equal state.
> > It can be set/reset based on a gross comparison of the read and write counters.  The
> > trick is if the fifo is more than half full, it will be full when the pointers
> > become equal unless it first becomes less than half full and vice-versa.  Where I
> > work in schematics, I don't have a synthesizable version of this.
> >
> > Johnny Smooth wrote:
> >
> > > Ray Andraka wrote in message <3652DA19.BD7F31CE@ids.net>...
> > > >Not so smooth there Johnny,
> > > >
> > > >You don't need storage for N+1 words for an N deep fifo.  Read=Write means
> > > either
> > > >empty or full.  The direction this condition was entered from differentiates
> > > the
> > > >two conditions. This uses an extra flip-flop in the control logic, but has the
> > >
> > > And what might you clock it with?  That little flipflop is the problem.  Because
> > > the
> > > two interfaces are asynchronous AND the flags must be valid AT ALL TIMES,
> > > there is really no good safe way to know what the last op was.  Have you tried
>
> I believe your original objection to Johnny's method was that he was
> using an arithmetic compare in order to set the full/empty flags (in
> addition to wasting one location of memory). But your "gross comparison"
> will require an arithmetic compare of the two pointers, no? I think that
> Johnny may be right about a simpler circuit. When the two clocks are
> asynchronous, you can never make an assumption about when the output of
> both counters are stable. So the arithmetic compare would be very
> difficult. On the other hand, a gray coded counter could be examined for
> equality without worring about races. With only a single bit changing,
> you will either see the old value or the new value.
>
> I believe Johnny needed a compare of A+1 = B. This can be done by using
> the D inputs to the A counter FFs since the D inputs will always have
> the next value on them (A+1). So this also becomes an equality compare.
>
> So then the only problem is the metastability issue. Of course the best
> way to handle this is to synchronize one of the inputs to the clock of
> the other and run the entire FIFO from that clock. That is what I did in
> my last design. But I am sure that is not an available solution in many
> cases.
>
> --
>
> Rick Collins
>
> redsp@XYusa.net
>
> remove the XY to email me.



--
-Ray Andraka, P.E.
President, the Andraka Consulting Group, Inc.
401/884-7930     Fax 401/884-7950
email randraka@ids.net
http://users.ids.net/~randraka


Article: 13213
Subject: Re: Xilinx 5.2/6 tools v M1.5 tools for an XC4013E part.....
From: Ray Andraka <no_spam_randraka@ids.net>
Date: Fri, 20 Nov 1998 00:45:57 -0500
Links: << >>  << T >>  << A >>
Ain't progress grand!  I use the 6.02 whenever I can get away with it.
Unfortunately since it doesn't support the newer devices that is becoming less
often than I like.  M1 is designed for the push-a- button-get-a-design crowd.
Unfortunately, the attention given to making a push button thing work OK came
at the price of the controls us expert users depend on.  Yell, scream, kick
etc.  Xilinx might even notice you raising an objection.

Just wait till austin discovers that m1 doesn't support all the legal mappings
that 6.0 did, or that some designs that were placed and routed under 6.0 won't
route at all under M1.  I can just hear him now when he needs to massage the
xnf file to do something like setting INIT= values (due to xilinx not
supporting occurence attributes) and he discovers that the ngd is a closed
format binary file.

Austin Franklin wrote:

> Hi,
>
> I just converted a working, in production, design from the 5.2/6 tools over
> to the new M1.5 (with updates) tools.
>
> The design made all but three TIMESPECs with the old tools (and these
> TIMESPECS it didn't make were intentional...), yet with the supposed 'new
> and improved' tools, it could do no better than 14 missed TIMESPECS.  Very
> dissappointing.
>
> Anyone else have similar experiences?
>
> Also, EPIC is very awkward to use, and is missing some very very usefull
> features the old XACT/XDE tool has, like probes....
>
> Is there a DOS based download program with the new tools (I guess I could
> use the old XCHECKER???), or do I have to convert all the 486/16M/120M DOS
> notebooks we use in the lab for downloading over to CD based (NT only comes
> on CD) NT machines???
>
> Does anyone else feel these new tools are a giant step backwards in
> functionality and usability?
>
> Austin Franklin
> darkroom@ix.netcom.com



--
-Ray Andraka, P.E.
President, the Andraka Consulting Group, Inc.
401/884-7930     Fax 401/884-7950
email randraka@ids.net
http://users.ids.net/~randraka


Article: 13214
Subject: Re: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: Ray Andraka <no_spam_randraka@ids.net>
Date: Fri, 20 Nov 1998 00:55:04 -0500
Links: << >>  << T >>  << A >>
Assuming you've done a  thorough simulation and timing analysis, it sounds like you
might have a signal integrity problem.  First, make sure you've got a bypass cap on
every vcc pin and close by at that.  Check to make sure you clock(s) are clean.
Ringing on the clock  _will_ cause the symptoms you are describing, as will severe
groundbounce.

Most of all, don't panic.  Xilinx parts are pretty good.  If you feed them good
power (none of the cheap discount stuff), keep their clocks clean, and load a
verified design, they will work every time.

John J. Hovey wrote:

> Hello anybody and everybody!
>
>         I have been working on a complex host/daughter card system for the PCI
> bus which is using a total of 5 Xilinx FPGA's along with a host of other
> components.  We chose the XL series of the 4000 architecture for the
> extended RAM features and Versa-ring routing.  As it happened the
> smaller devices of the family are only available in the low voltage XL
> versions.
>         Now that I have been attempting to implement the designs I am finding
> major problems with designs that are logically correct but do not
> function as expected in the real world.  These designs pass the timing
> constraints I'm using but do not function at all or stop in the middle
> of processing loops.  At times the state machines hold in an apparent
> meta-stable state.
>         I have found conditions where active signals associated with completely
> separate logic functions effect the operation of state machines in the
> same device.
>         I have also found a condition where the logic will function only if the
> 3.3 VDC supply to the Xilinx devices is raised to 3.52 VDC, and not
> below.
>         Is anyone experiencing the same type of problems with this or any other
> device family from Xilinx.
>
> P.S.
>
> Long live Altera!!
>
> John J. Hovey
> ARL: University of Texas
>
>   ------------------------------------------------------------------------
>
>   John Hovey <hovey@arlut.utexas.edu>
>
>   John Hovey
>     <hovey@arlut.utexas.edu>
>     Netscape Conference Address
>     Netscape Conference DLS Server
>   Additional Information:
>   Last Name      Hovey
>   First Name     John
>   Version        2.1



--
-Ray Andraka, P.E.
President, the Andraka Consulting Group, Inc.
401/884-7930     Fax 401/884-7950
email randraka@ids.net
http://users.ids.net/~randraka


Article: 13215
Subject: Re: Serial EPROMs
From: jdehaven@my-dejanews.com
Date: Fri, 20 Nov 1998 06:20:18 GMT
Links: << >>  << T >>  << A >>
For now, check Atmel for EEprom alternatives to Xilinx OTP SPROMs.  Look for
Xilinx to announce FLASH reprogrammable SPROMs in 1H99.

John

In article <36534FB6.F5523F38@yordas.demon.co.uk>,
  Chris Eilbeck <chris@yordas.demon.co.uk> wrote:
> Are there any serial EPROMs for use with Xilinx XC4k chips?  The XC170x
> chips seem not to have an erasable variant but I'd like to avoid the
> wasted PCB space and adding jumpers etc. to change between a parallel
> III cable for development and a regular EPROM for the semi-permanent
> design.
>
> Chris
> --
> Chris Eilbeck
> mailto:chris@yordas.demon.co.uk
>


--
John DeHaven
Insight Electronics
Xilinx-Dedicated Senior FAE
PH: (503)644-3300

-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/       Search, Read, Discuss, or Start Your Own    
Article: 13216
Subject: Re: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: rjs <nobody@home.com>
Date: Fri, 20 Nov 1998 06:22:51 GMT
Links: << >>  << T >>  << A >>
Sounds like you have some serious problems. Some ideas:

1. Check your timing. That fact that raising voltage to the part
makes it
work sounds like you're on the hairy edge timing-wise. Learn how
to use
trace to run useful reports and make sure you've got all your
paths covered.
2. If you're using HDL design entry read the Xilinx map and par
reports
to make sure critical logic is not getting ripped out. Code that
simulates
fine can sometimes synthesize to garbage. Read the trimming
reports carefully
and try to account for everything. Also look at CLB and FF usage
and make
sure it makes sense.
3. Make sure your global reset was implemented correctly and that
your clocks were
routed using global buffers.
4. Make sure you don't use the JTAG pins for general-purpose I/O.
Prohibit these
in your UCF file and terminate them on the board.

I've never seen a Xilinx FPGA design that simulated correctly and
met
timing (assuming it was properly constrained) that did not work in
the system.
If it doesn't work then 99.99% of the time it's your fault, not
the part or
the tools.

If you're so sold on Altera then why the change? Sometimes it's
better to stay
with what you know and love.

Good luck. Give us a post when you figure it out.

RJS


"John J. Hovey" wrote:
> 
> Hello anybody and everybody!
> 
>         I have been working on a complex host/daughter card system for the PCI
> bus which is using a total of 5 Xilinx FPGA's along with a host of other
> components.  We chose the XL series of the 4000 architecture for the
> extended RAM features and Versa-ring routing.  As it happened the
> smaller devices of the family are only available in the low voltage XL
> versions.
>         Now that I have been attempting to implement the designs I am finding
> major problems with designs that are logically correct but do not
> function as expected in the real world.  These designs pass the timing
> constraints I'm using but do not function at all or stop in the middle
> of processing loops.  At times the state machines hold in an apparent
> meta-stable state.
>         I have found conditions where active signals associated with completely
> separate logic functions effect the operation of state machines in the
> same device.
>         I have also found a condition where the logic will function only if the
> 3.3 VDC supply to the Xilinx devices is raised to 3.52 VDC, and not
> below.
>         Is anyone experiencing the same type of problems with this or any other
> device family from Xilinx.
> 
> P.S.
> 
> Long live Altera!!
> 
> John J. Hovey
> ARL: University of Texas

-- 

---------------------------
 real addr:
  rsefton_@_home.com
  (remove the underscores)
---------------------------
Article: 13217
Subject: Re: Synthesizeablel fifo
From: Goran.Bilski@enator.se
Date: Fri, 20 Nov 1998 07:42:16 GMT
Links: << >>  << T >>  << A >>
In article <3653A41D.47B8C5D6@ids.net>,
  Ray Andraka <no_spam_randraka@ids.net> wrote:
> That flip flop doesn't have to be set/reset on the transition to the equal
state.
> It can be set/reset based on a gross comparison of the read and write
counters.  The
> trick is if the fifo is more than half full, it will be full when the pointers
> become equal unless it first becomes less than half full and vice-versa.
Where I
> work in schematics, I don't have a synthesizable version of this.
>
> Johnny Smooth wrote:
>
> > Ray Andraka wrote in message <3652DA19.BD7F31CE@ids.net>...
> > >Not so smooth there Johnny,
> > >
> > >You don't need storage for N+1 words for an N deep fifo.  Read=Write means
> > either
> > >empty or full.  The direction this condition was entered from
differentiates
> > the
> > >two conditions. This uses an extra flip-flop in the control logic, but has
the
> >
> > And what might you clock it with?  That little flipflop is the problem.
Because
> > the
> > two interfaces are asynchronous AND the flags must be valid AT ALL TIMES,
> > there is really no good safe way to know what the last op was.  Have you
tried
> > this,
> > or are you just speculating?  It's a deceptive problem.  I've revisited that
> > extra flipflop
> > several times, and for truly Asynchronous FIFOs, the cleanest approach I've
> > found is just to take the hit on the extra word and flag logic for the
guarantee
> > of
> > asynchronicity (wasn't that a Police album?  :-)   ).  For a custom CMOS
FIFO I
> > designed,
> > I did come up with a circuit based on SR latches and an EQUAL signal to
generate
> > the flags, but that was far from synthesizable.  Again, this is for small
> > FIFOs (tens of words); for larger FIFOs, use a synchronous controller for a
> > RAM in the middle, and use small asynchronous FIFOs on the front and back.
> > If you can synchronize one port to the internal sync. FIFO, then bonus!
> >
> > I'll try to get a copy of my code from work and email it to you.  If you
have a
> > better
> > solution, then I would certainly like to see it (and use it!).
> >
> > Thanks,
> > John
>
> --
> -Ray Andraka, P.E.
> President, the Andraka Consulting Group, Inc.
> 401/884-7930     Fax 401/884-7950
> email randraka@ids.net
> http://users.ids.net/~randraka
>
>
Hi,

Here is a synthesizable version of xilinx xapp note 051. I have modified is a
bit. It is designed with several components and It works with leonardo. I
think that synopsys guys will have problem since their tools can handle this
level of VHDL.

In order to have use Virtex families one has only to write a new archtecture
of the dual-port RAM component which I have if someone is interested.

Have fun with it.
Göran Bilski
Enator Elektroniksystem AB



A lot of VHDL code

First some dual-port memory.

<Gen_DpRAM_e.vhd>
--===========================================================================
== -- Project  : -- Filename  : $RCSfile: Gen_DpRAM_e.vhd,v $ -- Designer  :
Goran Bilski RDOE-GB(K)  <gorbi@kairo.rld.smab> -- Version  : $Revision: 1.2
$ -- Version Date  : $Date: 1998/11/19 08:48:14 $ -- -- Description -- 
Implement a true Dual-Port RAM with a read port and a write/read port. -- 
The two ports works independent from each other. The read is asynchronously.
-- -- Signal Description -- --	Reset  => Reset the DPRAM if possible! (True
for DFF implementation --  not true for xilinx) --  Addr1  => Write/Read
address --  WrClk  => Write Clock --  DataIn  => Data to write --  DataOut1
=> Data read by the address Addr1 --  Addr2  => Read address --  DataOut2 =>
Data read by the address Addr2 -- -- Change Log -- -- $Log: Gen_DpRAM_e.vhd,v
$ -- Revision 1.2  1998/11/19 08:48:14	qmwgobi -- Header modification -- --
Revision 1.1.1.1  1998/10/20 12:39:51  qmwgobi -- -- -- Revision 1.1 
1998/02/25 13:21:51  gorbi -- Initial revision -- -- -- Copyright ******
Enator Elektroniksystem AB ******
--===========================================================================
== library IEEE; use IEEE.Std_Logic_1164.all;

entity Gen_DpRAM is
  generic (
    Use_Muxes : Boolean := False;
    Mem_Size  : Integer := 36;
    Addr_Size : Integer := 6;
    Data_Size : Integer := 16
    );
  port (
    Reset    : in Boolean;
    -- Read/Write port 1
    Addr1    : in  Std_Logic_Vector(Addr_Size-1 downto 0);
    WrClk    : in  Std_Logic;
    WE       : in  Boolean;
    DataIn   : in  Std_Logic_Vector(Data_Size-1 downto 0);
    DataOut1 : out Std_Logic_Vector(Data_Size-1 downto 0);
    -- Read port 2
    Addr2    : in  Std_Logic_Vector(Addr_Size-1 downto 0);
    DataOut2 : out Std_Logic_Vector(Data_Size-1 downto 0)
    );
end Gen_DpRAM;

<Gen_DpRAM_a.vhd>
--===========================================================================
== -- Project  : -- Filename  : $RCSfile: Gen_DpRAM_xilinx_a.vhd,v $ --
Designer  : Goran Bilski RDOE-GB(K)  <gorbi@kairo.rld.smab> -- Version	:
$Revision: 1.2 $ -- Version Date  : $Date: 1998/11/19 08:48:14 $ -- --
Description --	Implement a dual-port ram for the Xilinx 4000 family -- --
Signal Description -- -- -- -- Change Log -- -- $Log:
Gen_DpRAM_xilinx_a.vhd,v $ -- Revision 1.2  1998/11/19 08:48:14  qmwgobi --
Header modification -- -- Revision 1.1.1.1  1998/10/20 12:39:51  qmwgobi --
-- -- Revision 1.3  1998/08/20 11:35:28  kxriche -- Fixed address sizes to
Dual-Port RAM for Mem_Sizes smaller than 16 -- -- Revision 1.2	1998/03/03
08:49:00  gorbi -- Changed library Exemplar to library Work -- -- Revision
1.1  1998/02/25 13:26:16  gorbi -- Initial revision -- -- -- Copyright ******
Enator Elektroniksystem AB ******
--===========================================================================
== library IEEE; use IEEE.Std_Logic_1164.all; --use IEEE.Numeric_Std.all;
library Work; use Work.Exemplar_1164.all;

architecture XILINX_RTL of Gen_DpRAM is

  component RAM16x1D
    port (
      a3,a2,a1,a0             : in Std_Logic;
      dpra3,dpra2,dpra1,dpra0 : in Std_Logic;
      we,wclk,d               : in Std_Logic;
      spo, dpo                : out Std_Logic
      );
  end component;

  component TBuf
    port (
      I : in  Std_Logic;
      T : in  Std_Logic;
      O : out Std_Logic
      );
  end component;

  constant RAM_Banks : integer := 1 + ((Mem_Size - 1) / 16);

  signal Write : Std_Logic_Vector(RAM_Banks-1 downto 0);

  subtype Word is Std_Logic_Vector(Data_Size-1 downto 0);

  type Mux_Level_Array is array(natural range <>) of Word;

  signal RAM_Bank_Out1 : Mux_Level_Array(Ram_Banks-1 downto 0);
  signal RAM_Bank_Out2 : Mux_Level_Array(Ram_Banks-1 downto 0);

  signal RAM_Sel1 : Integer range Ram_Banks-1 downto 0;
  signal RAM_Sel2 : Integer range Ram_Banks-1 downto 0;

  signal Read1 : Std_Logic_Vector(Ram_Banks-1 downto 0);
  signal Read2 : Std_Logic_Vector(Ram_Banks-1 downto 0);

  signal Ram_Addr1 : Std_Logic_Vector(3 downto 0);
  signal Ram_Addr2 : Std_Logic_Vector(3 downto 0);

--   function To_Integer(Arg : Std_Logic_Vector) return Natural is
--     variable XArg : Std_Logic_Vector(Arg'Length-1 downto 0) := Arg;
--     variable RESULT: NATURAL := 0;
--    begin
--     for I in XARG'RANGE loop
--       RESULT := RESULT+RESULT;
--       if XARG(I) = '1' then
--         RESULT := RESULT + 1;
--       end if;
--     end loop;
--     return RESULT;
--   end To_Integer;

  function Mux_Tree(Datas   : in Mux_Level_Array;
                    Selects : in Std_Logic_Vector) return Word is
    variable Len,Middle : Integer;
    variable Left,Right : Word;
  begin
    Len := Datas'LENGTH;
    Middle := Len/2 + Datas'Right;
    if Len = 1 then
      return Datas(Datas'Left);
      -- TBD Check that Selects'Length is ....
    elsif Len = 2 then
      if Selects(Selects'Left) = '0' then
        return Datas(Datas'Left);
      else
        return Datas(Datas'Right);
      end if;
    else
      Left  := Mux_Tree(Datas(Datas'Left downto Middle),
                        Selects(Selects'Left-1 downto Selects'Right));
      Right := Mux_Tree(Datas(Middle-1 downto Datas'Right),
                       Selects(Selects'Left-1 downto Selects'Right));
      if Selects(Selects'Left) = '0' then
        return Left;
      else
        return Right;
      end if;
    end if;
  end Mux_Tree;

begin

  RAM_Sel_Gen : if Ram_Banks > 1 generate
    Ram_Sel1 <= evec2int(Addr1(Addr1'Left downto 4));
    Ram_Sel2 <= evec2int(Addr2(Addr2'Left downto 4));
  end generate;

  Write_Select : process(WE,Ram_Sel1)
  begin
    Write <= (others => '0');
    if WE then
      if Ram_Banks > 1 then
        Write(Ram_Sel1) <= '1';
      else
        Write(0) <= '1';
      end if;
    end if;
  end process Write_Select;

  Read1_Select : process(Ram_Sel1)
  begin
    Read1 <= (others => '0');
    if Ram_Banks > 1 then
      Read1(Ram_Sel1) <= '1';
    else
      Read1(0) <= '1';
    end if;
  end process Read1_Select;

  Read2_Select : process(Ram_Sel2)
  begin
    Read2 <= (others => '0');
    if Ram_Banks > 1 then
      Read2(Ram_Sel2) <= '1';
    else
      Read2(0) <= '1';
    end if;
  end process Read2_Select;

  Fixed_Addr_Bits : if Mem_Size >= 8 generate
    Ram_Addr1(3 downto 0) <= Addr1(3 downto 0);
    Ram_Addr2(3 downto 0) <= Addr2(3 downto 0);
  end generate Fixed_Addr_Bits;

  Align_to_4_Addr_Bits : if Mem_Size < 8 generate
    Ram_Addr1(3 downto Addr1'Left+1) <= (others => '0');
    Ram_Addr1(Addr1'Range) <= Addr1;
    Ram_Addr2(3 downto Addr2'Left+1) <= (others => '0');
    Ram_Addr2(Addr2'Range) <= Addr2;
  end generate Align_to_4_Addr_Bits;

  FIFO_RAM : for I in 0 to RAM_Banks-1 generate  RAMBANKx : for J in 0 to
Data_Size-1 generate  RAMx : RAM16x1D port map	( A3 => Ram_Addr1(3),  A2 =>
Ram_Addr1(2),  A1 => Ram_Addr1(1),  A0 => Ram_Addr1(0),  DpRA3 =>
Ram_Addr2(3),  DpRA2 => Ram_Addr2(2),  DpRA1 => Ram_Addr2(1),  DpRA0 =>
Ram_Addr2(0),  WE  => Write(I),  WClk => WrClk,  D  => DataIn(J),  SpO	=>
RAM_Bank_Out1(I)(J),  DpO  => RAM_Bank_Out2(I)(J)  );  TBuffs : if not
Use_Muxes generate --  TBuf1x : TBuf port map ( RAM_Bank_Out1(I)(J),
Read1(I), DataOut1(J)); --  TBuf2x : TBuf port map ( RAM_Bank_Out2(I)(J),
Read2(I), DataOut2(J));  DataOut1(J) <= RAM_Bank_Out1(I)(J) when Read1(I) =
'1' else 'Z';  DataOut2(J) <= RAM_Bank_Out2(I)(J) when Read2(I) = '1' else
'Z';  end generate;  end generate;  end generate;

  Muxes : if Use_Muxes generate  DataOut1 <= RAM_Bank_Out1(0) when
(Addr1'Left < 4)  else Mux_Tree(RAM_Bank_Out1,Addr1(Addr1'Left downto 4));

  DataOut2 <= RAM_Bank_Out2(0) when (Addr2'Left < 4)  else
Mux_Tree(RAM_Bank_Out2,Addr2(Addr2'Left downto 4));  end generate;

end XILINX_RTL;


Here is the actual FIFO <Gen_FIFO_e.vhd>
--===========================================================================
== -- Project  : -- Filename  : $RCSfile: Gen_FIFO_e.vhd,v $ -- Designer  :
Goran Bilski RDOE-GB(K)  <gorbi@kairo.rld.smab> -- Version  : $Revision: 1.2
$ -- Version Date  : $Date: 1998/11/19 08:48:15 $ -- -- Description -- 
Implements a synchronously FIFO with independent read and write ports. -- -- 
The Full flag will go true synchronously with the write clock and will go -- 
inactive asynchronously with the read clock. -- --  The Empty flag will go
true synchronously with the read clock and will go --  inactive
asynchronously with the write clock. -- --  The DataOut contains the present
data which means that when RD goes true the --	dataout contains the data and
will change at the next clock to the data to --  be read when RD goes active
next time.

-- Signal Description --  Reset  => Sets the read and write pointer to zero
(Empties the FIFO) --  WrClk  => The write data clock --  WE  => True for
writing new data --  DataIn  => New data to write to the FIFO --  Full	=>
The FIFO is full anymore writing will result in undefined state --  RdClk  =>
The read data clock --	RD  => True for reading out new data from the FIFO --
 DataOut => Data which HAS been read --  Empty	=> The FIFO is empty anymore
reading will result in undefined state -- -- -- Change Log -- -- $Log:
Gen_FIFO_e.vhd,v $ -- Revision 1.2  1998/11/19 08:48:15  qmwgobi -- Header
modification -- -- Revision 1.1.1.1  1998/10/20 12:39:51  qmwgobi -- -- --
Revision 1.2  1998/08/05 09:23:17  gorbi -- Added a Protect generic which
when true inhibits read when empty and -- write when full -- -- Revision 1.1 
1998/02/25 13:34:42  gorbi -- Initial revision -- -- -- Copyright ******
Enator Elektroniksystem AB ******
--===========================================================================
== library IEEE; use IEEE.Std_Logic_1164.all;

entity Gen_FIFO is
  generic (
    WordSize     : Integer := 16;
    MemSize      : Integer := 8;
    Protect      : Boolean := False
    );
  port (
    Reset       : in  Boolean;
    -- Clock region WrClk
    WrClk       : in  Std_Logic;
    WE          : in  Boolean;
    DataIn      : in  Std_Logic_Vector(WordSize-1 downto 0);
    Full        : out Boolean;
    -- Clock region RdClk
    RdClk        : in  Std_Logic;
    RD           : in  Boolean;
    DataOut      : out Std_Logic_Vector(WordSize-1 downto 0);
    Empty        : out Boolean
    );
end Gen_FIFO;

<Gen_FIFO_a.vhd>
--===========================================================================
== -- Project  : -- Filename  : $RCSfile: Gen_FIFO_a.vhd,v $ -- Designer  :
Goran Bilski RDOE-GB(K)  <gorbi@kairo.rld.smab> -- Version  : $Revision: 1.3
$ -- Version Date  : $Date: 1998/11/19 08:48:14 $ -- -- Description -- 
Implements a FIFO using dual-port RAMS -- -- Signal Description -- -- -- --
Change Log -- -- $Log: Gen_FIFO_a.vhd,v $ -- Revision 1.3  1998/11/19
08:48:14  qmwgobi -- Header modification -- -- Revision 1.2  1998/10/26
10:56:53  qmwgobi -- Added MemSize of 256. -- Ignoring reads when empty and
writes when full -- -- Revision 1.1.1.1  1998/10/20 12:39:51  qmwgobi -- --
-- Revision 1.3  1998/08/05 09:27:37  gorbi -- Added a Protect generic which
when true inhibits read when empty and -- write when full -- Done some
cosmetics changes with the code -- -- Revision 1.2  1998/06/25 06:45:49 
gorbi -- Updated from Peter Alfke app.note -- Added my updown counter -- --
Revision 1.1  1998/02/25 13:35:25  gorbi -- Initial revision -- -- --
Copyright ****** Enator Elektroniksystem AB ******
--===========================================================================
== library IEEE; use IEEE.Std_Logic_1164.all; use IEEE.Std_Logic_Arith.all;
library Syntes_Lib; use Syntes_Lib.all;

architecture VHDL_RTL of Gen_FIFO is

 
-----------------------------------------------------------------------------
 -- A function which tries to calculate the best Mem_Size and by that the
best  -- counting scheme 
-----------------------------------------------------------------------------
 function Calculate_Right_Mem_Size (Mem_Size : in Natural) return Integer is 
begin  -- Calculate_Right_Mem_Size  case Mem_Size is  when 0 to 3 =>  assert
false report "To small FIFO" severity failure;	return 0;  when 4 to 16 =>
return 16;  when 17 to 32 => return 32;  when 33 to 48 =>  -- Check if to use
up/down counter instead of a true 6-bit grey counter  -- It seems that the
up/down counter takes 9 more CLBs than a ordinary  -- grey counter so if the
width is greater than 9 the up/down counter  -- will save area	if WordSize >
8 then	return 48;  else  return 64;  end if;  when 49 to 64 => return 64; 
when 65 to 256 =>  -- Do not yet need to check if to use the up/down counting
scheme since  -- there is not true 7-bit counter implemented yet  return
((MemSize+15)/16)*16;  when others =>  assert false  report "Unsupported FIFO
Depth (Not yet implemented)"  severity failure;  return 0;  end case;  end
Calculate_Right_Mem_Size;

  -- Convert the FIFO memsize to memsizes in steps of 16
  constant True_Mem_Size : Integer := Calculate_Right_Mem_Size(MemSize);

  component Gen_DpRAM
    generic (
      Use_Muxes : Boolean := False;
      Mem_Size  : Integer := 36;
      Addr_Size : Integer := 6;
      Data_Size : Integer := 16
      );
    port (
      Reset    : in  Boolean;
      -- Read/Write port 1
      Addr1    : in  Std_Logic_Vector(Addr_Size-1 downto 0);
      WrClk    : in  Std_Logic;
      WE       : in  Boolean;
      DataIn   : in  Std_Logic_Vector(Data_Size-1 downto 0);
      DataOut1 : out Std_Logic_Vector(Data_Size-1 downto 0);
      -- Read port 2
      Addr2    : in  Std_Logic_Vector(Addr_Size-1 downto 0);
      DataOut2 : out Std_Logic_Vector(Data_Size-1 downto 0)
      );
  end component;

  ----------------------------------------------------------------------
  -- Returns the vector size needed to represent the X
  -- The result is > 0
  ----------------------------------------------------------------------
  function Vec_Size( X : in Natural) return Natural is
    variable I : Natural := 1;
  begin
    while (2**I) < X loop
      I := I + 1;
    end loop;
    return I;
  end function Vec_Size;

  -- Declare the types and constant counting schemes
  subtype Count_Word is Std_Logic_Vector(3 downto 0);
  type Count_Array_Type is array (integer range <>) of Count_Word;

  -- Even if there is four bits for the Cnt8, the fourth bit will never be
used  constant Cnt8  : Count_Array_Type(0 to  7) := (
"0000","0001","0011","0010",  "0110","0111","0101","0100");  constant Cnt10 :
Count_Array_Type(0 to  9) := ( "0000","1000","1001","0001", 
"0011","0010","0110","0111",  "0101","0100" );	constant Cnt12 :
Count_Array_Type(0 to 11) := ( "0000","1000","1001","1011", 
"1010","0010","0011","0001",  "0101","0111","0110","0100" );  constant Cnt14
: Count_Array_Type(0 to 13) := ( "0000","1000","1100","1101", 
"1001","1011","1010","0010",  "0011","0001","0101","0111",  "0110","0100"); 
constant Cnt16 : Count_Array_Type(0 to 15) := ( "0000","0001","0011","0010", 
"0110","0100","0101","0111",  "1111","1110","1100","1101", 
"1001","1011","1010","1000");

 
-----------------------------------------------------------------------------
 -- A function that do all the boolean equations for a counting scheme	--
given as a parameter  -- The synthesis tool will unroll the loops and then do
the boolean equation  -- minimization (hopefully the optimimal).  -- At
present it only handles counting scheme with 4 bits due to the	--
Count_Array_Type definition 
-----------------------------------------------------------------------------
 function Gen_Counter(Count_Scheme : in Count_Array_Type;  Up  : in Boolean; 
Count  : in Std_Logic_Vector)  return Std_Logic_Vector is  variable Temp  :
Std_Logic;  variable L	: Integer range Count_Scheme'Range;  variable Q  :
Std_Logic_Vector(Count'Length-1 downto 0);  variable Q_Temp :
Std_Logic_Vector(Count'Length-1 downto 0);  begin  -- Gen_Counter  Q :=
Count;	for G in Q'Range loop  Q_Temp(G) := '0';  for I in Count_Scheme'range
loop  if Count_Scheme(I)(G) = '1' then	if Up then  L := I - 1;  else  if I
/= Count_Scheme'High then  L := I + 1;	else  L := Count_Scheme'Low;  end if;
 end if;  Temp := '1';	for J in Q'Range loop  if Count_Scheme(L)(J) = '1'
then  Temp := Temp and Q(J);  else  Temp := Temp and  not Q(J);  end if;  end
loop;  Q_Temp(G) := Q_Temp(G) or Temp;	end if;  end loop;  -- I  end loop; 
-- G  return Q_Temp;  end Gen_Counter;

 
-----------------------------------------------------------------------------
 -- Implements the improved 32-depth FIFO counting scheme from the XAPP051 
-----------------------------------------------------------------------------
 function XAPP_Count_32 (Q : in Std_Logic_Vector(4 downto 0))  return
Std_Logic_Vector is  variable Res : Std_Logic_Vector(4 downto 0);  variable A
 : Std_Logic;  begin  -- XAPP_Count_32	-- Do Peter Alfke improvement on XAPP
051  A := (Q(1) xnor Q(2)) and (Q(0) xor (Q(3) xor Q(4)));  Res(0) := (Q(1)
and not A) or (Q(0) and A);  Res(1) := (not(Q(0)) and not A) or (Q(1) and A);
 Res(2) := ( (Q(3) xnor Q(4)) and A) or (Q(2) and not A);  Res(3) := ( (
(Q(2) and Q(3)) or (not(Q(2)) and Q(4))) and A) or  (Q(3) and not A);  Res(4)
:= ( ( (Q(2) and not Q(3)) or (not(Q(2) and Q(4)))) and A) or  (Q(4) and not
A);  return Res;  end XAPP_Count_32;

 
-----------------------------------------------------------------------------
 -- Implements the improved 64-depth FIFO counting scheme from the XAPP051 
-----------------------------------------------------------------------------
 function XAPP_Count_64 (Q : in Std_Logic_Vector(5 downto 0))  return
Std_Logic_Vector is  variable Res : Std_Logic_Vector(5 downto 0);  variable A
 : Std_Logic;  begin  -- XAPP_Count_64	-- Do Peter Alfke improvement on XAPP
051  A := (Q(1) xor Q(4)) and (Q(0) xnor Q(3)) and (Q(2) xnor Q(5));  Res(0)
:= ( (Q(1) xnor Q(2)) and not A) or (Q(0) and A);  Res(1) := ( ( (not(Q(0))
and Q(2)) or (Q(0) and Q(1))) and not A) or  (Q(1) and A);  Res(2) := ( (
(Q(0) and not Q(1)) or (not(Q(0) and Q(2)))) and not A) or  (Q(2) and A); 
Res(3) := ( (Q(4) xnor Q(5)) and A) or (Q(3) and not A);  Res(4) := ( (
(not(Q(3) and Q(5))) or (Q(3) and Q(4))) and A ) or  (Q(4) and not A); 
Res(5) := ( ( (Q(3) and not Q(4)) or (not(Q(3)) and Q(5))) and A ) or  (Q(5)
and not A);  return Res;  end XAPP_Count_64;

  ----------------------------------------------------------------------
  -- Generate the Address counter for FIFO handling
  -- generates different counters depending of the counter size
  ----------------------------------------------------------------------
  Procedure FIFO_Count( Count : inout Std_Logic_Vector;
                        Incr  : in    Boolean;
                        Up    : inout Boolean;
                        Change : inout Boolean) is
    variable Cnt : Std_Logic_Vector(Count'Left-Count'Right downto 0) := Count;
    variable Res : Std_Logic_Vector(Count'Left-Count'Right downto 0) := Count;
  begin
    if True_Mem_Size = 16 then
      if Incr then
        Res := Gen_Counter(Cnt16,True,Cnt);
      end if;
    elsif True_Mem_Size = 32 then
      if Incr then
        Res := XAPP_Count_32(Cnt);
      end if;
    elsif True_Mem_Size = 48 then
      -- Do a 2-bit grey counter + a grey counter which counts between 0 to 11
      if Incr then
        if not Change and
          (( (Cnt(3 downto 0) = Cnt12(Cnt12'High)) and Up) or
           ( (Cnt(3 downto 0) = Cnt12(Cnt12'Low)) and not Up)) then
          Res(5)          := Cnt(4);
          Res(4)          := not Cnt(5);
          Res(3 downto 0) := Cnt(3 downto 0);
          Up              := not Up;
          Change          := True;
        else
          Change          := False;
          Res(5 downto 4) := Cnt(5 downto 4);
          Res(3 downto 0) := Gen_Counter(Cnt12,Up,Cnt(3 downto 0));
        end if;
      end if;
    elsif True_Mem_Size = 64 then
      if Incr then
        Res := XAPP_Count_64(Cnt);
      end if;
    elsif True_Mem_Size = 80 then
      -- Do a 3-bit grey counter + a grey counter which counts between 0 to 9
      if Incr then
        if not Change and
          (( (Cnt(3 downto 0) = Cnt10(Cnt10'High)) and Up) or
           ( (Cnt(3 downto 0) = Cnt10(Cnt10'Low)) and not Up)) then
          Res(6 downto 4) := Gen_Counter(Cnt8,True,Cnt(6 downto 4));
          Res(3 downto 0) := Cnt(3 downto 0);
          Up              := not Up;
          Change          := True;
        else
          Change          := False;
          Res(6 downto 4) := Cnt(6 downto 4);
          Res(3 downto 0) := Gen_Counter(Cnt10,Up,Cnt(3 downto 0));
        end if;
      end if;
    elsif True_Mem_Size = 96 then
      -- Do a 3-bit grey counter + a grey counter which counts between 0 to 11
      if Incr then
        if not Change and
          (( (Cnt(3 downto 0) = Cnt12(Cnt12'High)) and Up) or
           ( (Cnt(3 downto 0) = Cnt12(Cnt12'Low)) and not Up)) then
          Res(6 downto 4) := Gen_Counter(Cnt8,True,Cnt(6 downto 4));
          Res(3 downto 0) := Cnt(3 downto 0);
          Up              := not Up;
          Change          := True;
        else
          Change          := False;
          Res(6 downto 4) := Cnt(6 downto 4);
          Res(3 downto 0) := Gen_Counter(Cnt12,Up,Cnt(3 downto 0));
        end if;
      end if;
    elsif True_Mem_Size = 112 then
      -- Do a 3-bit grey counter + a grey counter which counts between 0 to 13
      if Incr then
        if not Change and
          (( (Cnt(3 downto 0) = Cnt14(Cnt14'High)) and Up) or
           ( (Cnt(3 downto 0) = Cnt14(Cnt14'Low)) and not Up)) then
          Res(6 downto 4) := Gen_Counter(Cnt8,True,Cnt(6 downto 4));
          Res(3 downto 0) := Cnt(3 downto 0);
          Up              := not Up;
          Change          := True;
        else
          Change          := False;
          Res(6 downto 4) := Cnt(6 downto 4);
          Res(3 downto 0) := Gen_Counter(Cnt14,Up,Cnt(3 downto 0));
        end if;
      end if;
    elsif True_Mem_Size = 128 then
      -- Do a 3-bit grey counter + a 4-bit grey counter
      if Incr then
        if not Change and
          (( (Cnt(3 downto 0) = Cnt16(Cnt16'High)) and Up) or
           ( (Cnt(3 downto 0) = Cnt16(Cnt16'Low)) and not Up)) then
          Res(6 downto 4) := Gen_Counter(Cnt8,True,Cnt(6 downto 4));
          Res(3 downto 0) := Cnt(3 downto 0);
          Up              := not Up;
          Change          := True;
        else
          Change          := False;
          Res(6 downto 4) := Cnt(6 downto 4);
          Res(3 downto 0) := Gen_Counter(Cnt16,Up,Cnt(3 downto 0));
        end if;
      end if;
    elsif True_Mem_Size = 256 then
      -- Do a 4-bit grey counter + a 4-bit grey counter
      if Incr then
        if not Change and
          (( (Cnt(3 downto 0) = Cnt16(Cnt16'High)) and Up) or
           ( (Cnt(3 downto 0) = Cnt16(Cnt16'Low)) and not Up)) then
          Res(7 downto 4) := Gen_Counter(Cnt16,True,Cnt(7 downto 4));
          Res(3 downto 0) := Cnt(3 downto 0);
          Up              := not Up;
          Change          := True;
        else
          Change          := False;
          Res(7 downto 4) := Cnt(7 downto 4);
          Res(3 downto 0) := Gen_Counter(Cnt16,Up,Cnt(3 downto 0));
        end if;
      end if;
    else
      assert false
        report "To BIG FIFO (not yet supported)"
        severity failure;
    end if;
    Count := Res;
  end FIFO_Count;

  Procedure FIFO_Counter( signal Count : inout Std_Logic_Vector;  Incr	: in 
Boolean;  Up  : inout Boolean;	Change : inout Boolean) is  variable Res :
Std_Logic_Vector(Count'Left-Count'Right downto 0) := Count;  begin 
FIFO_Count(Res,Incr,Up,Change);  Count <= Res;	end FIFO_Counter; 
----------------------------------------------------------------------	--
Generate the Address counter for FIFO handling	-- generates different
counters depending of the counter size 
---------------------------------------------------------------------- -- 
function FIFO_Cnt_Reset_Value(Count : in Std_Logic_Vector; --  Diff : in
Integer) return Std_Logic_Vector is --	variable Cnt  :
Std_Logic_Vector(Count'Left-Count'Right downto 0) := "0000"; --  variable
Write  : Boolean := True; --  variable Up  : Boolean := True; --  variable
Change : Boolean := False; --  begin --  for I in 1 to Diff loop -- 
FIFO_Count(Cnt,Write,Up,Change); --  end loop; --  return Cnt; --  end
FIFO_Cnt_Reset_Value;

  constant Log2_Mem_Size : Integer := Vec_Size(True_Mem_Size);

  -- The read and write pointers
  subtype Pointer_Type is Std_Logic_Vector(Log2_Mem_Size-1 downto 0);
  signal Write_Ptr       : Pointer_Type;
  signal Read_Ptr        : Pointer_Type;
  signal Write_Addr      : Pointer_Type;
  signal Read_Addr       : Pointer_Type;

  signal DataOut1 : Std_Logic_Vector(WordSize-1 downto 0); -- NOT USED

  signal Dir_Latched : Boolean;
  signal Direction   : Boolean;
  signal Equal       : Boolean;
  signal Full_I      : Boolean;
  signal Empty_I     : Boolean;
  signal Full_Out    : Boolean;
  signal Empty_Out   : Boolean;

  signal Read  : Boolean;
  signal Write : Boolean;

--  constant Almost_Reset_Value : Pointer_Type :=
FIFO_Cnt_Reset_Value(Read_Ptr,P);

begin

 
-----------------------------------------------------------------------------
 -- Change the Read and Write pointer to get the FIFO addresses  -- This will
get the four lowest bits from the Read/Write pointers to be the  -- higest
bits in FIFO addresses. This assures that when the FIFO depth is  -- not a
power of 2, that the FIFO addresses is within the FIFO depth range 
-----------------------------------------------------------------------------
 Do_FIFO_Addr : process (Write_Ptr, Read_Ptr)  begin  -- process Do_FIFO_Addr
 Write_Addr(Write_Addr'High downto Write_Addr'High-3) <=  Write_Ptr(3 downto
0);  if Write_Ptr'Length > 4 then  Write_Addr(Write_Addr'High-4 downto
Write_Addr'Low) <=  Write_Ptr(Write_Ptr'High downto 4);  end if; 
Read_Addr(Read_Addr'High downto Read_Addr'High-3) <=  Read_Ptr(3 downto 0); 
if Read_Ptr'Length > 4 then  Read_Addr(Read_Addr'High-4 downto Read_Addr'Low)
<=  Read_Ptr(Read_Ptr'High downto 4);  end if;	end process Do_FIFO_Addr;

  ----------------------------------------------------------------------
  -- Instansiate the Dual Port memory
  ----------------------------------------------------------------------
  FIFO_MEM :  Gen_DpRAM
    generic map(
      Use_Muxes => false,
      Mem_Size  => MemSize,
      Addr_Size => Log2_Mem_Size,
      Data_Size => WordSize
      )
    port map (
      Reset    => Reset,
      Addr1    => Write_Addr,
      WrClk    => WrClk,
      WE       => WE,
      DataIn   => DataIn,
      DataOut1 => DataOut1,
      Addr2    => Read_Addr,
      DataOut2 => DataOut
      );

  Protect_FIFO : if Protect generate
    Read  <= Rd and not Empty_Out;
    Write <= We and not Full_Out;
  end generate Protect_FIFO;

  Non_Protect_FIFO : if not Protect generate
    Read  <= Rd;
    Write <= We;
  end generate Non_Protect_FIFO;
  ----------------------------------------------------------------------
  -- Read Pointer
  ----------------------------------------------------------------------
  Read_Ptr_Counter : process(Reset,RdClk)
    variable Up     : Boolean;
    variable Change : Boolean;
  begin
    if Reset then
      Read_Ptr <= (others => '0');
      Up       := True;
      Change   := False;
    elsif RdClk'Event and RdClk = '1' then
      if not Empty_Out then
        FIFO_Counter(Read_Ptr,Read,Up,Change);
      end if;
    end if;
  end process Read_Ptr_Counter;

  ----------------------------------------------------------------------
  -- Write Pointer
  ----------------------------------------------------------------------
  Write_Ptr_Counter : process(Reset,WrClk)
    variable Up     : Boolean;
    variable Change : Boolean;
  begin
    if Reset then
      Write_Ptr <= (others => '0');
      Up        := True;
      Change   := False;
    elsif WrClk'Event and WrClk = '1' then
      if not Full_Out then
        FIFO_Counter(Write_Ptr,Write,Up,Change);
      end if;
    end if;
  end process Write_Ptr_Counter;

  ----------------------------------------------------------------------
  -- Flag handling
  ----------------------------------------------------------------------

  -------------------------------------------------------------------------
  -- Dir_Latched is false after reset and then true after the first write
  ---------------------------------------------------------------------------
  Direction_Latch : process(Reset,WE,WrClk)
  begin
    if Reset then
      Dir_Latched <= False;
    elsif WrClk'Event and WrClk = '1' then
      Dir_Latched <= Dir_Latched or WE;
    end if;
  end process Direction_Latch;

 
-----------------------------------------------------------------------------
 -- Trying to see if the read pointer is catching up the write pointer or  --
vice verse  -- The top two bits of the pointers always counts as follows  --
00  -- 01  -- 11  -- 10  -- 00	-- ..  -- So if read pointer is one step
behind the write pointer => Reset = True  -- And if write pointer is one step
behind the read pointer => Set = True 
-----------------------------------------------------------------------------
 Direction_Proc : process(Read_Ptr,Write_Ptr,Dir_Latched,Direction)  variable
Set  : Boolean;  variable Reset : Boolean;  variable Read  :
Std_Logic_Vector(1 downto 0);  variable Write : Std_Logic_Vector(1 downto 0);
 begin	Read  := Read_Ptr(Read_Ptr'Left) & Read_Ptr(Read_Ptr'Left-1);  Write
:= Write_Ptr(Write_Ptr'Left) & Write_Ptr(Write_Ptr'Left-1);  if (Read = "00"
and Write = "01") or  (Read = "01" and Write = "11") or  (Read = "11" and
Write = "10") or  (Read = "10" and Write = "00") then  Reset := True;  else 
Reset := False;  end if;  if (Write = "00" and Read = "01") or	(Write = "01"
and Read = "11") or  (Write = "11" and Read = "10") or	(Write = "10" and
Read = "00") then  Set := True;  else  Set := False;  end if;  Direction <=
not ((not Dir_Latched) or Reset or not(Set or Direction));  end process
Direction_Proc;

  Equal   <= (Read_Ptr = Write_Ptr);
  Full_I  <= Equal and Direction;
  Empty_I <= Equal and not Direction;

  -- Allow Empty to go active directly since the change is due to a read  --
which means that the Empty_I is synchronized with RdClk.  -- But is only
allow to go inactive when RdClk is High since the transaction  -- is due to a
Write and Empty_I is NOT synchronized with RdClk.  -- By this way the Empty
is not changed state just before rising edge of RdClk  Empty_DFF :
process(Empty_I,RdClk)	begin  if Empty_I then	Empty_Out <= True;  elsif
RdClk'Event and RdClk = '1' then  Empty_Out <= Empty_I;  end if;  end process
Empty_DFF;

  Empty <= Empty_Out;

  -- See above but for Full and WrClk
  Full_DFF : process(Full_I,WrClk)
  begin
    if Full_I then
      Full_Out <= True;
    elsif WrClk'Event and WrClk = '1' then
      Full_Out <= Full_I;
    end if;
  end process Full_DFF;

  Full <= Full_Out;

end VHDL_RTL;



-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/       Search, Read, Discuss, or Start Your Own    
Article: 13218
Subject: Re: FPGA on ASIC (Was: Re: New free FPGA CPU)
From: Henrik.Johnsson@emw.ericsson.se (Henrik Johnsson)
Date: 20 Nov 1998 07:42:36 GMT
Links: << >>  << T >>  << A >>
wluka@hotmail.com wrote:
> Gentlemen,

> It seems you have a good dialog going on here: I have one question which I am
> still searching for an answer to: For what application would you like to
> integrate an FPGA type architecture into an ASIC?

> Assume that the tools (whether Xilinx, Altera, or another) to support the
> configuration of the FPGA architecture were available.

> I know that Lucent offer a hybrid FPGA/Gate Array device, but I am struggling
> to conceive of an application where it would make sense.

This would make perfect sense for me, even without breaking sweat :-)
I've worked on applications where we used both ASICs and FPGAs (Xilinx)
side by side. The ASIC was used for stuff that was common to several
cards in the system and that was essential for getting the card up
and running and the Xilinx for stuff where reconfigurations due to
new specifications was expected. Some of those cards have been sold
in large amounts, over 100k today. A single chip that would have
taken care of both could probably have saved money, power and board
space.

/Henrik
Article: 13219
Subject: Re: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: "gs" <guys@mediaone.net>
Date: Fri, 20 Nov 1998 01:54:58 -0600
Links: << >>  << T >>  << A >>
John,

Suggestions:
Thoroughly check static timing once again for sanity of worse case timing.
XLNX has been known to issue device timing files that were overly aggressive
relative to Silicon.  When Silicon at customers or samples fail, they 'slow'
down the device timing an re-release new timing files.  You may want to ask
them if this is the case.

Others ideas would be to check with your synthesizer company regarding the
SM synthesis for how it handles the CASE statement (if used) and OTHERS
clauses.  Your SM may be entering into an unrecoverable state due to timing
problems of the device.

Switch to Altera - Maxplus2 supposedly does min time analysis for hold
violations using the Timing Analyzer in Fmax mode as well as worse case
timing.

Cheers.

John J. Hovey wrote in message <3654A445.68D25580@arlut.utexas.edu>...
>Hello anybody and everybody!
>
> I have been working on a complex host/daughter card system for the PCI
>bus which is using a total of 5 Xilinx FPGA's along with a host of other
>components.  We chose the XL series of the 4000 architecture for the
>extended RAM features and Versa-ring routing.  As it happened the
>smaller devices of the family are only available in the low voltage XL
>versions.
> Now that I have been attempting to implement the designs I am finding
>major problems with designs that are logically correct but do not
>function as expected in the real world.  These designs pass the timing
>constraints I'm using but do not function at all or stop in the middle
>of processing loops.  At times the state machines hold in an apparent
>meta-stable state.
> I have found conditions where active signals associated with completely
>separate logic functions effect the operation of state machines in the
>same device.
> I have also found a condition where the logic will function only if the
>3.3 VDC supply to the Xilinx devices is raised to 3.52 VDC, and not
>below.
> Is anyone experiencing the same type of problems with this or any other
>device family from Xilinx.
>
>P.S.
>
>Long live Altera!!
>
>John J. Hovey
>ARL: University of Texas


Article: 13220
Subject: Re: Big-Endian vs Little-Endian
From: d.cary@ieee.org
Date: Fri, 20 Nov 1998 08:23:28 GMT
Links: << >>  << T >>  << A >>
I collect Big endian vs. little endian information at
  http://www.rdrop.com/~cary/html/endian_faq.html
.

I have the classic article
  ON HOLY WARS AND A PLEA FOR PEACE
  by Danny Cohen (1980)
there. Highly recommended.

I'm always astonished how many unexpected problems come from endian
misunderstandings. I'm also kind of surprised at how many people say "Use
little-endian" (or "Use Big-endian"), then try to justify it with some
"reason" that applies equally well to the other format.

Are there any *real* reasons to favor one over the other that I haven't
already listed ?

-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/       Search, Read, Discuss, or Start Your Own    
Article: 13221
Subject: Re: Xilinx 5.2/6 tools v M1.5 tools for an XC4013E part.....
From: peterc <peterc@hmgcc.gov.uk>
Date: Fri, 20 Nov 1998 10:43:36 +0000
Links: << >>  << T >>  << A >>
Austin Franklin wrote:
> 

> 
> Also, EPIC is very awkward to use, and is missing some very very usefull
> features the old XACT/XDE tool has, like probes....

The easiest way to add probes is to use a PERL script. I beleive I
obtained it for M1.4 from the Xilinx web site. It's certainly not as
good as having an integrated add probe command but it's better than
having to configure all the bits of an IOB. (It basically generates a
script file to do several things to an IOB from configuring it to adding
a selected net).

> 
> Is there a DOS based download program with the new tools (I guess I could
> use the old XCHECKER???), or do I have to convert all the 486/16M/120M DOS
> notebooks we use in the lab for downloading over to CD based (NT only comes
> on CD) NT machines???

It can be run under 95 according to Xilinx (but I've not tried).

> 
> Does anyone else feel these new tools are a giant step backwards in
> functionality and usability?
> 

In many ways I think that they're better, but there's room for
improvement.
-- 
Peter Crighton
Article: 13222
Subject: Re: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: peterc <peterc@hmgcc.gov.uk>
Date: Fri, 20 Nov 1998 10:48:17 +0000
Links: << >>  << T >>  << A >>
John J. Hovey wrote:
> 
> Hello anybody and everybody!
> 
>         I have been working on a complex host/daughter card system for the PCI
> bus which is using a total of 5 Xilinx FPGA's along with a host of other
> components.  We chose the XL series of the 4000 architecture for the
> extended RAM features and Versa-ring routing.  As it happened the
> smaller devices of the family are only available in the low voltage XL
> versions.
>         Now that I have been attempting to implement the designs I am finding
> major problems with designs that are logically correct but do not
> function as expected in the real world.  These designs pass the timing
> constraints I'm using but do not function at all or stop in the middle
> of processing loops.  At times the state machines hold in an apparent
> meta-stable state.
>         I have found conditions where active signals associated with completely
> separate logic functions effect the operation of state machines in the
> same device.

How are you designing your state machines? It may be that you have got
to a state where more than one path out of that state is active, or
alternatively no path is active. This is possible with the state editor
program but requires the designer to define what exactly is required
(after all the software will usually only do what you tell it, bugs
excepted).

>         I have also found a condition where the logic will function only if the
> 3.3 VDC supply to the Xilinx devices is raised to 3.52 VDC, and not
> below.
>         Is anyone experiencing the same type of problems with this or any other
> device family from Xilinx.

Are you sure that you have a low voltage part? That sounds like the
voltage at which 5V parts start to work.
-- 
Peter Crighton
Article: 13223
Subject: Re: Synthesizeablel fifo
From: Jamie Lokier <spamfilter.nov1998@tantalophile.demon.co.uk>
Date: 20 Nov 1998 12:30:41 +0000
Links: << >>  << T >>  << A >>
Rickman <spamgoeshere4@yahoo.com> writes:
> I believe Johnny needed a compare of A+1 = B. This can be done by using
> the D inputs to the A counter FFs since the D inputs will always have
> the next value on them (A+1). So this also becomes an equality
> compare. 

Is this in A's clock domain or B's clock domain?  If B's, the D inputs
to A's FFs won't satisfy the "off by one at most" property because
they're stabilising between clocks.

-- Jamie
Article: 13224
Subject: Re: Major Xilinx design problems using XC4013XL or XC4020XL, M1.3-M1.5
From: "Steve" <reply.through.newsgroup@paranoid.com>
Date: Fri, 20 Nov 1998 14:24:31 GMT
Links: << >>  << T >>  << A >>
I assume the the PCI pins are in fast slew rate mode.  Which package are you
using, is it 32 or 64 bit PCI, and have you spaced out the PCI pins to limit
ground bounce?  I believe the standard Xilinx designs all do this.

For testing purposes you might consider putting the PCI bus in slow slew
rate
mode.  You don't have much chance of meeting timing, but if you are having
ground bounce problems they should disappear.

Are you running 3.3 or 5V PCI?  If 3.3V you need to supply clamping diodes,
and if you turn on the internal ones you lose your 5V tolerance.



Steve





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