The reason you are finding this so difficult is that you have an idea, but you don't really have a complete idea what you want it to do. If you are doing your own project and you don't have a customer to tell you what they want, then it is up to you to be your own customer. Put yourself into the customer's shoes and start building an impossible wish list.
In other words, when you start Don't design ANYTHING!!!.
Once you have a big list of things you want the system to do, prioritize everything and decide what the minimum functionality will be to have a basic system running. This could be a single basic function, or an entire screen, but it needs to be something you feel - as the customer -will be useful enough to test.
So, Wish list of features + basic priorities = Requirements.
Once you have all of that, do a very high level design. Just sit and think about what your system will need to get the first few priorities up and running. Change you mind if you wish, but here is where you may wish to spike some code or a system configuration to learn more about what is possible. Go only far enough to validate your basic idea of a design.
I.e.: NOW you get to indulge your designers urges.
Once done, you start implementing your features. Create for each feature a basic functional spec. This could be as simple as a collection of feature statements. Story cards if you like. This allows you to develop your idea in your mind a little, and to create a set of statements that will become the specification that you will be testing and building your implementation against.
Cry Havoc, let slip the dogs of... Code!!
From there, implement your tests to match your specifications, then for each test, write your code. Build, "release", then repeat with the next feature until you decide the project is complete enough.
It really comes down to experienced, but this approach I've found is a simple formula to help you focus your mind on what needs to be done, rather than getting locked into an endless cycle of procrastination due to trying to do too much all at once.