uart: Eliminate systemic baud rate error with low divisor values
authorAlbert Ou <albert@sifive.com>
Fri, 5 Jan 2018 03:51:24 +0000 (19:51 -0800)
committerAlbert Ou <albert@sifive.com>
Fri, 5 Jan 2018 03:51:24 +0000 (19:51 -0800)
commit14ffd35f5c14771375e0a28c415abe6ba5db92e1
treeab0e8dd920975be23742a03ac379edc66349bb30
parent9052a079d404ebbfda5f01765b909c20503504ad
uart: Eliminate systemic baud rate error with low divisor values

This refactors the receiver logic to compensate for the case of the baud
rate divisor not being multiple of the oversampling period.

Previously, the bit time was effectively rounded to (s * floor(div / s))
cycles, where "s" is the oversampling factor - the number of
intermediate samples for each data bit.  The remainder r = (div % s) was
ignored, thereby resulting in gradually accumulated drift that became
significant for divisor values on the same order of magnitude as "s".

The revised approach inserts the required additional delay by extending
the last "r" samples of a given data bit by one cycle each.
src/main/scala/devices/uart/UART.scala