Цитата(rezident @ Oct 29 2009, 00:23)

Что-то не совсем осознал суть проблемы. Не хочется можете считать во float считайте в целочисленных значениях. Но простое округление даст погрешность около 0,12% В зависимости от максимальной Request_freq сначала домножаете приращение фазы на степень двойки так, чтобы не вылезти за выбранную разрядную сетку (которая видимо должна быть больше исходных 32 бит). Потом производите суммирование фазового сдвига в той же выбранной разрядной сетке и результат сдвигаете вправо на то же число разрядов, что было при домножении. Получаете снова 32-х разрядное число. Увеличение разрядности даже на 8 разрядов уже даст на два порядка более точное целочисленное вычисление фазы.
Расчеты.
2^32*100МГц=42,94967296 при целочисленном округлении до 43 даст погрешность (43.0-42,94967296)/42,94967296*100%=0,117%
2^32*100МГц*2^8=10995,11627776 при целочисленном округлении до 10995 даст погрешность
((float)(10995>>8)-42,94967296)/42,94967296*100%=-0,001%
Вроде так.
В принципе вариант на счет float вполне возможен, но не желателен, так как для этого необходимо писать (либо доставать) модуль который занимается этим делом.......но его наличие ведет к увеличению потребления и площади кристалла......а это критично.......
Второй вариант который Вы предложили мне более по душе.........но не могли ли Вы пояснить как будет меняться множитель (2^n) в зависимости от требуемой частоты???
И все же не получается так......наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......
Сообщение отредактировал Frox_SzC - Oct 29 2009, 05:24