/Xilinx-Serial-Miner

Bitcoin miner for Xilinx FPGAs

Primary LanguageVerilogGNU General Public License v3.0GPL-3.0

Xilinx Serial Miner
-------------------
by Risto A. Paju, teknohog at iki.fi

This project is no longer being updated. For newer and more capable versions
of the Bitcoin miner, proceed to

https://github.com/teknohog/Open-Source-FPGA-Bitcoin-Miner

instead. The corresponding project there is Verilog_Xilinx_Port.


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

This is a port of fpgaminer's

https://github.com/progranism/Open-Source-FPGA-Bitcoin-Miner

to Xilinx chips, using a serial port for communication with the computer.


Implementation details
----------------------

I use a Digilent Nexys2 board with a Spartan 3E 500K. This code should
probably work on most Xilinx chips. I have set the loop unrolling to
minimum (5) by default, decrease this number for bigger chips. In my
case the LUT utilization is about 60%.

The 7-segment display is used to indicate a golden nonce. (Raw bytes,
not legible numbers, but usable for a bitwise debug :)

The altpll part in the original code is replaced by the Xilinx
equivalent, DCM. It was generated in Xilinx ISE, and it may be
necessary to generate new ones for different devices. This was the
simplest DCM with only the minimum of controls and outputs.

The serial communication is a simple and direct replacement of the
original. Midstate and data2 are pushed onto the registers in a single
packet. The FPGA only sends data back when it finds a golden
nonce. The timeout for serial port reads is rather conveniently used
like 'askrate' in other miners, to signal when new work is needed.


Clock doubler
-------------

A DCM can easily multiply the clock rate for faster mining, but it may
be unstable. In my case, the base clock is 50 MHz and the synthesis
tools give a timing limit of about 70 MHz (13 ns). Nevertheless, it
seems to work fine so far. My error rate so far seems very low, so
even if the doubled clock is to blame, the net effect is positive.

Heat could be a serious issue on larger FPGAs. This Spartan 3E 500K is
slightly warm to touch with the doubled clock, compared to no
noticeable warming with the single clock.

The code to use this is already included and commented out, not
enabled by default. To enable it, you should have these lines
uncommented in fpgaminer_top.v:

`include "main_pll_2x.v"
(instead of main.pll.v)

main_pll pll_blk (.CLKIN_IN(osc_clk), .CLK2X_OUT(hash_clk));
(instead of the one with .CLK0_OUT)

Also, since hash_clk is used by everything including the serial port,
you need to change the frequency in async_*.v to the doubled value.


Usage
-----

1. Download the RS232 code from

http://www.fpga4fun.com/files/async.zip

and unzip it into sources/hdl to go with the other files. Change the
clock frequency definition in both files to suit your oscillator.

Note that this async code is not free software, and it cannot be
redistributed without a permission from fpga4fun.

(I have discussed this with the author of fpga4fun, and he has OK'd
this kind of linking. However, it might be more convenient in the
future to have our own serial code here.)


2. Build the design and program the FPGA. At the moment, the source is
treated as the single fpgaminer_top file, using includes.

Here are some ways I have used succesfully, you can of course use
Xilinx ISE or something else:

2a. boldport:

$ make -f scripts/Makefile TOP_PATH=`pwd` bit

This builds a bit file for a Spartan 3E 500K. To generate a suitable
Makefile for other FPGAs, see https://www.boldport.com/.

2b. Nexys2prog and its associated build script:

http://ixo-jtag.sourceforge.net/nexys2-linux-howto.html
 

3. Edit your details such as username and serial port in miner.py, and
start mining. It requires a few non-standard libraries, pyserial and
json-rpc.

http://pyserial.sourceforge.net/
(also generally available in Linux distributions)

http://json-rpc.org/wiki/python-json-rpc


Todo
----

* Some error checking and resetting features. For example, if we
  happen to send one extra byte into the FPGA, the registers will stay
  out of sync basically until it is reconfigured.

* Feedback on actual hashing rate. For example, a signal could be sent
  whenever the nonce hits certain milestones, and the script could
  figure out the rate.


Release notes
-------------

2011-07-14

* 7-segment display is now enabled by the nearest slide switch (SW0),
  to reduce the amount of unnecessary lighting.

2011-06-20

* Moved to Github
* Introduced boldport as an optional build system, thanks to Saar
  Drimer.

2011-06-08

* Threaded miner.py that should reduce the incidence of stale blocks,
  particularly with faster FPGAs.

2011-06-05

* Optional statistics in miner.py
* Clock doubler available but not enabled by default
* Removed LED indicators, 7-segment display remains

2011-06-04

This is the first release on 2011-06-04. I got my first FPGA board on
2011-05-13 and I have been learning these things between a day job and
other intense hobbies. So bear with my newbie bugs, and please send in
hints and corrections.