<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- (c) Benjamin Krill <ben@codiert.org> -->
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>FPGA Filesystem</title>
<style type="text/css" media="all">@import "f.css";</style>
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
</head>

<body>

<div id="headspace">
<div id="header">
	<a href="#top" title="Top">Top</a> : 
	<a href="#concept" title="Concepts">Concept</a> : 
	<a href="#download" title="Download">Download</a> : 
	<a href="#contact" title="Contact">Contact</a>
</div>
</div>

<div id="logo">
	<img src="img/fpgafs.png" alt="FPGAFS" />
</div>

<div id="content">
	<a name="top" id="top"></a>
	<div id="conspace"> </div>
	<h1>FPGAFS</h1>
	<p>It provides a framework for a high performance reconfigurable computer
	environment for Linux. The abstraction between the reconfigurable device and the
	user application is simplified by using a virtual filesystem and a thread
	abstraction per device context.<br/>
	FPGAFS consists of two major layers of abstraction. First, the directory
	representation to the user application. This interface provides for each context
	one directory with a specified content to transfer data. The second layer
	provides an interface for low level driver. It gives the flexibility to register
	a lot of different low level drivers for different accelerators which can be
	operate at the same time in one target system.</p>

	<h2 class="title">Concept</h2><a name="concept" id="concept"></a>

	<h2 class="subtitle">Overall Design</h2>
	<p>As the name already mentioned the project provides a virtual filesystem for the
	operating system. The filesystem abstrect each each reconfigurable part inside a
       	host system or inside one chip by a directory. The permissions of the files can
	provide access control for different users. The following listing shows the directory
	entries which will be created. These entries can be seen as the assigned context to
	the FPGA interface:</p>
	<ul>
		<li>/fpgafs/example/cmd: write only file, this is the interface to send
		    defined commands to the context.</li>
		<li>/fpgafs/example/stat: read only file, from which the context's status
		    can be received.</li>
		<li>/fpgafs/example/din: write only file, sends data to the reconfigurable
		    device.</li>
		<li>/fpgafs/example/dout: read only file, receives calculated data from
		    the device.</li>
		<li>/fpgafs/example/load: write only file, writes data which should be
		    loaded onto the reconfigurable device.</li>
		<li>/fpgafs/foobar/lldrv: write only file, selects the low level driver
		    which should be used.</li>
	</ul>
	<p>
	In general, the complete framework provides a generic interface to the userspace
	and a flexible and changeable interface to the hardware. Figure 1 shows the design of
	the framework. At the bottom, there are low level drivers which must be registered on
	the main FPGAFS. On top of the low-level drivers, different contexts are shown
	which are represented by directories.</p>

	<div class="center">
		<img class="border" src="img/design_overall.png" alt="overall design" />
	</div>

	<h2 class="subtitle">Low Level Driver</h2>
	<p>All low level drivers implement an interface which will be used by more generalized
	functions from the low level management. The structure "fpgafs_lldrv" provides at least
        the defined function pointers. Each low level driver can be loaded and unloaded as a
	common Linux module. The init function of each low level driver has to call the
	registration function of the FPGAFS low level management module. At unloading the module
        the unregistration function will be called. With this concept different hardware
	accelerators can be supported and each low level driver can implement its own
	communication functions. So each low level driver brings its own programming routine
	for the accelerator. This gives the possibility to create accelerators that can handle
	more than one application at once. For example, the accelerator can reprogram parts of
	the accelerator and can be used without reconfiguring the whole accelerator. However,
	this functionality totally depends on the underlying hardware and the programming
	mechanism. But the framework will support such and other functionalities because of
	the flexible layer concept.</p><br />
	
	<p>More documentation can be found in the repository and can be enquired (see Contact).
	Also the <a class="text" href="var/th2007.pdf" alt="dissertation">dissertation</a> can be
	downloaded where the FPGAFS was developed.</p>

	<h2 class="title">Download</h2><a name="download" id="download"></a>
	FPGAFS keeps its development tree in a Subversion repository. It can be 
	downloaded with a Subversion checkout. The repository is anonymously accessible. <br /><br />
	<h2 class="consol">$ svn co https://svn.subgra.de/ben/projects/fpgafs</h2>

	<h2 class="title">Contact</h2><a name="contact" id="contact"></a>
	<p>Benjamin Krill: ben@codiert.org</p>

	<h2 class="footer">$Id$</h3>
</div>

</body>
</html>