From Hamsterworks Wiki!
This FPGA Project was completed Feb 2012.
Somebody on http://www.hackaday.com was saying that no modern processors would come in DIP packages because they radiate RF like crazy.
That got me thinking... can I make 'useful' RF signal from just an FPGA and some wire?
Well yes, I can. And it is pretty simple - at least to send 'SOS' in morse code.
I havn't got a HAM radio setup, just a shortwave receiver, and I know very little about RF except how amplitude modulation (AM) works that the easiest antenna is a length of wire that is half the wavelength of the transmitted signal.
To carry a useful signal modulation of the transmitted signal is required. As the FPGA is all digital the easiest way it to output on multiple wires - so if one wire is driven a signal of strength 'x' is generated, and if four wires are then driven something like four times the signal strength will be transmitted.
My Nexys2 board has a 50MHz crystal on it, and if I divide that frequency by two I get 25MHz - towards the 30MHz upper end of my shortwave's tuning. Looking at http://en.wikipedia.org/wiki/Dipole_antenna it will need a 5.72m antenna - 2.86m in either direction. Pretty easy to build.
As the I/O pins are driving at LVCMOS25 levels, and all have a 200 Ohm resistor in series for ESD protection only a few milliwatts will be available, even if the antenna was perfectly matched.
So here's the (ultra simple) build:
Four 2.86m 24SWG enameled copper wire in one direction, one for ground to run in the other direction, with the enamel scratched off and jammed into a PMOD cable. You can't get more brutal than that.
Only a couple of dozen likes of code are required to generate a test signal. Here they are:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity shortwave is port ( Clk : in std_logic; ja : out std_logic_vector(3 downto 0) ); end shortwave; architecture Behavioral of shortwave is signal counter : std_logic_vector(21 downto 0) := (others => '0'); signal message : std_logic_vector(33 downto 0) := "1010100011101110111000101010000000"; signal carrier : std_logic := '0'; signal modulation : std_logic := '0'; begin carrier <= counter(1); modulation <= counter(1) and counter(16) and message(0); -- Put the outgoing RF signals on the expansion connector (ja) ja <= modulation & modulation & modulation & carrier; process(clk) begin if rising_edge(clk) then if counter = 0 then message <= message(0) & message(33 downto 1); end if; counter <= counter + 1; end if; end process; end Behavioral;
NET "clk" LOC = "B8"; NET "JA<0>" LOC = "L15"; NET "JA<1>" LOC = "K12"; NET "JA<2>" LOC = "L17"; NET "JA<3>" LOC = "M15";
With a tiny (30cm) antenna the signal is received within the same room. With the 5.62m long antenna the signal carries for a few tens of meters.