PDA

Просмотр полной версии : Цифровой записывающий пробник и индикацией на VGA



zx-kit
07.12.2010, 10:25
Для ремонта старого Спектрума или наладки нового иногда нужно увидеть временные диаграммы сигналов в нескольких точках и сравнить их с теми, которые должны быть. Поэтому предлагается сделать для этого простой прибор, который записывает состояние нескольких сигналов и позволяет затем вывести их диаграммы на монитор.

Как известно, видеоконвертер VGA&PAL имеет быструю память размером 512 килобайтов и может записывать целый кадр со Спектрума, а потом выводить на VGA. Поэтому, очевидно, его можно использовать для записи одновременно до четырех цифровых сигналов с частотой до 7 МГц.

Сигналы:
Для записываемых сигналов использовать входы RGBI.
Тактовая частота для работы платы VGA&PAL будет браться со Спектрума.
Еще нужна будет кнопка для запуска процесса записи. Для этого можно подключить кнопку к гребенкам для джамперов.

Cпособ индикации.
Предлагается каждый канал отображать разными цветами: красный (вход R), зеленый (вход G), голубой (вход B) и желтый (вход I) на черном фоне. Логический ноль отображать точкой, логическую единицу - вертикальной линией. Такой способ отображения легко реализовать на ПЛИС.

На экран монитора можно выводить достаточно большой отрезок времени и, так как высота четырех графиков получится достаточно маленькой, на экране их можно повторить раза четыре. Конечно каждый фрагмент будет соответствовать разному времени в записи.

Вот такое краткое описание проекта.

ZEK
07.12.2010, 11:36
Триггеры для запуска записи надо по любому.... (ну или отсчета начальной точки показа)
1. для проверки на иголки
2. для редких сигналов

zx-kit
07.12.2010, 11:55
Триггеры для запуска записи надо по любому.... (ну или отсчета начальной точки показа)
1. для проверки на иголки
2. для редких сигналов

Для начала предполагается режим просто записи с тактированием сигналов с частотой 14 МГц. Это уже позволит, например, посмотреть период и длительность строчного синхроимпульса. Для этого нужно записывать сразу несколько сигналов. Один из которых будет контрольным с известными параметрами.

Запуск записи можно начинать после нажатия кнопки, и если установлен один из джамперов, то после фронта одного из сигналов, которые подавать на входы KSI и SSI.

Для начала надо научиться отображать содержимое ОЗУ платы VGA&PAL на экран монитора в нужном виде. За основу можно взять одну из версий существующих прошивок. Или, кому проще, на основе своих наработок.

Доработка железа пока не нужна, только замена прошивки.

Для дальнейшего анализа плохих сигналов можно осуществлять запись с измерением длительности 0 и длительности 1. Выводить результат измерения в двоичном виде - на большее ПЛИС не потянет. Но это уже потом.

Syntal
07.12.2010, 17:26
Идея действительно классная, прям курсач свой вспомнил на 4 курсе. Вопрос только один Z-состояние никак отслеживать не думаете?

ZEK
07.12.2010, 17:59
Это не крусач, это демомейкинг
вроде как всунутся в 3128 не просто

KALDYH
07.12.2010, 18:05
Я для отладки пользуюсь практически тем же методом. Цепляю массу и синхронизацию от телевизора к компьютеру, а RGB входами тыкаю в плату. Соответственно, на экране наблюдается некий рисунок, например полосы или шахматка, который можно интерпретировать. Если на данный участок схемы не приходят сигналы с процессора, то картинка будет статичной, иначе - движется по экрану в зависимости от выполняемого кода.

zx-kit
07.12.2010, 19:29
Идея действительно классная, прям курсач свой вспомнил на 4 курсе. Вопрос только один Z-состояние никак отслеживать не думаете?
На плате VGA&PAL входы RGBI подтянуты резисторами 10к к земле.

Пока программа минимум - увидеть на экране монитора форму (длительность нуля и единицы) четырех сигналов со счетчиков Ленинграда или другого компа на мелкой логике.

ZEK
07.12.2010, 23:37
78% заняло 3128 без привязки пинов
осталось сделать скролинг маштаб и тригеры
скролинг и триггеры просто, код с расчетом на них



module LA(
input wire CLK14,

// Video in
input wire IR,
input wire IG,
input wire IB,
input wire II,
input wire ISSI,
input wire IKSI,

input wire[3:0] SW,

//Video out
output reg QR,
output reg QB,
output reg QG,
output reg QI,
output reg KSI,
output reg SSI,

// RAM
output reg [17:0] RAM_AQ,
inout wire[15:0] RAM_DB,
output wire RAM_WE,
output reg RAM_OE,
output wire RAM_UE,
output wire RAM_LE
);


parameter H_SYNC_CYC = 40;
parameter H_SYNC_BACK = 20;
parameter H_SYNC_ACT = 384;
parameter H_SYNC_FRONT= 4;
parameter H_SYNC_TOTAL= 447;

parameter V_SYNC_CYC = 2;
parameter V_SYNC_BACK = 46;
parameter V_SYNC_ACT = 576;
parameter V_SYNC_FRONT= 15;
parameter V_SYNC_TOTAL= 640;

reg HBLANK, VBLANK;
reg [9:0] VCNT, HCNT;

reg [17:0] RAMCNT;
reg [7:0] RAM_DQ;
reg [7:0] SHIFT;

reg WR;
assign RAM_WE = WR | CLK14;
assign RAM_UE = 1'b0;
assign RAM_LE = 1'b0;

assign RAM_DB[7:0] = (!RAM_WE) ? RAM_DQ : 8'hZZ;

reg [3:0] RDMUX;
reg [1:0] KEY, VAL_R, VAL_G, VAL_B, VAL_I, SHIFT_L, SHIFT_R;

always@(posedge CLK14)
begin
RDMUX = (HCNT[0]) ? RAM_DB[7:4] : RAM_DB[3:0];

KEY = {SW[0], KEY[1]};
VAL_R = { RDMUX[3], VAL_R[1] };
VAL_G = { RDMUX[2], VAL_G[1] };
VAL_B = { RDMUX[1], VAL_B[1] };
VAL_I = { RDMUX[0], VAL_I[1] };

SHIFT = {SHIFT[3:0], IR,IG,IB,II};

if (KEY[0] != KEY[1])
begin
RAMCNT = 0;
WR = 1'b1;

if (!KEY[1])
RAM_OE = 1'b1; // write
else
RAM_OE = 1'b0; // read
end

// mem unit
if (RAM_OE)
begin
if (!HCNT[0])
begin
RAM_AQ = RAMCNT;
RAM_DQ = SHIFT;
end
else
RAMCNT = !RAMCNT[17] ? RAMCNT + 1 : RAMCNT;

WR = HCNT[0];
end
else
begin

end


HBLANK <= (HCNT <= H_SYNC_CYC+ H_SYNC_BACK || HCNT >= H_SYNC_TOTAL - H_SYNC_FRONT);

// H_Sync Counter
if( HCNT < H_SYNC_TOTAL )
HCNT <= HCNT+1;
else
HCNT <= 0;
// H_Sync Generator
if( HCNT < H_SYNC_CYC )
SSI <= 0;
else
begin
SSI <= 1;
if (!RAM_OE)
RAM_AQ[17:0] = {RAMCNT[10:0], HCNT[8:1]};
end

if (BLANK)
{QR, QG, QB, QI} = 4'h0;
else
begin
QR = PEN_R | PEN_I;
QG = PEN_G | PEN_I;
QB = PEN_B | PEN_I;
QI = (RAY_R | RAY_G | RAY_B | RAY_I) & HCNT[2:0] == 0 & VCNT[3:0] == 0;
end

end

wire LH = VCNT[5:2] == 4'h0;
wire LL = VCNT[5:2] == 4'hF;

wire RAY_R = VCNT[9:6] == 4'h1;
wire RAY_G = VCNT[9:6] == 4'h3;
wire RAY_B = VCNT[9:6] == 4'h5;
wire RAY_I = VCNT[9:6] == 4'h7;

wire PEN_R = RAY_R & (VAL_R[0]==VAL_R[1] ? (VAL_R[1] ? LH : LL) : 1'b1);
wire PEN_G = RAY_G & (VAL_G[0]==VAL_G[1] ? (VAL_G[1] ? LH : LL) : 1'b1);
wire PEN_B = RAY_B & (VAL_B[0]==VAL_B[1] ? (VAL_B[1] ? LH : LL) : 1'b1);
wire PEN_I = RAY_I & (VAL_I[0]==VAL_I[1] ? (VAL_I[1] ? LH : LL) : 1'b1);


always@(posedge CLK14)
begin
if(HCNT==0)
begin
// V_Sync Counter
if( VCNT < V_SYNC_TOTAL )
VCNT <= VCNT+1;
else
VCNT <= 0;
// V_Sync Generator
if( VCNT < V_SYNC_CYC )
begin
KSI <= 0;
SHIFT_L = {SW[3], SHIFT_L[1]};
SHIFT_R = {SW[2], SHIFT_R[1]};
end
else
KSI <= 1;
end

VBLANK <= (VCNT < V_SYNC_BACK || VCNT >= V_SYNC_BACK + V_SYNC_ACT);
end


assign BLANK = VBLANK | HBLANK;

endmodule

ZEK
07.12.2010, 23:48
Тайминги надо наверное потестить, там и 40гц кадровой могло получится, у меня тестовый монитор такой плохой что хавает все что не подаш :)

Сейчас пишет 128кил данных, в одном байте 2выборки на 14МГц.

zx-kit
08.12.2010, 08:08
Тайминги надо наверное потестить, там и 40гц кадровой могло получится, у меня тестовый монитор такой плохой что хавает все что не подаш :)

Сейчас пишет 128кил данных, в одном байте 2выборки на 14МГц.

Это пока только имитация записи?
По горизонтали на мониторе сколько выборок влезает?
Частоту лучше 60 Гц делать, чтобы на любом мониторе показывало.

Круто получилось, как на настоящем осциллографе. Не думал, что на ПЛИС незаполненные осциллограммы получатся.
То есть я думал, что возможно единицу только столбиком отобразить.

ZEK
08.12.2010, 08:20
Это пока только имитация записи?
Это в DE1 к модулю LA подключено все внешнее (память видео кнопочки)
просто на входы IR,IG,IB,II подается частота 0.2 0.4 0.8 1.6 МГц от тестового генератора внутри DE1
есть кнопка которая отключает эти сигналы и картинка строится из памяти

zx-kit
08.12.2010, 08:23
Это в DE1 к модулю LA подключено все внешнее (память видео кнопочки)
просто на входы IR,IG,IB,II подается частота 0.2 0.4 0.8 1.6 МГц от тестового генератора внутри DE1
есть кнопка которая отключает эти сигналы и картинка строится из памяти
А как будет выглядеть частота 7 МГц?

ZEK
08.12.2010, 09:14
Сейчас сплошной полосой, но в принципе можно поправить, если будет влезать маштабирование