Схема 1. Концепт одного канала.
В режиме логического пробника, на опорах постоянно поддерживается уровень "0" и "1" (например, 0.8 и 1.7В), получается 1.5-разрядный flash АЦП.
В режиме аналогового пробника периодических сигналов, на одной опоре постоянно поддерживается требуемый уровень триггера (например, 1.5В), а на другой меняется с каждой "строкой", пробегая требуемый диапазон с нужным шагом (например, от 100мВ до 3100мВ с шагом 5мВ). Выход компаратора защелкивается в сдвиговом регистре (одной строки) с эквивалентной тактовой 2ГГц.
Далее варианты, строки либо сразу выводятся (UART/VGA/...), либо пишутся во внутреннюю память ПЛИС для обработки ("цифровой фосфор" и тп).
Опоры проще всего формировать RC цепочкой, недостаток - малое время хранения из-за больших утечек (2пина*30мкА/пин=60мкА по даташиту для CycloneV). Преимущество - простая пассивная обвязка позволяет сразу закладывать в дизайн скоп для отладки.
Схема 2. Текущая для проверки концепта, навесной монтаж. Вход синхронизации отсутствует, тк тестовый сигнал генерируется внутри ПЛИС. Постоянный уровень сигнала задается потенциометром, мультиметром можно проконтролировать правильность отображения "нулевой" линии.
Сейчас добавляю вход синхронизации, и меняю код - чтобы можно было смотреть сигналы с внешнего генератора.
Исходники начну выкладывать, когда сделаю простой вывод на VGA. Но, у меня основная цель - практическая проверка своего "Си как HDL", а "скоп за 30 коп" - просто как одна из подходящих практических задачек для этого. Поэтому выкладывать буду только в том виде, каком использую для синтеза, те без ручного перевода в Верилог. Но тк это почти Си - алгоритм будет понятен.
Модуль для захвата сигнала на 2Гвыб/сек с выдачей по 8бит на 250МГц написан на Верилоге, его сейчас выкладываю(как есть):
Код
module ser8 (
input clka, clkb, clkc, clkd,
input din,
output reg [7:0] q
);
reg
a, b, c, d, A, B, C, D,
aa, ba, cb, dc, Ad, BA, CA, DC,
aaa, baa, cba, dcb, Adc, BAc, CAc, DCA,
DCAc;
always@(posedge clka) a <= din;
always@(posedge clkb) b <= din;
always@(posedge clkc) c <= din;
always@(posedge clkd) d <= din;
always@(negedge clka) A <= din;
always@(negedge clkb) B <= din;
always@(negedge clkc) C <= din;
always@(negedge clkd) D <= din;
always@(posedge clka) aa <= a;
always@(posedge clka) ba <= b;
always@(posedge clkb) cb <= c;
always@(posedge clkc) dc <= d;
always@(posedge clkd) Ad <= A;
always@(negedge clka) BA <= B;
always@(negedge clka) CA <= C;
always@(negedge clkc) DC <= D;
always@(posedge clka) aaa <= aa;
always@(posedge clka) baa <= ba;
always@(posedge clka) cba <= cb;
always@(posedge clkb) dcb <= dc;
always@(posedge clkc) Adc <= Ad;
always@(posedge clkc) BAc <= BA;
always@(posedge clkc) CAc <= CA;
always@(negedge clka) DCA <= DC;
always@(posedge clkc) DCAc <= DCA;
always@(posedge clka) q <= { DCAc, aaa, baa, cba, dcb, Adc, BAc, CAc };
endmodule