element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      • Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Autodesk EAGLE
  • Products
  • More
Autodesk EAGLE
EAGLE User Support (English) Generate schematic automatically from FPGA pi nout?
  • Blog
  • Forum
  • Documents
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Autodesk EAGLE to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • Replies 5 replies
  • Subscribers 178 subscribers
  • Views 1229 views
  • Users 0 members are here
Related

Generate schematic automatically from FPGA pi nout?

autodeskguest
autodeskguest over 11 years ago

Hi,

 

I used to create FPGA schematic manually but my last project has a 1500pins

FPGA and I would like to automate things to avoid errors and also save some

time.

I am a beginner in ULP scripts so I would appreciate some advice.

 

I didn't find any way to automate passing from FPGA pinout in (Quartus .qsf

file for example) to board schematic.

I have this procedure in mind:

- create FPGA symbol/package with "make-symbol-device-package-bsdl.ulp"

(already done)

- add a FPGA part on a schematic sheet

Then an ulp script has to:

- Parse Altera pinout file (qsf) to extract signal and pin names

- For each fpga symbol pin mentioned in the FPGA pinout file:

=> Trace and connect a wire to the fpga symbol pin

=> Label this wire with the signal name from .qsf file and display the

name

 

Example:

set_location_assignment PIN_A7 -to sensor_clk (from fpga pinout file)

This statement leads to the creation a wire named "sensor_clk" connected to

fpga pin A7.

 

Is it possible to do something like that?

I really didn't know how to start. I gave a look at "cmd-net-list2sch.ulp"

script but I can't make it work for a bga component.

 

Thanks in advance for helping.

 

--

Web access to CadSoft support forums at www.eaglecentral.ca.  Where the CadSoft EAGLE community meets.

 

  • Sign in to reply
  • Cancel
Parents
  • autodeskguest
    autodeskguest over 11 years ago

    gg <gendreau@optronis.com> wrote:

    ...

    Example:

    set_location_assignment PIN_A7 -to sensor_clk (from fpga pinout file)

    This statement leads to the creation a wire named "sensor_clk" connected to

    fpga pin A7.

     

    Is it possible to do something like that?

    I really didn't know how to start. I gave a look at "cmd-net-list2sch.ulp"

    script but I can't make it work for a bga component.

     

    So you let the FPGA tool choose the pins and you design the PCB after

    routing the FPGA?

     

    I do it the other way round. I design the board and give the choosen FPGA

    pins as constraints to the FPGA placement. The constraint list is generated

    form the eagle netlist with appended perl script. It is tested for

    xilinx. Quicklogic is probably bit-rotten with time.

     

    Bye

    --

    Uwe Bonnes                bon@elektron.ikp.physik.tu-darmstadt.de

     

    Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt

    -


    Tel. 06151 162516 -


    Fax. 06151 164321 -


    #!/usr/bin/perl

     

    1. Take a eagle board netlist and search for connections to a part. Exclude

    2. selected nets,

     

    1. Copyright Uwe Bonnes, 2002-2010 bon@elektron.ikp.physik.tu-darmstadt.de

     

    1. net2ucf -h [excludepattern[s]]

     

    1. This program is distributed in the hope that it will be useful, but

    2. WITHOUT ANY WARRANTY; without even the implied warranty of

    3. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

    4. Public License for more details.

     

    if ((!@ARGV) ||($ARGV[0] eq "-h"))

    {

        print "Usage: $0 -h ...\n";

        print "\t-h: print this help\n";

        print "\t-l: write netnames as lowercase\n";

        print "\t-v: verbose progress indication on stdout\n";

        print "\t-n: ignore stubs (Net named as pad)\n";

        print "\t[netlist]: a netlist exported from the Cadsoft Eagle Package\n";

        print "\t[format]= quicklogic|xilinx \n";

        print "\t[partdescriptor]: The name of the part to look for, e.g. \"IC1\"\n";

        print "\t[excludepattern] may be a regular expression\n";

        print "\te.g. $0 -i nets xilinx ic1 \"GND.\" \"VCC.\" \"JTAG_.*\"\n";

        print "\tOutput is written to {netlist].[pcf|ucf]\n";

        print "\tArguments are case sensitive\n";

        print "\tCheck resulting files!\n";

        exit 0;

    }

     

    @SAVEARGS= @ARGV;

     

    while ($_ = $ARGV[0], /^-/)

    {

        shift;

        last if /^--$/;

        if (/^-l(.*)/)

        {

         $lowercase = 1;

        }

        if (/^-v(.*)/)

        {

         $verbose = 1;

        }

        if (/^-n(.*)/)

        {

         $no_stubs = 1;

        }

    }

     

    if ($verbose)

    {

        if ($lowercase)

        {

         print "Lowercase set\n";

        }

        else

        {

         print "Lowercase not set\n";

        }

        print "Verboseset\n";

    }

     

    if (!open (TXT, $ARGV[0] ))

    {

        open (TXT,  $ARGV[0] . ".net") or die "Unable to open $ARGV[0] and $ARGV[0].net!\n";

    }

     

    1. treat cr/lf:

    $/ = "\r\n";  

    undef $/;

    $_ = xilinx.ucf") or die "Unable to open ucf!\n";

    }

    else

    {

        die "Unknown format ".$ARGV[0]."\n";

    }   

    shift @ARGV ;

     

    (@ARGV) or die "No Part given!\n";

     

    #split into blocks seperated with at least one empty line

    @nets = split(/\n\n+/, $_);

     

    1. Test if we got the right Thing

    (@nets[0] eq "Netlist") or die "Probably no Eagle Netlist\n";

     

    ($keyword,$dummy) = split (/\s+/, @nets[2]);

    ($keyword eq "EAGLE") or die "Probably no Eagle Netlist\n";

     

    #print comment

    printf QCF "#" . @nets[1] . "\n";

    printf QCF "#" . @nets[2] . "\n";

    printf QCF "#Command line: " . $0;

    for($argval = 0; $argval < @SAVEARGS; $argval++)

    {

        printf QCF  " \"" . $SAVEARGS[$argval] ."\"";

    }

    printf QCF  "\n";

     

     

    #print "Got ".@nets." Nets\n";

    for ($nc =4; $nc < @nets;$nc++) # Eagle Netlist headers

    {

        @connections = split(/\n/, $nets[$nc]); #dont strip newlines

        for ($cc = 0; $cc < @connections; $cc++) # scan through the line of a netlist)

        {

         ($dummy,$partname,$pad,$pin,$sheet)= split( /\s+/, $connections[$cc]);

         if (!$cc)

         {

             if ($dummy eq "Change") # a netlist generated from a schematics

             {

              $cc++;

              ($dummy,$partname,$pad,$pin,$sheet)= split( /\s+/, $connections[$cc]);

             }

             $netname = $dummy;

             if ($verbose)

             {

              print @connections . " Connections" . " for net: ". $netname . "\n";

             }

         }

    #     print $connections[cc]."\n";

    #     print "Net " . $netname . " Part " . $partname . " Pin " . $pin . " argv[0] ".$ARGV[0]."\n";

         if (($partname =~ m/\b$ARGV[0]\b/i)  && !(($netname =~ m/\b$pad\b/) && ($no_stubs)))

         {

             for ($ac = 1; $ac <@ARGV; $ac++)

             {

              if ($verbose)

              {

                  print "netname ".$netname." exclude ".$ARGV[$ac]."\n";

              }

              if ($netname =~ m/$ARGV[$ac]/i)

              {

                  $ac = @ARGV +1;

              }

              if ($verbose)

              {

                  print "netname ".$netname." ac ".$ac."\n";

              }

             }

             if ($verbose)

              {

                  print "Net " . $netname . " Part " . $partname . " Pin " . $pin . " ac ".$ac." argc".@ARGV."\n";

              }

             if ($ac == @ARGV)

             {

              $_ = $netname;

              if ($verbose)

                  {

                   printf "Net %s  Part %s Pad %s\n", $lowercase ? lc $_ : $_, $partname,$pad;

                  }

              if ($useformat eq "QL")

              {

                  s/$/sprintf("_p")/e;

                  s/\d+_p/sprintf("_p[%d]",$&)/e;

                  printf QCF "place %s IO%s\n",$lowercase ? lc $_ : $_, $pad;

              }

              elsif ($useformat eq "XIL")

              {

                  s/\d+$/sprintf("<%d>",$&)/e;

                        if ($pad =~ m/^[a-z]/i)

                        {

                            printf QCF "NET \"%s\" LOC = \"%s\";\n",$lowercase ? lc $_:$_, $pad;

                        }

                        else

                        {

                            printf QCF "NET \"%s\" LOC = \"P%s\";\n",$lowercase ? lc $_:$_, $pad;

                        }

              }

             }

         }

        }

    }

     

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • autodeskguest
    autodeskguest over 11 years ago

    gg <gendreau@optronis.com> wrote:

    ...

    Example:

    set_location_assignment PIN_A7 -to sensor_clk (from fpga pinout file)

    This statement leads to the creation a wire named "sensor_clk" connected to

    fpga pin A7.

     

    Is it possible to do something like that?

    I really didn't know how to start. I gave a look at "cmd-net-list2sch.ulp"

    script but I can't make it work for a bga component.

     

    So you let the FPGA tool choose the pins and you design the PCB after

    routing the FPGA?

     

    I do it the other way round. I design the board and give the choosen FPGA

    pins as constraints to the FPGA placement. The constraint list is generated

    form the eagle netlist with appended perl script. It is tested for

    xilinx. Quicklogic is probably bit-rotten with time.

     

    Bye

    --

    Uwe Bonnes                bon@elektron.ikp.physik.tu-darmstadt.de

     

    Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt

    -


    Tel. 06151 162516 -


    Fax. 06151 164321 -


    #!/usr/bin/perl

     

    1. Take a eagle board netlist and search for connections to a part. Exclude

    2. selected nets,

     

    1. Copyright Uwe Bonnes, 2002-2010 bon@elektron.ikp.physik.tu-darmstadt.de

     

    1. net2ucf -h [excludepattern[s]]

     

    1. This program is distributed in the hope that it will be useful, but

    2. WITHOUT ANY WARRANTY; without even the implied warranty of

    3. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

    4. Public License for more details.

     

    if ((!@ARGV) ||($ARGV[0] eq "-h"))

    {

        print "Usage: $0 -h ...\n";

        print "\t-h: print this help\n";

        print "\t-l: write netnames as lowercase\n";

        print "\t-v: verbose progress indication on stdout\n";

        print "\t-n: ignore stubs (Net named as pad)\n";

        print "\t[netlist]: a netlist exported from the Cadsoft Eagle Package\n";

        print "\t[format]= quicklogic|xilinx \n";

        print "\t[partdescriptor]: The name of the part to look for, e.g. \"IC1\"\n";

        print "\t[excludepattern] may be a regular expression\n";

        print "\te.g. $0 -i nets xilinx ic1 \"GND.\" \"VCC.\" \"JTAG_.*\"\n";

        print "\tOutput is written to {netlist].[pcf|ucf]\n";

        print "\tArguments are case sensitive\n";

        print "\tCheck resulting files!\n";

        exit 0;

    }

     

    @SAVEARGS= @ARGV;

     

    while ($_ = $ARGV[0], /^-/)

    {

        shift;

        last if /^--$/;

        if (/^-l(.*)/)

        {

         $lowercase = 1;

        }

        if (/^-v(.*)/)

        {

         $verbose = 1;

        }

        if (/^-n(.*)/)

        {

         $no_stubs = 1;

        }

    }

     

    if ($verbose)

    {

        if ($lowercase)

        {

         print "Lowercase set\n";

        }

        else

        {

         print "Lowercase not set\n";

        }

        print "Verboseset\n";

    }

     

    if (!open (TXT, $ARGV[0] ))

    {

        open (TXT,  $ARGV[0] . ".net") or die "Unable to open $ARGV[0] and $ARGV[0].net!\n";

    }

     

    1. treat cr/lf:

    $/ = "\r\n";  

    undef $/;

    $_ = xilinx.ucf") or die "Unable to open ucf!\n";

    }

    else

    {

        die "Unknown format ".$ARGV[0]."\n";

    }   

    shift @ARGV ;

     

    (@ARGV) or die "No Part given!\n";

     

    #split into blocks seperated with at least one empty line

    @nets = split(/\n\n+/, $_);

     

    1. Test if we got the right Thing

    (@nets[0] eq "Netlist") or die "Probably no Eagle Netlist\n";

     

    ($keyword,$dummy) = split (/\s+/, @nets[2]);

    ($keyword eq "EAGLE") or die "Probably no Eagle Netlist\n";

     

    #print comment

    printf QCF "#" . @nets[1] . "\n";

    printf QCF "#" . @nets[2] . "\n";

    printf QCF "#Command line: " . $0;

    for($argval = 0; $argval < @SAVEARGS; $argval++)

    {

        printf QCF  " \"" . $SAVEARGS[$argval] ."\"";

    }

    printf QCF  "\n";

     

     

    #print "Got ".@nets." Nets\n";

    for ($nc =4; $nc < @nets;$nc++) # Eagle Netlist headers

    {

        @connections = split(/\n/, $nets[$nc]); #dont strip newlines

        for ($cc = 0; $cc < @connections; $cc++) # scan through the line of a netlist)

        {

         ($dummy,$partname,$pad,$pin,$sheet)= split( /\s+/, $connections[$cc]);

         if (!$cc)

         {

             if ($dummy eq "Change") # a netlist generated from a schematics

             {

              $cc++;

              ($dummy,$partname,$pad,$pin,$sheet)= split( /\s+/, $connections[$cc]);

             }

             $netname = $dummy;

             if ($verbose)

             {

              print @connections . " Connections" . " for net: ". $netname . "\n";

             }

         }

    #     print $connections[cc]."\n";

    #     print "Net " . $netname . " Part " . $partname . " Pin " . $pin . " argv[0] ".$ARGV[0]."\n";

         if (($partname =~ m/\b$ARGV[0]\b/i)  && !(($netname =~ m/\b$pad\b/) && ($no_stubs)))

         {

             for ($ac = 1; $ac <@ARGV; $ac++)

             {

              if ($verbose)

              {

                  print "netname ".$netname." exclude ".$ARGV[$ac]."\n";

              }

              if ($netname =~ m/$ARGV[$ac]/i)

              {

                  $ac = @ARGV +1;

              }

              if ($verbose)

              {

                  print "netname ".$netname." ac ".$ac."\n";

              }

             }

             if ($verbose)

              {

                  print "Net " . $netname . " Part " . $partname . " Pin " . $pin . " ac ".$ac." argc".@ARGV."\n";

              }

             if ($ac == @ARGV)

             {

              $_ = $netname;

              if ($verbose)

                  {

                   printf "Net %s  Part %s Pad %s\n", $lowercase ? lc $_ : $_, $partname,$pad;

                  }

              if ($useformat eq "QL")

              {

                  s/$/sprintf("_p")/e;

                  s/\d+_p/sprintf("_p[%d]",$&)/e;

                  printf QCF "place %s IO%s\n",$lowercase ? lc $_ : $_, $pad;

              }

              elsif ($useformat eq "XIL")

              {

                  s/\d+$/sprintf("<%d>",$&)/e;

                        if ($pad =~ m/^[a-z]/i)

                        {

                            printf QCF "NET \"%s\" LOC = \"%s\";\n",$lowercase ? lc $_:$_, $pad;

                        }

                        else

                        {

                            printf QCF "NET \"%s\" LOC = \"P%s\";\n",$lowercase ? lc $_:$_, $pad;

                        }

              }

             }

         }

        }

    }

     

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
No Data
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube