Цитата
что там сложного то ? ПЦТС он простой как 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
Только длительности пока уменьшенные, для того чтобы при моделировании все легко было посмотреть. По каким параметрам моделировать (и нужно ли) реальные значения, пока не представляю...
Эскизы прикрепленных изображений
Быть. torizin-liteha@yandex.ru