Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Надо сформировать сложный сигнал
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
torik
Надо сформировать синхроимпульсы полного телевизионного сигнала PAL в соответсвии с ГОСТ. Там получается довольно сложная последовательность... Правда ширина сигнала всего 1 бит
Как красиво это сделать?

Первое, что приходит в голову, организовать конструкцию if else if else if else...
Но что получится когда эта конструкция будет включать пару десятков или даже больше таких последовательных условных операторов?
des00
Цитата(torik @ Dec 15 2009, 06:44) *
Надо сформировать синхроимпульсы полного телевизионного сигнала PAL в соответсвии с ГОСТ. Там получается довольно сложная последовательность... Правда ширина сигнала всего 1 бит
Как красиво это сделать?

Первое, что приходит в голову, организовать конструкцию if else if else if else...
Но что получится когда эта конструкция будет включать пару десятков или даже больше таких последовательных условных операторов?


лет 6 назад делал подобное на AHDL если мне память не изменяет на все ушло 2 счетчика + чуток логики %)
torik
Есть правда вариант все это промасштабировать и держать последовательность нулей и единиц в памяти...

Цитата
лет 6 назад делал подобное на AHDL если мне память не изменяет на все ушло 2 счетчика + чуток логики %)

Немного логики и счетчиков на "длинную" конструкцию if-else?
iosifk
Цитата(torik @ Dec 15 2009, 15:44) *
Надо сформировать синхроимпульсы полного телевизионного сигнала PAL в соответсвии с ГОСТ. Там получается довольно сложная последовательность... Правда ширина сигнала всего 1 бит
Как красиво это сделать?

Первое, что приходит в голову, организовать конструкцию if else if else if else...
Но что получится когда эта конструкция будет включать пару десятков или даже больше таких последовательных условных операторов?

На самом деле, нужно только автомат состояний и перезагружаемый таймер...
Автомат загружает таймер последовательностями, которые и формируют длительности...
Удачи!
На самом деле, в Альтеровских файлах университетской программы это все расписано. Да и для ксайлинсовской тоже...
torik
Цитата
На самом деле, нужно только автомат состояний и перезагружаемый таймер...
Автомат загружает таймер последовательностями, которые и формируют длительности...
Удачи!

Идея понятна

Цитата
На самом деле, в Альтеровских файлах университетской программы это все расписано.

Если это на сайте альтеры, то как найти?
AndrewS6
Можно записать желаемую последовательность значений в память, счетчиком перебирать адрес.
torik
Вспомнил, примерно так:

reg [6:0] State;
reg [19:0] Timer;
reg [19:0] TimerReg;


Код
always @(posedge CLK or negedge RESETn) begin
    if (!RESETn) begin
        State <= 0; SSP <= 1; TimerReg <= 0;
    end else begin
        if (Timer == 20'd0) begin
            case (State)
            0:    begin
                    SSP <= 1;
                    TimerReg <= 10;
                    State <= 1;
                end
            1:    begin
                    SSP <= 0;
                    TimerReg <= 2;
                    State <= 2;
                end
            2:    begin
                    SSP <= 1;
                    TimerReg <= 2;
                    State <= 3;
                end
            3:    begin
                    SSP <= 0;
                    TimerReg <= 3;
                    State <= 0;
                end
            endcase
        end
    end
end

always @(posedge CLK or negedge RESETn) begin
    if (!RESETn) begin
        Timer <= 0;
    end else begin
        if (Timer > 0) Timer <= Timer - 1'b1;
        else Timer <= TimerReg;
        
    end
end


У меня I2C конфигуратор так сделан был когда-то (содран)


Надо только довести до ума и параметризировать, еще не проверял...
iosifk
Цитата(torik @ Dec 15 2009, 16:18) *
Идея понятна


Если это на сайте альтеры, то как найти?

а вот референс дизайн лежит у Альтеры...
http://www.altera.com/support/refdesigns/s...niosii-vga.html
это то?
Shivers
Цитата(AndrewS6 @ Dec 15 2009, 16:23) *
Можно записать желаемую последовательность значений в память, счетчиком перебирать адрес.

Ширина 1 не самый оптимальный вариант для использования памяти. Иногда лучше расписать мультиплексорами или if/else всю последовательность в соответствие со значениями счетчика, а потом скормить синтезатору. Получится большая комбинаторная схема - функция адреса счетчика.
Я когда ROM делаю, всегда встает выбор - сделать на латчах как есть, без оптимизации, и получить потом возможность править в металле(ASIC), если будут ошибки, либо оптимизировать ROM в комбинаторную функцию адреса и получить малую площадь кристалла. Минус комбинаторной схемы - очень длинный путь, минус ROMа "как есть" - огромный кристалл. Выбор по ситуации )
Самурай
Цитата(des00 @ Dec 15 2009, 15:50) *
лет 6 назад делал подобное на AHDL если мне память не изменяет на все ушло 2 счетчика + чуток логики %)


Аналогично, правда лет 10 назадsmile.gif. Генератор ч/б полос уместился в EPM3032, цветных в EPM3064. Один счетчик и несколько дешифраторовsmile.gif.
torik
Цитата
а вот референс дизайн лежит у Альтеры...
http://www.altera.com/support/refdesigns/s...niosii-vga.html
это то?

Нет, это несколько проще.

А мне надо сформировать полный телевизионный сигнал, вернее его синхроимульсы).
Получаем 5 периодов одних импульсов, 5 периодов других, еще 1, еще 302 и т.д. Всего вроде 10 смен состояний. Каждое состояние должно включать определенное кол-во импульсов с заданными параметрами...
Shivers
набросал автомат, сделал бы что то вроде этого:
Код
wire DOUT;  // выход
//импульсы
wire [8:0] sample0 = 9'b100110011;
wire [2:0] sample1 = 3'b101;
......
wire [5:0] sample9 = 6'b110010;
//длины импульсов
wire [7:0] len0 = 8'h9, len1 = 8'h3, .. len9 = 8'h6;

reg [3:0] state;  //счетчик, номер последовательности
reg [7:0] count; //
reg [31:0] buf;  //стек для импульсов

always @(posedge clk or negedge resetn)
if(~resetn)
  begin
   state <= 4'h0;
   count <= 8'h0;
   buf[31:0] <= sample0;
  end
else
  begin
   if(state < 10)
   begin
    if(
       (state == 4'h0) & (count == len0) |
...
       (state == 4'h9) & (count == len9) )   //достигнут конец импульса
     begin
      state <= state + 1;       // смена номера импульса
      count <= 8'h0;             //обнуление указателя
      buf [31:0] <= ((state == 4'h0) & (count == len0)) ? sample0 :      //загрузка следющего ипульса
                             (((state == 4'h1) & (count == len1)) ? sample1 :
                                .........
                                sample9 ))))...))
     end
   else
    begin
     count <= count + 1;
     buf [31:0] <= buf [31:0] >> 1;  //сдвиг стека
    end
  end
else   state <= 4'h0; //полный цикл импульсов

assign DOUT = buf[0];

После синтеза будут два счетчика с кучей комбинаторики. Если на мегафункциях сделать, в ПЛИС должно работать относительно шустро.
Maverick
Цитата(iosifk @ Dec 15 2009, 17:08) *
На самом деле, нужно только автомат состояний и перезагружаемый таймер...
Автомат загружает таймер последовательностями, которые и формируют длительности...
Удачи!
На самом деле, в Альтеровских файлах университетской программы это все расписано. Да и для ксайлинсовской тоже...

а можете дать ссылку или привести пример
ЗЫ желательно на VHDL rolleyes.gif
des00
Цитата(torik @ Dec 15 2009, 08:17) *
А мне надо сформировать полный телевизионный сигнал, вернее его синхроимульсы).
Получаем 5 периодов одних импульсов, 5 периодов других, еще 1, еще 302 и т.д. Всего вроде 10 смен состояний. Каждое состояние должно включать определенное кол-во импульсов с заданными параметрами...


что там сложного то ? ПЦТС он простой как 3 рубля, все постоянно, счетчик строк, столбцов. все остальные синхроимпульсы легко привязываются к этим двум счетчикам %)

Или я не так понял задачу ? smile.gif
iosifk
Цитата(Maverick @ Dec 15 2009, 19:25) *
а можете дать ссылку или привести пример
ЗЫ желательно на VHDL rolleyes.gif

разные файлы. Не мои, так что без претензий...
torik
Цитата
что там сложного то ? ПЦТС он простой как 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
Ради интереса попробовал смоделировать синхросигнал как есть. При тактовой 10 МГц точность не хуже 1 нс занимает оооочень много времени...
Есть какие-либо методики проверки при длительных сигналах? Например, должен быть какой-то общий подход к моделированию, скажем, систем обработки видео. Масштабирование ведь тоже имеет некоторые ограничения.
Джеймс
Цитата(torik @ Dec 16 2009, 16:13) *
Ради интереса попробовал смоделировать синхросигнал как есть. При тактовой 10 МГц точность не хуже 1 нс занимает оооочень много времени...

Не знаю, у меня ваш проект моделируется за пару секунд на интервале 100ms. А это между прочим больше, чем 2 кадра. Вы ModelSim используете?

Цитата(torik @ Dec 16 2009, 16:13) *
Есть какие-либо методики проверки при длительных сигналах? Например, должен быть какой-то общий подход к моделированию, скажем, систем обработки видео.

У меня всегда был параметр "число строк в кадре". Для моделирования - 125, в боевой версии - 625.

Цитата(torik @ Dec 16 2009, 16:13) *
Масштабирование ведь тоже имеет некоторые ограничения.

Уберите лучше это масштабирование. Вообще ничего не оценить, ни длительность строки, ни соотношения уравнивающих и врезок, короче вообще ничего. Еще не понял, почему у вас разное число строк в полях. И советую чисто для себя сформировать сигнал "четное-нечетное" поле.
torik
Цитата
Не знаю, у меня ваш проект моделируется за пару секунд на интервале 100ms. А это между прочим больше, чем 2 кадра. Вы ModelSim используете?

Да, ModelSim 6.5b с Q91. Скорее всего моделсим упорно моделирует мне с точностью 1 пс, потому и долго. Пока недовкурил как ускорить процесс. А как выглядит ваш тест, просто тактовая?
Цитата
Уберите лучше это масштабирование. Вообще ничего не оценить, ни длительность строки, ни соотношения уравнивающих и врезок, короче вообще ничего. Еще не понял, почему у вас разное число строк в полях.

Я привел картинку из стандарта. Разно кол-во строк в полях, потому что в нечетном идет сдвиг на пол строки (отдельно 2 импульса делаю). Т.е. в сумме тоже самое.

Цитата
И советую чисто для себя сформировать сигнал "четное-нечетное" поле.

Возможно мне еще и кадровый понадобится, но это следующий этап. Дальше вообще надо будет синхронизировать синхропоследовательность с меткой времени.
Джеймс
Цитата(torik @ Dec 17 2009, 09:09) *
Да, ModelSim 6.5b с Q91. Скорее всего моделсим упорно моделирует мне с точностью 1 пс, потому и долго. Пока недовкурил как ускорить процесс. А как выглядит ваш тест, просто тактовая?

Присоединил файл. Точность задал в первой строчке. Можете попробовать заменить на `timescale 1ns / 1ns
Clock-генератор тоже объявил (от этого проект естественно перестал быть синтезируемым).
torik
Однако, все равно медленно, если задать все параметры как у меня в коментариях... Наверное, все же с реальными значениями моделировать трудновасто...
ReAl
Цитата(torik @ Dec 17 2009, 08:09) *
Я привел картинку из стандарта. Разно кол-во строк в полях, потому что в нечетном идет сдвиг на пол строки (отдельно 2 импульса делаю).
Количество строк в полях одинаковое, просто длина поля - не целое число строк.
Я плясал от полустроки. Т.е. есть счётчик пикселов, который работает с периодом в полустроку.
Есть счётчик полустрок в поле, с выхода которого пребрасывается триггер чётности поля (собственно, можно было бы иметь счётчик полустрок в кадре и его старший бит использовать как чётность поля, но так было удобнее для моей головы).
Там, где надо было иметь как бы старший бит счётчика пикселов в строке, там брался младший бит счётчика полустрок, XOR-нутый с чётностю поля.
Генерация синхро и гасящих импульсов легко входит в 32 ячейки, в EPM3064 входит и генерация сигналов управления телевизионным SONY CCD и аналоговым чипом CXA1310.
Нестандартные режимы + приём команд по последовательной шине на изменение режимов, поэтому и не родной чип управления CXD2400/CXD2463.
torik
Цитата
Количество строк в полях одинаковое, просто длина поля - не целое число строк.

Согласен...

Цитата
Генерация синхро и гасящих импульсов легко входит в 32 ячейки

хотел бы я на это посмотреть. Получается, что я сделал это не лучшим образом...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.