In feature theory, there are two features:
[±voiced]
[±aspirated]
(sometimes by other names depending on which implementation of the theory you're looking at)
This gives us:
ph: [-voiced,+aspirated]
p: [-voiced,-aspirated]
b: [+voiced,-aspirated]
bh: [+voiced,+aspirated]
However, it turns out that [bh] is really something else, a special kind of voicing (breathy voice) associated with the release of the stop. So while that's an interesting topic, it isn't relevant to VOT really.
For VOT, then, the question is simply when the normal ("modal") voicing begins-- before, at or after the release of the stop? VOT of course can be measured to the millisecond, but in general I think those three distinctions are all that really matters in languages (taken as approximations).
b: negative VOT; voicing occurs during the closure; "prevoiced"
p: 0 VOT; voicing begins immediately
ph: positive VOT; voicing begins after the release, with a pause of aspiration
Different languages divide this space differently:
--English has <b> [p] and <p> [ph] technically (both are unvoiced, one is aspirated), where b has a VOT of 0, and p has a positive VOT.
--Spanish has <b>* [b] and <p> [p] (both unaspirated, one is voiced throughout), where b has a negative VOT and p has a VOT of 0.
(Spanish p = English b)
Conclusion: "voiced" and "voiceless" are often applied loosely to different languages, where there is just a binary contrast.
--Thai has a three-way contrast: b, p, ph.
--Hindi has a four-way contrast: p, ph, b, bh
[*I'm ignoring spirantization for Spanish where <b> isn't always a stop.]
Note: all numbers for VOT in this post are approximated/idealized. I don't know that a VOT of exactly 0 actually exists, for example. I think something like ±20ms is about normal for "0", and maybe ±80ms for aspiration. But it varies by language, and I might be remembering that incorrectly.