Sipeed Tang Nano 20K

Sipeed Tang Nano 20K

  • FPGA: Gowin GW2AR-18
  • LUT4: 20736
  • flip-flops: 15552
  • Shadow SRAM: 40 k bits
  • Block SRAM: 828 k bits
  • Number of BSRAM: 46
  • 32bits SDR SDRAM: 64 M bits
  • multiplier 18 x 18: 48
  • number of PLLs: 2
  • I/O banks: 8

Back to FPGAs page

Links

Sipeed wiki: Tang Nano 20K, Gowin Arora FPGAs,

Tools YosysHQ Project Apicula,

local links

sb,

History

2026-01-19: when I connect the Tang Nano 20K to my machine via a usb cable (USB-C) the LEDs run a Larson scanner. usbconfig reports

root@kg-starone:~ # usbconfig -d ugen1.4
ugen1.4: <FT2232C/D/H Dual UART/FIFO IC Future Technology Devices International, Ltd> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (100mA)

from /var/log/messages

Jan 19 21:01:25 kg-starone kernel: ugen1.4: <SIPEED 20Ks FRIEND> at usbus1
Jan 19 21:01:25 kg-starone kernel: uftdi0 on uhub0
Jan 19 21:01:25 kg-starone kernel: uftdi0: <SIPEED 20Ks FRIEND, class 0/0, rev 2.00/5.00, addr 3> on usbus1
Jan 19 21:01:25 kg-starone kernel: uftdi1 on uhub0
Jan 19 21:01:25 kg-starone kernel: uftdi1: <SIPEED 20Ks FRIEND, class 0/0, rev 2.00/5.00, addr 3> on usbus1

usbconfig device descriptor

root@kg-starone:~ # usbconfig -d ugen1.4 dump_device_desc
ugen1.4: <FT2232C/D/H Dual UART/FIFO IC Future Technology Devices International, Ltd> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (100mA)

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0200 
  bDeviceClass = 0x0000  <Probed by interface class>
  bDeviceSubClass = 0x0000 
  bDeviceProtocol = 0x0000 
  bMaxPacketSize0 = 0x0040 
  idVendor = 0x0403 
  idProduct = 0x6010 
  bcdDevice = 0x0500 
  iManufacturer = 0x0001  <SIPEED>
  iProduct = 0x0002  <20K's FRIEND>
  iSerialNumber = 0x0003  <2023030621>
  bNumConfigurations = 0x0001 

usbconfig current config

root@kg-starone:~ # usbconfig -d ugen1.4 dump_curr_config_desc
ugen1.4: <FT2232C/D/H Dual UART/FIFO IC Future Technology Devices International, Ltd> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (100mA)


 Configuration index 0

    bLength = 0x0009 
    bDescriptorType = 0x0002 
    wTotalLength = 0x0037 
    bNumInterfaces = 0x0002 
    bConfigurationValue = 0x0001 
    iConfiguration = 0x0000  <no string>
    bmAttributes = 0x0080 
    bMaxPower = 0x0032 

    Interface 0
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0000 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0002 
      bInterfaceClass = 0x00ff  <Vendor specific>
      bInterfaceSubClass = 0x00ff 
      bInterfaceProtocol = 0x00ff 
      iInterface = 0x0002  <20K's FRIEND>

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0081  <IN>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0200 
        bInterval = 0x0001 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 1
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0002  <OUT>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0200 
        bInterval = 0x0001 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 


    Interface 1
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0001 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0002 
      bInterfaceClass = 0x00ff  <Vendor specific>
      bInterfaceSubClass = 0x00ff 
      bInterfaceProtocol = 0x00ff 
      iInterface = 0x0002  <20K's FRIEND>

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0083  <IN>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0200 
        bInterval = 0x0001 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 1
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0004  <OUT>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0200 
        bInterval = 0x0001 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

2026-01-19: sb - I installed the yosys / nextpnr / apicula toolchain, but it doesn't look like FreeBSD's nextpnr port have support for Gowin yet.

tingo@kg-starone:~/work/bitraf/2026/0119_fpga_aften_uke_4/apicula/examples $ gmake blinky-tangnano20k.fs
[..]
2.31. Executing CHECK pass (checking for obvious problems).
Checking module top...
Found and reported 0 problems.

2.32. Executing JSON backend.

Warnings: 1 unique messages, 1 total
End of script. Logfile hash: 05e9dca5d6, CPU: user 0.22s system 0.01s, MEM: 42.22 MB peak
Yosys 0.60 (git sha1 5bafeb77dc71e054fa331ab9efa613e6fb0a1c49, c++ 19.1.7 -O2 -fstack-protector-strong -fno-strict-aliasing -fPIC -O3)
Time spent: 35% 20x read_verilog (0 sec), 8% 1x abc9_exe (0 sec), ...
nextpnr-himbaechel --json blinky-tangnano20k-synth.json --write blinky-tangnano20k.json --device GW2AR-LV18QN88C8/I7 --vopt family=GW2A-18C --vopt cst=tangnano20k.cst
gmake: nextpnr-himbaechel: No such file or directory
gmake: *** [Makefile:241: blinky-tangnano20k.json] Error 127
rm blinky-tangnano20k-synth.json

2026-01-19: I created this page.

2024-10-28: the package was delivered straight into my mailbox.

2024-10-21: the package was shipped.

2024-10-19: I ordered 1 x Sipeed Tang Nano 20K from Aliexpress, for USD 37.66 shipping included.