torik 0 16 декабря, 2009 Опубликовано 16 декабря, 2009 · Жалоба что там сложного то ? ПЦТС он простой как 3 рубля, все постоянно, счетчик строк, столбцов. все остальные синхроимпульсы легко привязываются к этим двум счетчикам %) Или я не так понял задачу ? smile.gif То что мне нужно сформировать показано на рисунке. Все получилось, вот код: module SYNC_GENERATOR ( input CLK, input RESETn, output reg SSP ); /* Параметры формируемого синхросигнала. * Длительности указываются в тактах. * Период CLK = 10 нс. */ parameter LINE_PULSE_DURATION = 6; //470 = длительность строчного синхроимпульса parameter LINE_PERIOD2 = 16; //3200 = длина строки деленная на 2 parameter LINE_PERIOD = 32; //6400 = длина строки parameter LINE_NUM_F1 = 4; //305 = число строк в первом поле parameter LINE_NUM_F2 = 3; //304 = число строк во втором поле parameter SYNC_PULSE_DURATION = 12; //2730 = длительность синхронизирующего импульса parameter SYNC_PULSE_NUM_F1 = 2; //5 = число синхронизирующих имп. в поле 1 parameter SYNC_PULSE_NUM_F2 = 2; //5 = число синхронизирующих имп. в поле 2 parameter EQUALIZING_PULSE1_DURATION= 4; //235 = длительность выравнивающего имп. в поле 1 parameter EQUALIZING_PULSE1_NUM1_F1 = 2; //5 = число выравн. имп. в начале поля 1 parameter EQUALIZING_PULSE1_NUM2_F1 = 2; //5 = число выравн. имп. в конце поля 1 parameter EQUALIZING_PULSE1_NUM1_F2 = 2; //5 = число выравн. имп. в начале поля 2 parameter EQUALIZING_PULSE1_NUM2_F2 = 2; //5 = число выравн. имп. в конце поля 2 /* Переменные * */ reg [12:0] TimerH2; //задает полстроки или целую reg [12:0] LINE_PERIOD2reg; // reg [12:0] TimerSSP0reg; //время нуля reg [8:0] PulseNUM; //кол-во импульсов с текущими параметрами reg [8:0] PulseNUMreg; reg [3:0] State; //текущее состояние /* Таймер, задающий период импульсов в полстроки. * */ always @(posedge CLK or negedge RESETn) begin if (!RESETn) begin TimerH2 <= LINE_PERIOD2reg; end else begin if (TimerH2 < LINE_PERIOD2reg) TimerH2 <= TimerH2 + 1'b1; else TimerH2 <= 0; end end /* Выходная последовательность: * Вся последовательность состоит из импульсов, начинающихся * интервалом со значением 0 и заканчивающихся значением 1. * Период каждого импульса равен половине строки. */ always @(posedge CLK or negedge RESETn) begin if (!RESETn) begin SSP <= 1; end else begin if ((TimerH2 == 0) && (TimerSSP0reg > 0)) SSP <= 0; if (TimerH2 == TimerSSP0reg) SSP <= 1; end end /* PulseNUM * */ always @(posedge CLK or negedge RESETn) begin if (!RESETn) begin PulseNUM <= PulseNUMreg; end else begin if (TimerH2 == LINE_PERIOD2reg) begin if (PulseNUM < PulseNUMreg) PulseNUM <= PulseNUM + 1; else PulseNUM <= 0; end end end /* Автомат состояний * TimerSSP0reg - точное значение нулевого интервала полустрочного импульса * PulseNUMreg - число одинаковых импульсов - 1 */ always @(posedge CLK or negedge RESETn) begin if (!RESETn) begin State <= 0; TimerSSP0reg <= SYNC_PULSE_DURATION; PulseNUMreg <= SYNC_PULSE_NUM_F1 - 1; LINE_PERIOD2reg <= LINE_PERIOD2 - 1; end else begin if ((PulseNUM == PulseNUMreg) && (TimerH2 == LINE_PERIOD2reg)) begin case (State) 0: begin TimerSSP0reg <= SYNC_PULSE_DURATION; PulseNUMreg <= SYNC_PULSE_NUM_F1 - 1; State <= 1; end 1: begin TimerSSP0reg <= EQUALIZING_PULSE1_DURATION; PulseNUMreg <= EQUALIZING_PULSE1_NUM1_F1 - 1; State <= 2; end 2: begin TimerSSP0reg <= LINE_PULSE_DURATION; PulseNUMreg <= LINE_NUM_F1 - 1; LINE_PERIOD2reg <= LINE_PERIOD - 1; State <= 3; end 3: begin TimerSSP0reg <= EQUALIZING_PULSE1_DURATION; PulseNUMreg <= EQUALIZING_PULSE1_NUM2_F1 - 1; LINE_PERIOD2reg <= LINE_PERIOD2 - 1; State <= 4; end 4: begin TimerSSP0reg <= SYNC_PULSE_DURATION; PulseNUMreg <= SYNC_PULSE_NUM_F2 - 1; State <= 5; end 5: begin TimerSSP0reg <= EQUALIZING_PULSE1_DURATION; PulseNUMreg <= EQUALIZING_PULSE1_NUM1_F2 - 1; State <= 6; end 6: begin TimerSSP0reg <= 0; PulseNUMreg <= 0; State <= 7; end 7: begin TimerSSP0reg <= LINE_PULSE_DURATION; PulseNUMreg <= LINE_NUM_F2 - 1; LINE_PERIOD2reg <= LINE_PERIOD - 1; State <= 8; end 8: begin TimerSSP0reg <= LINE_PULSE_DURATION; PulseNUMreg <= 0; LINE_PERIOD2reg <= LINE_PERIOD2 - 1; State <= 9; end 9: begin TimerSSP0reg <= EQUALIZING_PULSE1_DURATION; PulseNUMreg <= EQUALIZING_PULSE1_NUM2_F2 - 1; State <= 0; end endcase end end end endmodule Только длительности пока уменьшенные, для того чтобы при моделировании все легко было посмотреть. По каким параметрам моделировать (и нужно ли) реальные значения, пока не представляю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 16 декабря, 2009 Опубликовано 16 декабря, 2009 · Жалоба Ради интереса попробовал смоделировать синхросигнал как есть. При тактовой 10 МГц точность не хуже 1 нс занимает оооочень много времени... Есть какие-либо методики проверки при длительных сигналах? Например, должен быть какой-то общий подход к моделированию, скажем, систем обработки видео. Масштабирование ведь тоже имеет некоторые ограничения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 16 декабря, 2009 Опубликовано 16 декабря, 2009 · Жалоба Ради интереса попробовал смоделировать синхросигнал как есть. При тактовой 10 МГц точность не хуже 1 нс занимает оооочень много времени... Не знаю, у меня ваш проект моделируется за пару секунд на интервале 100ms. А это между прочим больше, чем 2 кадра. Вы ModelSim используете? Есть какие-либо методики проверки при длительных сигналах? Например, должен быть какой-то общий подход к моделированию, скажем, систем обработки видео. У меня всегда был параметр "число строк в кадре". Для моделирования - 125, в боевой версии - 625. Масштабирование ведь тоже имеет некоторые ограничения. Уберите лучше это масштабирование. Вообще ничего не оценить, ни длительность строки, ни соотношения уравнивающих и врезок, короче вообще ничего. Еще не понял, почему у вас разное число строк в полях. И советую чисто для себя сформировать сигнал "четное-нечетное" поле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 17 декабря, 2009 Опубликовано 17 декабря, 2009 · Жалоба Не знаю, у меня ваш проект моделируется за пару секунд на интервале 100ms. А это между прочим больше, чем 2 кадра. Вы ModelSim используете? Да, ModelSim 6.5b с Q91. Скорее всего моделсим упорно моделирует мне с точностью 1 пс, потому и долго. Пока недовкурил как ускорить процесс. А как выглядит ваш тест, просто тактовая? Уберите лучше это масштабирование. Вообще ничего не оценить, ни длительность строки, ни соотношения уравнивающих и врезок, короче вообще ничего. Еще не понял, почему у вас разное число строк в полях. Я привел картинку из стандарта. Разно кол-во строк в полях, потому что в нечетном идет сдвиг на пол строки (отдельно 2 импульса делаю). Т.е. в сумме тоже самое. И советую чисто для себя сформировать сигнал "четное-нечетное" поле. Возможно мне еще и кадровый понадобится, но это следующий этап. Дальше вообще надо будет синхронизировать синхропоследовательность с меткой времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 17 декабря, 2009 Опубликовано 17 декабря, 2009 · Жалоба Да, ModelSim 6.5b с Q91. Скорее всего моделсим упорно моделирует мне с точностью 1 пс, потому и долго. Пока недовкурил как ускорить процесс. А как выглядит ваш тест, просто тактовая? Присоединил файл. Точность задал в первой строчке. Можете попробовать заменить на `timescale 1ns / 1ns Clock-генератор тоже объявил (от этого проект естественно перестал быть синтезируемым). SYNC_GENERATOR.v Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 20 декабря, 2009 Опубликовано 20 декабря, 2009 · Жалоба Однако, все равно медленно, если задать все параметры как у меня в коментариях... Наверное, все же с реальными значениями моделировать трудновасто... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 20 декабря, 2009 Опубликовано 20 декабря, 2009 · Жалоба Я привел картинку из стандарта. Разно кол-во строк в полях, потому что в нечетном идет сдвиг на пол строки (отдельно 2 импульса делаю).Количество строк в полях одинаковое, просто длина поля - не целое число строк. Я плясал от полустроки. Т.е. есть счётчик пикселов, который работает с периодом в полустроку. Есть счётчик полустрок в поле, с выхода которого пребрасывается триггер чётности поля (собственно, можно было бы иметь счётчик полустрок в кадре и его старший бит использовать как чётность поля, но так было удобнее для моей головы). Там, где надо было иметь как бы старший бит счётчика пикселов в строке, там брался младший бит счётчика полустрок, XOR-нутый с чётностю поля. Генерация синхро и гасящих импульсов легко входит в 32 ячейки, в EPM3064 входит и генерация сигналов управления телевизионным SONY CCD и аналоговым чипом CXA1310. Нестандартные режимы + приём команд по последовательной шине на изменение режимов, поэтому и не родной чип управления CXD2400/CXD2463. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 21 декабря, 2009 Опубликовано 21 декабря, 2009 · Жалоба Количество строк в полях одинаковое, просто длина поля - не целое число строк. Согласен... Генерация синхро и гасящих импульсов легко входит в 32 ячейки хотел бы я на это посмотреть. Получается, что я сделал это не лучшим образом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться