На мой взгляд, схема синхронизации в DSO такая:
Непрерывно поступающие "в никуда" выборки сигнала проходят через две/три дополнительные ячейки задержки на один такт. Значения в них сравниваются на предмет "пересечения" установленного порога срабатывания синхро.
Если в первой было меньше уровня, во второй/третьей - больше, и задан положительный фронт, выдается синхроимпульс.
Далее подача синхро блокируется, и определенное число выборок надо вывалить, начиная с нулевого адреса, в память для экрана DSO, чтобы его заполнить. После этого, разрешается новая выдача синхроимпульса. Процесс повторяется.
Очень удобно делать хоть на ПЛИС, хоть на DSP.
По поводу буфера экрана. Для плавности отображения, функции "стоп-кадр" с увеличением и прочих наворотов, используется oversampling - фактически, высота очередного отсчета на экране при обновлении берется через N отсчетов в памяти. При использовании "zoom" число N просто уменьшается.
Но для простенького самодельного осцила и так сойдет

Примерно, так.
И этта... Забудьте о "сдвигании" всего массива выборок вперед или назад, кольцевых буфернях и проч требухе! В "правильных" DSO заполнение только инкрементом в Static memory. Далее - с нуля, ага