Телескопы покупают здесь


A A A A Автор Тема: 33 мегапикселя на ладони  (Прочитано 28601 раз)

0 Пользователей и 1 Гость просматривают эту тему.

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #500 : 13 Дек 2015 [17:57:50] »
делаю серии снимков по 10 штук. и всего лишь на одном замечен косяк в виде каких-то полосок

Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #501 : 13 Дек 2015 [17:59:24] »
Если у Вас была любая из камер QHY, то возможно Вы заметили, что после коннекта по USB, драйвер камеры ставится как бы два раза подряд. После подключения появляется характерное "трыньканье" и сообщение "обнаружено новое устройство". После установки драйвера (или его загрузки, если он уже был установлен), опять раздается сигнал и сообщение "Обнаружено новое...". Первый раз камера определяется как "устройство имярек" (если в "малый" еер прописан пользовательский VID), или даже как "EZUSB FX2LP" или как его там... (если еер отсутствует или совсем пустое). По этому VIDу ставится драйвер-загрузчик (написанный разработчиком устройства), который по специальному протоколу загружает прошивку в ОЗУ процессора и инициирует перезапуск. После перезапуска стартует свежезалитая прошивка в ОЗУ проца, инициирует переподключение к шине USB уже с новым VID/PID конечного устройства, на которое ставится второй, "пользовательский" драйвер.
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #502 : 13 Дек 2015 [18:00:45] »
да, у меня именно так и подключается  камера. должно быть как-то иначе?

Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #503 : 13 Дек 2015 [18:07:54] »
делаю серии снимков по 10 штук. и всего лишь на одном замечен косяк в виде каких-то полосок
Надо бы картинку поярче и поконтрастнее, и лучше цветную миру с вертикальными штрихами. У меня впечатление, что даже в искаженных строках частично просматривается полезное изображение. Я прав?
Цитата
да, у меня именно так и подключается  камера. должно быть как-то иначе?
Должно быть так, как хотел разработчик устройства :). Иначе это называется глюком. В конкретно взятом случае такое поведение-норма.
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #504 : 13 Дек 2015 [18:10:47] »
Цитата
У меня впечатление, что даже в искаженных строках частично просматривается полезное изображение.
похоже на то, только оно куда-то сдвинуто, видимо байер нарушен
Цитата
Должно быть так, как хотел разработчик устройства
если разработчик точно знает , чего он хочет и как это реализовать..... 8)

Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #505 : 13 Дек 2015 [18:18:49] »
Полоски начинаются строго с начала строки?
Скиньте мне актуальную версию секвенсора, прогоню в симе и посмотрю что там в начале строки творится...
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #506 : 13 Дек 2015 [18:41:45] »
это для тактирования на 8 МГц. в общем тут даже негде развернуться для манёвра, так как счёт идёт от 0 до 5 тактов.


`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Description: Time generator 8 MHz for DALSA CCD FTF5066C
//reg1[1] byte=0x02;//подача питания на MAX618
//reg1[2] byte=0x04;//управление накоплением заряда
//reg1[3] byte=0x08;//управление экспозицией
//////////////////////////////////////////////////////////////////////////////////
module FTF5066C_8 /*#(parameter BASE = 0)*/(
  // Clock
  input wire clock,
  input wire f2hReady,
  input wire [5:0]data_gain,//<=====
  input wire [7:0]data_offset,//<=====
  input wire [7:0]data_msb, 
  input wire [7:0]data_lsb,

  // Config
  input wire CR_IN,//<== перед открытием затвора и началом накопления заряда разряжаем матрицу импульсом CR
  input wire power_MAX618,//<== подача питания на MAX618(reg1[1]) 
  input wire integration, //<== накопление пикселей(reg1[2])
  input wire transport,   //<== перенос заряда в хост(reg1[3])
  // CCD
  output wire PWRTGDRW_MAX618,//LOC = P190;//УПРАВЛЕНИЕ ПИТАНИЕМ MAX618
  output wire V_DRIVE11,      //LOC = P164;//УПРАВЛЕНИЕ ПИТАНИЕМ 1 включить 11 вольт
  output wire PWRTGDRW,       //LOC = P189;//УПРАВЛЕНИЕ ПИТАНИЕМ 2 SN74LVC1T45
  output wire TD_WTHLVL,      //LOC = P102;//ИМПУЛЬСЫ УПРАВЛЕНИЯ EL7156 off-11V, on-8V

//======================CCD DALSA FTF5066C
  output wire CR,     //LOC = P103;
 
  output reg TGZ, //LOC = P100; 
  output reg TGY, //LOC = P96; 
  output reg TGX, //LOC = P80;
  output reg TGW, //LOC = P76; 
 
  output reg A1T, //LOC = P99;
  output reg A2T, //LOC = P93;
  output reg A3T, //LOC = P94;
  output reg A4T, //LOC = P97;

  output reg A1B, //LOC = P77;
  output reg A2B, //LOC = P90;
  output reg A3B, //LOC = P89;
  output reg A4B, //LOC = P78;
 
  output reg C1X, //LOC = P68; 
  output reg C2X, //LOC = P69;
  output reg C3X, //LOC = P65;
 
  output reg C1W, //LOC = P62; 
  output reg C2W, //LOC = P63; 
  output reg C3W, //LOC = P64;
 
  output reg SG,  //LOC = P74;   
  output reg RG,  //LOC = P75;

  // ADC
  output reg CDSCLK1,//фиксация уровня
  output reg CDSCLK2,//выборка
  output reg ADCCLK, //тактирование
  output reg REGWR,
  // out
  output reg frame,
  output reg header,
  output reg [7:0]header_data,
  output reg header_clock
);

reg  [7:0] buffer;
reg [12:0] pix;// кол-во пикселей в строке
reg [15:0] row;// кол-во строк в кадре
//reg [25:0]cr_; // Charge Reset (CR) pulse on VNS.

//============================================5
always @ (posedge clock)
begin if ( f2hReady )
  begin
    if (buffer == 5)
    begin
      // new tick
if (pix == 5149)// кол-во пикселей в строке 100+9+20+4+4992+4+20 = 5149
      begin
        if (row == 6703) // кол-во строк в кадре 6703
        begin
          // wait
          if (transport == 1'b1)
        begin
            row <= 0;
//cr_ <= 0;
          end 
        end else begin
          // new line
          pix <= 0;
          row <= row + 1;
          buffer <= 0;
        end
      end else begin
        // new pixel
        pix <= pix + 1;
  //cr_ <= cr_ + 1;//Charge Reset (CR) pulse on VNS
        buffer <= 0; 
      end
    end else begin
      buffer <= buffer + 1;
    end
  end
end

wire     SSC = !((pix > 0) && (pix <= 100)); // 0,688
wire SSC_ADC = !((pix > 0) && (pix <= 96));  // 0,684 пропускаем 4 такта ацп
wire SSC_CCD = !((pix > 0) && (pix <= 100)); // 0,688

//импульсы вертикального переноса заряда 1552 Гц
//при накоплении выставляем 8 вольт, а при переносе пульсируем  - с ампл. 11 вольт
wire TG_A1 = integration ? 1'b0 : transport ?   (pix >= 30) && (pix <= 80) : 1'b0 ;  //188,501
wire    A2 = integration ? 1'b1 : transport ? !((pix >= 20) && (pix <= 50)): 1'b0 ;  //125,313
wire    A3 = integration ? 1'b1 : transport ? !((pix >= 40) && (pix <= 70)): 1'b0 ;  //250,438
wire    A4 = integration ? 1'b1 : transport ? !((pix >= 60) && (pix <= 90)): 1'b0 ;  //375,563

// CR <= !(cr_ >= 0 && cr_ <= 687);     //LOC = P103; Charge Reset (CR) pulse on VNS.
assign CR = CR_IN;                      //LOC = P103; Charge Reset (CR) pulse on VNS.
assign PWRTGDRW_MAX618 = !power_MAX618; //подача питания на драйверы MAX618 pin190

// при накоплении заряда устанавливаем 8 вольт, а при переносе 11 вольт.
assign V_DRIVE11 = integration ;        //8V - накопление заряда, 11V - вертикальный перенос pin164
assign TD_WTHLVL = integration ;//|| SSC; //переключатель напр.11/8 вольт на EL7156.  pin102
assign  PWRTGDRW =   transport ;        //подача питания на драйверы гориз.переноса pin189
 
//====================== CCD DALSA FTF5066C ===================================================
always @ (posedge clock) 
 begin
//================== ВЕРТИКАЛЬНЫЙ ПЕРЕНОС 1552 Гц ==============================================
   TGZ <= TG_A1;                                    //LOC = P100;Image Clock Transfer Gate(Phase 1)
   TGY <= TG_A1;                                    //LOC = P96;
   TGX <= TG_A1;                                    //LOC = P80;   
   TGW <= TG_A1;                                    //LOC = P76;   
//TOP
   A1T <= TG_A1;                                    //LOC = P99; Image Clock (Phase 1)
   A2T <= A2;                                       //LOC = P93; Image Clock (Phase 2)
   A3T <= A3;                                       //LOC = P94; Image Clock (Phase 3)
   A4T <= A4;                                       //LOC = P97; Image Clock (Phase 4)
//BOT
   A1B <= TG_A1;                                    //LOC = P77; Image Clock (Phase 1)
   A2B <= A2;                                       //LOC = P90; Image Clock (Phase 2)
   A3B <= A3;                                       //LOC = P89; Image Clock (Phase 3)
   A4B <= A4;                                       //LOC = P78; Image Clock (Phase 4)

///================== ГОРИЗОНТАЛЬНЫЙ ПЕРЕНОС 8 МГц  ============================================
    RG <= (buffer == 0) && SSC_CCD;    //LOC = P75; Reset Gate
    SG <=  buffer  < 3 && SSC_CCD;                    //LOC = P74; Summing Gate
  //LEFT (SINGLE OUTPUT Left C1 C2 C3) //RIGHT (SINGLE OUTPUT Right C2 C1 C3)
   C1W <=   !((buffer < 2 || buffer > 4 ) && SSC_CCD);//LOC = P62; Register Clock (Phase 1)
   C2W <= !(!( buffer < 1 || buffer > 3 ) && SSC_CCD);//LOC = P63; Register Clock (Phase 2)   
   C3W <=      buffer < 3 && SSC_CCD;                 //LOC = P64; Register Clock (Phase 3)
 
   C1X <=  !((buffer < 2 || buffer > 4 ) && SSC_CCD); //LOC = P68; Register Clock (Phase 1)
   C2X <= !(!(buffer < 1 || buffer > 3 ) && SSC_CCD); //LOC = P69; Register Clock (Phase 2)   
   C3X <=     buffer < 3 && SSC_CCD;                  //LOC = P65; Register Clock (Phase 3)

///===============================================================================================
             frame <= SSC; //SSC
header_clock <= buffer == 0 && pix >= 91 && pix <= 100;
            header <= pix >= 91  && pix <= 100; //8 бит заголовка строки
///===============================================================================================      
  case (pix)
            91: header_data <= 8'h01;                    //01 заголовок маркера
            92: header_data <= 8'h02;                    //02 заголовок маркера
         93: header_data <= row[15:8];                //ст.байт номер строки
         94: header_data <= row[7:0];                 //мл.байт номер строки
         95: header_data <= data_msb[7:0];            //ст.байт Т.Пельтье
            96: header_data <= data_lsb[7:0];            //мл.байт Т.Пельтье
            97: header_data <= data_gain[5:0];           //усиление АЦП
            98: header_data <= data_offset[7:0];         //смещение АЦП
     default: header_data <= 8'h00;
  endcase
///===== тактирование ацп. HB,LB 16 bit ==============================================
      case (buffer)     1:
                     CDSCLK1 <= SSC_ADC;    //==> импульс фиксации
                  default: CDSCLK1 <= 1'b0;
      endcase
      case (buffer)   3,4:
                     CDSCLK2 <= SSC_ADC;  //==> импульс выборки
                  default: CDSCLK2 <= 1'b0;
      endcase
      case (buffer) 4,5,0:
                     ADCCLK <= SSC_ADC; //==> меандр такт ацп
                  default: ADCCLK <= 1'b0;
      endcase

  end
 ///================================================================================= 
always @ (negedge clock) // по спаду тактового импульса
 begin
      case (buffer)  2,5: //удвоенная частота  //==> такт записи данных в FX2
        REGWR <= SSC_ADC;           
        default: REGWR <= 1'b0;
     endcase  
end
///=================================================================================
 
initial
       begin
           buffer = 5;
              pix = 5149;//
              row = 6703;
//cr_ = 0;
   end

endmodule
« Последнее редактирование: 13 Дек 2015 [18:51:14] от Andreichk »

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #507 : 13 Дек 2015 [18:45:23] »
корректуру байера я в сишном коде так замутил. не знаю, насколько это грамотно, но работает

offset_raw = offset_raw_2;
//================================= поиск начала кадра ======================================================
back:
for(p = 0; p <= ccd; p++) { 
              if(ccd_buf[p] == 0x01) {                                                             //ищем первый байт заголовка строки
    if(ccd_buf[p+1] == 0x02) {                                             //ищем второй байт заголовка строки
                                   if(ccd_buf[(p+2)] = 0x00) {                                     //ищем ст.байт номера строки
   if(ccd_buf[(p+3)] = 0x01) {                             //ищем мл.байт номера строки
                           anf_kadr++;  break;     //если нашли, то выпрыгиваем
                             } else {line=0; goto back;}   //иначе возвращаемся к нач.поиска
                             }
                         }
                        }
                               }
//============== переписывание буфера ===============================================
for(p = anf_kadr; p <= ccd; p++) { 
              if(ccd_buf[p] == 0x01) {
    if(ccd_buf[p+1] == 0x02) {
                  if(ccd_buf[(p+8)] != 0x00) { //если кривая строка - сдвигаем байер,иначе пропускаем и наслаждаемся красивой картинкой
                     offset_raw_2 = offset_raw;
   offset_raw +=4;
                             }
                           else memmove(&buf_out[pixel * line++], &ccd_buf[p + offset_raw], pixel);//
                             }
                                 }
                         }
//==========================================================================================================================
    fwrite(buf_out, sizeof(unsigned char), write_raw, fp);        //записываем данные в файл. последовательная запись
    flSleep(pause_time);                                          //задаём время паузы между экспозициями
    fclose(fp);                                                   //закрываем созданный файл
    next_file=1;                                                  //разрешаем преобразование raw2tiff.exe
//==========================================================================================================================

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #508 : 13 Дек 2015 [18:52:18] »
вот тот же код, но для 4 МГц, тут уже манёвры от 0 до 11 тактов
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Description: Time generator 4 MHz for DALSA CCD FTF5066C
//reg1[1] byte=0x02;//подача питания на MAX618
//reg1[2] byte=0x04;//управление накоплением заряда
//reg1[3] byte=0x08;//управление экспозицией
//////////////////////////////////////////////////////////////////////////////////
module FTF5066C_4 /*#(parameter BASE = 0)*/(
  // Clock
  input wire clock,
  input wire f2hReady,
  input wire [5:0]data_gain,//<=====
  input wire [7:0]data_offset,//<=====
  input wire [7:0]data_msb, 
  input wire [7:0]data_lsb,

  // Config
  input wire CR_IN,//<== перед открытием затвора и началом накопления заряда разряжаем матрицу импульсом CR
  input wire power_MAX618,//<== подача питания на MAX618(reg1[1]) 
  input wire integration, //<== накопление пикселей(reg1[2])
  input wire transport,   //<== перенос заряда в хост(reg1[3])
  // CCD
  output wire PWRTGDRW_MAX618,//LOC = P190;//УПРАВЛЕНИЕ ПИТАНИЕМ MAX618
  output wire V_DRIVE11,      //LOC = P164;//УПРАВЛЕНИЕ ПИТАНИЕМ 1 включить 11 вольт
  output wire PWRTGDRW,       //LOC = P189;//УПРАВЛЕНИЕ ПИТАНИЕМ 2 SN74LVC1T45
  output wire TD_WTHLVL,      //LOC = P102;//ИМПУЛЬСЫ УПРАВЛЕНИЯ EL7156 off-11V, on-8V

//======================CCD DALSA FTF5066C
  output wire CR,     //LOC = P103;
 
  output reg TGZ, //LOC = P100; 
  output reg TGY, //LOC = P96; 
  output reg TGX, //LOC = P80;
  output reg TGW, //LOC = P76; 
 
  output reg A1T, //LOC = P99;
  output reg A2T, //LOC = P93;
  output reg A3T, //LOC = P94;
  output reg A4T, //LOC = P97;

  output reg A1B, //LOC = P77;
  output reg A2B, //LOC = P90;
  output reg A3B, //LOC = P89;
  output reg A4B, //LOC = P78;
 
  output reg C1X, //LOC = P68; 
  output reg C2X, //LOC = P69;
  output reg C3X, //LOC = P65;
 
  output reg C1W, //LOC = P62; 
  output reg C2W, //LOC = P63; 
  output reg C3W, //LOC = P64;
 
  output reg SG,  //LOC = P74;   
  output reg RG,  //LOC = P75;

  // ADC
  output reg CDSCLK1,//фиксация уровня
  output reg CDSCLK2,//выборка
  output reg ADCCLK, //тактирование
  output reg REGWR,
  // out
  output reg frame,
  output reg header,
  output reg [7:0]header_data,
  output reg header_clock
);

reg  [7:0] buffer;
reg [12:0] pix;// кол-во пикселей в строке
reg [15:0] row;// кол-во строк в кадре
//reg [25:0]cr_; // Charge Reset (CR) pulse on VNS.

//=======================================11
always @ (posedge clock)
begin if ( f2hReady )
  begin
    if (buffer == 11)
    begin
      // new tick
if (pix == 5149)// кол-во пикселей в строке 100+9+20+4+4992+4+20 = 5149
      begin
        if (row == 6703) // кол-во строк в кадре 6703
        begin
          // wait
          if (transport == 1'b1)
        begin
            row <= 0;
//cr_ <= 0;
          end 
        end else begin
          // new line
          pix <= 0;
          row <= row + 1;
          buffer <= 0;
        end
      end else begin
        // new pixel
        pix <= pix + 1;
  //cr_ <= cr_ + 1;//Charge Reset (CR) pulse on VNS
        buffer <= 0; 
      end
    end else begin
      buffer <= buffer + 1;
    end
  end
end

wire     SSC = !((pix > 0) && (pix <= 100)); // 0,688
wire SSC_ADC = !((pix > 0) && (pix <= 96));  // 0,684 пропускаем 4 такта ацп
wire SSC_CCD = !((pix > 0) && (pix <= 100)); // 0,688

//импульсы вертикального переноса заряда 776 Гц
//при накоплении выставляем 8 вольт, а при переносе пульсируем  - с ампл. 11 вольт
wire TG_A1 = integration ? 1'b0 : transport ?   (pix >= 30) && (pix <= 80) : 1'b0 ;  //188,501
wire    A2 = integration ? 1'b1 : transport ? !((pix >= 20) && (pix <= 50)): 1'b0 ;  //125,313
wire    A3 = integration ? 1'b1 : transport ? !((pix >= 40) && (pix <= 70)): 1'b0 ;  //250,438
wire    A4 = integration ? 1'b1 : transport ? !((pix >= 60) && (pix <= 90)): 1'b0 ;  //375,563

// CR <= !(cr_ >= 0 && cr_ <= 687);     //LOC = P103; Charge Reset (CR) pulse on VNS.
assign CR = CR_IN;                      //LOC = P103; Charge Reset (CR) pulse on VNS.
assign PWRTGDRW_MAX618 = !power_MAX618; //подача питания на драйверы MAX618 pin190

// при накоплении заряда устанавливаем 8 вольт, а при переносе 11 вольт.
assign V_DRIVE11 = integration ;        //8V - накопление заряда, 11V - вертикальный перенос pin164
assign TD_WTHLVL = integration || SSC; //переключатель напр.11/8 вольт на EL7156.  pin102
assign  PWRTGDRW =   transport ;        //подача питания на драйверы гориз.переноса pin189
 
//====================== CCD DALSA FTF5066C ===================================================
always @ (posedge clock)  // по фронту тактового импульса
 begin
//================== ВЕРТИКАЛЬНЫЙ ПЕРЕНОС 776 Гц ==============================================
   TGZ <= TG_A1;                                     //LOC = P100;Image Clock Transfer Gate(Phase 1)
   TGY <= TG_A1;                                     //LOC = P96;
   TGX <= TG_A1;                                     //LOC = P80;   
   TGW <= TG_A1;                                     //LOC = P76;   
//TOP
   A1T <= TG_A1;                                     //LOC = P99; Image Clock (Phase 1)
   A2T <= A2;                                        //LOC = P93; Image Clock (Phase 2)
   A3T <= A3;                                        //LOC = P94; Image Clock (Phase 3)
   A4T <= A4;                                        //LOC = P97; Image Clock (Phase 4)
//BOT
   A1B <= TG_A1;                                     //LOC = P77; Image Clock (Phase 1)
   A2B <= A2;                                        //LOC = P90; Image Clock (Phase 2)
   A3B <= A3;                                        //LOC = P89; Image Clock (Phase 3)
   A4B <= A4;                                        //LOC = P78; Image Clock (Phase 4)

///================== ГОРИЗОНТАЛЬНЫЙ ПЕРЕНОС 4 МГц  ============================================
    RG <= buffer == 0 && SSC_CCD;                     //LOC = P75; Reset Gate
    SG <=  buffer < 6 && SSC_CCD;                     //LOC = P74; Summing Gate
  //LEFT (SINGLE OUTPUT Left C1 C2 C3) //RIGHT (SINGLE OUTPUT Right C2 C1 C3)
   C1W <=   !((buffer < 4 || buffer > 9 ) && SSC_CCD);//LOC = P62; Register Clock (Phase 1)
   C2W <= !(!( buffer < 2 || buffer > 7 ) && SSC_CCD);//LOC = P63; Register Clock (Phase 2)   
   C3W <=      buffer < 6 && SSC_CCD;                 //LOC = P64; Register Clock (Phase 3)
 
   C1X <=  !((buffer < 4 || buffer > 9 ) && SSC_CCD); //LOC = P68; Register Clock (Phase 1)
   C2X <= !(!(buffer < 2 || buffer > 7 ) && SSC_CCD); //LOC = P69; Register Clock (Phase 2)   
   C3X <=     buffer < 6 && SSC_CCD;                  //LOC = P65; Register Clock (Phase 3)

///===============================================================================================
             frame <= SSC; //SSC
header_clock <= buffer == 0 && pix >= 91 && pix <= 100;
            header <= pix >= 91  && pix <= 100; //8 бит заголовка строки
///===============================================================================================      
  case (pix)
            91: header_data <= 8'h01;                    //01 заголовок маркера
            92: header_data <= 8'h02;                    //02 заголовок маркера
         93: header_data <= row[15:8];                //ст.байт номер строки
         94: header_data <= row[7:0];                 //мл.байт номер строки
         95: header_data <= data_msb[7:0];            //ст.байт Т.Пельтье
            96: header_data <= data_lsb[7:0];            //мл.байт Т.Пельтье
            97: header_data <= data_gain[5:0];           //усиление АЦП
            98: header_data <= data_offset[7:0];         //смещение АЦП
    default: header_data <= 8'h00;
 endcase
///===== тактирование ацп. HB,LB 16 bit =====================================================
     case (buffer)    2: CDSCLK1 <= SSC_ADC; //==> импульс фиксации уровня чёрного
           default: CDSCLK1 <= 1'b0;
     endcase

     case (buffer)  7,8: CDSCLK2 <= SSC_ADC; //==> импульс выборки значения яркости пикселя
           default: CDSCLK2 <= 1'b0;
     endcase

     case (buffer) 0,1,8,9,10,11:            //==> меандр, такт АЦП
                    ADCCLK <= SSC_ADC;
           default: ADCCLK <= 1'b0;
     endcase
end
///=================================================================================
always @ (negedge clock) // по спаду тактового импульса
begin
     case (buffer) 5,11:  //удвоенная частота  //==> такт записи данных в FX2
  REGWR <= SSC_ADC;           
  default: REGWR <= 1'b0;
     endcase  
end
///=================================================================================

 initial
       begin
           buffer = 11;
              pix = 5149;//
              row = 6703;
//cr_ = 0;
   end

endmodule

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #509 : 13 Дек 2015 [18:54:24] »
 вот для 2 МГц, такты от 0 до 23

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Description: Time generator 2 MHz for DALSA CCD FTF5066C
//reg1[1] byte=0x02;//подача питания на MAX618
//reg1[2] byte=0x04;//управление накоплением заряда
//reg1[3] byte=0x08;//управление экспозицией
//////////////////////////////////////////////////////////////////////////////////
module FTF5066C_2 /*#(parameter BASE = 0)*/(
  // Clock
  input wire clock,
  input wire f2hReady,
  input wire [5:0]data_gain,//<=====
  input wire [7:0]data_offset,//<=====
  input wire [7:0]data_msb, 
  input wire [7:0]data_lsb,

  // Config
  input wire CR_IN,//<== перед открытием затвора и началом накопления заряда разряжаем матрицу импульсом CR
  input wire power_MAX618,//<== подача питания на MAX618(reg1[1]) 
  input wire integration, //<== накопление пикселей(reg1[2])
  input wire transport,   //<== перенос заряда в хост(reg1[3])
  // CCD
  output wire PWRTGDRW_MAX618,//LOC = P190;//УПРАВЛЕНИЕ ПИТАНИЕМ MAX618
  output wire V_DRIVE11,      //LOC = P164;//УПРАВЛЕНИЕ ПИТАНИЕМ 1 включить 11 вольт
  output wire PWRTGDRW,       //LOC = P189;//УПРАВЛЕНИЕ ПИТАНИЕМ 2 SN74LVC1T45
  output wire TD_WTHLVL,      //LOC = P102;//ИМПУЛЬСЫ УПРАВЛЕНИЯ EL7156 off-11V, on-8V

//======================CCD DALSA FTF5066C
  output wire CR,     //LOC = P103;
 
  output reg TGZ, //LOC = P100; 
  output reg TGY, //LOC = P96; 
  output reg TGX, //LOC = P80;
  output reg TGW, //LOC = P76; 
 
  output reg A1T, //LOC = P99;
  output reg A2T, //LOC = P93;
  output reg A3T, //LOC = P94;
  output reg A4T, //LOC = P97;

  output reg A1B, //LOC = P77;
  output reg A2B, //LOC = P90;
  output reg A3B, //LOC = P89;
  output reg A4B, //LOC = P78;
 
  output reg C1X, //LOC = P68; 
  output reg C2X, //LOC = P69;
  output reg C3X, //LOC = P65;
 
  output reg C1W, //LOC = P62; 
  output reg C2W, //LOC = P63; 
  output reg C3W, //LOC = P64;
 
  output reg SG,  //LOC = P74;   
  output reg RG,  //LOC = P75;

  // ADC
  output reg CDSCLK1,//фиксация уровня
  output reg CDSCLK2,//выборка
  output reg ADCCLK, //тактирование
  output reg REGWR,
  // out
  output reg frame,
  output reg header,
  output reg [7:0]header_data,
  output reg header_clock
);

reg  [7:0] buffer;
reg [12:0] pix;// кол-во пикселей в строке
reg [15:0] row;// кол-во строк в кадре
//reg [25:0]cr_; // Charge Reset (CR) pulse on VNS.

always @ (posedge clock)
begin if ( f2hReady )
  begin
    if (buffer == 23)
    begin
      // new tick
if (pix == 5149)// кол-во пикселей в строке 100+9+20+4+4992+4+20 = 5149
      begin
        if (row == 6703) // кол-во строк в кадре 6703
        begin
          // wait
          if (transport == 1'b1)
        begin
            row <= 0;
//cr_ <= 0;
          end 
        end else begin
          // new line
          pix <= 0;
          row <= row + 1;
          buffer <= 0;
        end
      end else begin
        // new pixel
        pix <= pix + 1;
  //cr_ <= cr_ + 1;//Charge Reset (CR) pulse on VNS
        buffer <= 0; 
      end
    end else begin
      buffer <= buffer + 1;
    end
  end
end

wire     SSC = !((pix > 0) && (pix <= 100)); // 0,688
wire SSC_ADC = !((pix > 0) && (pix <= 96));  // 0,684 пропускаем 4 такта ацп
wire SSC_CCD = !((pix > 0) && (pix <= 100)); // 0,688

//импульсы вертикального переноса заряда 388 Гц
//при накоплении выставляем 8 вольт, а при переносе пульсируем  - с ампл. 11 вольт
wire TG_A1 = integration ? 1'b0 : transport ?   (pix >= 30) && (pix <= 80) : 1'b0 ;  //188,501
wire    A2 = integration ? 1'b1 : transport ? !((pix >= 20) && (pix <= 50)): 1'b0 ;  //125,313
wire    A3 = integration ? 1'b1 : transport ? !((pix >= 40) && (pix <= 70)): 1'b0 ;  //250,438
wire    A4 = integration ? 1'b1 : transport ? !((pix >= 60) && (pix <= 90)): 1'b0 ;  //375,563

// CR <= !(cr_ >= 0 && cr_ <= 687);     //LOC = P103; Charge Reset (CR) pulse on VNS.
assign CR = CR_IN;                      //LOC = P103; Charge Reset (CR) pulse on VNS.
assign PWRTGDRW_MAX618 = !power_MAX618; //подача питания на драйверы MAX618 pin190

// при накоплении заряда устанавливаем 8 вольт, а при переносе 11 вольт.
assign V_DRIVE11 = integration ;        //8V - накопление заряда, 11V - вертикальный перенос pin164
assign TD_WTHLVL = integration ;//|| SSC; //переключатель напр.11/8 вольт на EL7156.  pin102
assign  PWRTGDRW =   transport ;        //подача питания на драйверы гориз.переноса pin189
 
//====================== CCD DALSA FTF5066C ===================================================
always @ (posedge clock) 
 begin
//================== ВЕРТИКАЛЬНЫЙ ПЕРЕНОС 348 Гц ==============================================
   TGZ <= TG_A1;                                     //LOC = P100;Image Clock Transfer Gate(Phase 1)
   TGY <= TG_A1;                                     //LOC = P96;
   TGX <= TG_A1;                                     //LOC = P80;   
   TGW <= TG_A1;                                     //LOC = P76;   
//TOP
   A1T <= TG_A1;                                     //LOC = P99; Image Clock (Phase 1)
   A2T <= A2;                                        //LOC = P93; Image Clock (Phase 2)
   A3T <= A3;                                        //LOC = P94; Image Clock (Phase 3)
   A4T <= A4;                                        //LOC = P97; Image Clock (Phase 4)
//BOT
   A1B <= TG_A1;                                     //LOC = P77; Image Clock (Phase 1)
   A2B <= A2;                                        //LOC = P90; Image Clock (Phase 2)
   A3B <= A3;                                        //LOC = P89; Image Clock (Phase 3)
   A4B <= A4;                                        //LOC = P78; Image Clock (Phase 4)

///================== ГОРИЗОНТАЛЬНЫЙ ПЕРЕНОС 2 МГц  ============================================
    RG <= buffer ==  0 && SSC_CCD;                   //LOC = P75; Reset Gate
    SG <= buffer  < 12 && SSC_CCD;                   //LOC = P74; Summing Gate
  //LEFT (SINGLE OUTPUT Left C1 C2 C3) //RIGHT (SINGLE OUTPUT Right C2 C1 C3)
   C1W <=  !((buffer <  8 || buffer > 19) && SSC_CCD);//LOC = P62; Register Clock (Phase 1)
   C2W <= !(!(buffer <  4 || buffer > 15) && SSC_CCD);//LOC = P63; Register Clock (Phase 2)   
   C3W <=     buffer < 12 && SSC_CCD;                 //LOC = P64; Register Clock (Phase 3)
 
   C1X <=  !((buffer <  8 || buffer > 19) && SSC_CCD);//LOC = P68; Register Clock (Phase 1)
   C2X <= !(!(buffer <  4 || buffer > 15) && SSC_CCD);//LOC = P69; Register Clock (Phase 2)   
   C3X <=     buffer < 12 && SSC_CCD;                 //LOC = P65; Register Clock (Phase 3)

///===============================================================================================
             frame <= SSC; //SSC
header_clock <= buffer == 0 && pix >= 91 && pix <= 100;
            header <= pix >= 91  && pix <= 100; //8 бит заголовка строки
///===============================================================================================      
  case (pix)
            91: header_data <= 8'h01;                    //01 заголовок маркера
            92: header_data <= 8'h02;                    //02 заголовок маркера
         93: header_data <= row[15:8];                //ст.байт номер строки
         94: header_data <= row[7:0];                 //мл.байт номер строки
         95: header_data <= data_msb[7:0];            //ст.байт Т.Пельтье
            96: header_data <= data_lsb[7:0];            //мл.байт Т.Пельтье
            97: header_data <= data_gain[5:0];           //усиление АЦП
            98: header_data <= data_offset[7:0];         //смещение АЦП
     default: header_data <= 8'h00;
 endcase  
  ///===== тактирование ацп.HB,LB 16 bit ===========================================
        case (buffer)     7:
                       CDSCLK1 <= SSC_ADC;   //==> импульс фиксации
                    default: CDSCLK1 <= 1'b0;
        endcase
        case (buffer) 18,19:
                       CDSCLK2 <= SSC_ADC;   //==> импульс выборки
                    default: CDSCLK2 <= 1'b0;
        endcase
        case (buffer) 19,20,21,22,23,0,1,2,3,4,5,6: //меандр takt АЦП
                             ADCCLK <= SSC_ADC;   
                    default: ADCCLK <= 1'b0;
        endcase
end
///=================================================================================
always @ (negedge clock) // по спаду тактового импульса
 begin
        case (buffer) 11,22:  //удвоенная частота  //==> такт записи данных в FX2
           REGWR <= SSC_ADC;           
           default: REGWR <= 1'b0;
     endcase  
end
///=================================================================================

initial
       begin
           buffer = 23;
              pix = 5149;//
              row = 6703;
//cr_ = 0;
   end

endmodule

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #510 : 13 Дек 2015 [18:55:18] »
и наконец для 1 МГц, такты от 0 до 47

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Description: Time generator 1 MHz for DALSA CCD FTF5066C
//reg1[1] byte=0x02;//подача питания на MAX618
//reg1[2] byte=0x04;//управление накоплением заряда
//reg1[3] byte=0x08;//управление экспозицией
//////////////////////////////////////////////////////////////////////////////////
module FTF5066C_1 /*#(parameter BASE = 0)*/(
  // Clock
  input wire clock,
  input wire f2hReady,
  input wire [5:0]data_gain,//<=====
  input wire [7:0]data_offset,//<=====
  input wire [7:0]data_msb, 
  input wire [7:0]data_lsb,

  // Config
  input wire CR_IN,//<== перед открытием затвора и началом накопления заряда разряжаем матрицу импульсом CR
  input wire power_MAX618,//<== подача питания на MAX618(reg1[1]) 
  input wire integration, //<== накопление пикселей(reg1[2])
  input wire transport,   //<== перенос заряда в хост(reg1[3])
  // CCD
  output wire PWRTGDRW_MAX618,//LOC = P190;//УПРАВЛЕНИЕ ПИТАНИЕМ MAX618
  output wire V_DRIVE11,      //LOC = P164;//УПРАВЛЕНИЕ ПИТАНИЕМ 1 включить 11 вольт
  output wire PWRTGDRW,       //LOC = P189;//УПРАВЛЕНИЕ ПИТАНИЕМ 2 SN74LVC1T45
  output wire TD_WTHLVL,      //LOC = P102;//ИМПУЛЬСЫ УПРАВЛЕНИЯ EL7156 off-11V, on-8V

//======================CCD DALSA FTF5066C
  output wire CR,     //LOC = P103;
 
  output reg TGZ, //LOC = P100; 
  output reg TGY, //LOC = P96; 
  output reg TGX, //LOC = P80;
  output reg TGW, //LOC = P76; 
 
  output reg A1T, //LOC = P99;
  output reg A2T, //LOC = P93;
  output reg A3T, //LOC = P94;
  output reg A4T, //LOC = P97;

  output reg A1B, //LOC = P77;
  output reg A2B, //LOC = P90;
  output reg A3B, //LOC = P89;
  output reg A4B, //LOC = P78;
 
  output reg C1X, //LOC = P68; 
  output reg C2X, //LOC = P69;
  output reg C3X, //LOC = P65;
 
  output reg C1W, //LOC = P62; 
  output reg C2W, //LOC = P63; 
  output reg C3W, //LOC = P64;
 
  output reg SG,  //LOC = P74;   
  output reg RG,  //LOC = P75;

  // ADC
  output reg CDSCLK1,//фиксация уровня
  output reg CDSCLK2,//выборка
  output reg ADCCLK, //тактирование
  output reg REGWR,
  // out
  output reg frame,
  output reg header,
  output reg [7:0]header_data,
  output reg header_clock
);

reg  [7:0] buffer;
reg [12:0] pix;// кол-во пикселей в строке
reg [15:0] row;// кол-во строк в кадре
//reg [25:0]cr_; // Charge Reset (CR) pulse on VNS.

always @ (posedge clock)
begin if ( f2hReady )
  begin
    if (buffer == 47)
    begin
      // new tick
if (pix == 5149)// кол-во пикселей в строке 100+9+20+4+4992+4+20 = 5149
      begin
        if (row == 6703) // кол-во строк в кадре 6703
        begin
          // wait
          if (transport == 1'b1)
        begin
            row <= 0;
//cr_ <= 0;
          end 
        end else begin
          // new line
          pix <= 0;
          row <= row + 1;
          buffer <= 0;
        end
      end else begin
        // new pixel
        pix <= pix + 1;
  //cr_ <= cr_ + 1;//Charge Reset (CR) pulse on VNS
        buffer <= 0; 
      end
    end else begin
      buffer <= buffer + 1;
    end
  end
end

wire       SSC = !((pix > 0) && (pix <= 100)); // 0,688
wire   SSC_ADC = !((pix > 0) && (pix <= 96));  // 0,684 пропускаем 4 такта ацп
wire   SSC_CCD = !((pix > 0) && (pix <= 100)); // 0,688

//импульсы вертикального переноса заряда 776 Гц
//при накоплении выставляем 8 вольт, а при переносе пульсируем  - с ампл. 11 вольт
wire TG_A1 = integration ? 1'b0 : transport ?   (pix >= 30) && (pix <= 80) : 1'b0 ;  //188,501
wire    A2 = integration ? 1'b1 : transport ? !((pix >= 20) && (pix <= 50)): 1'b0 ;  //125,313
wire    A3 = integration ? 1'b1 : transport ? !((pix >= 40) && (pix <= 70)): 1'b0 ;  //250,438
wire    A4 = integration ? 1'b1 : transport ? !((pix >= 60) && (pix <= 90)): 1'b0 ;  //375,563

// CR <= !(cr_ >= 0 && cr_ <= 687);     //LOC = P103; Charge Reset (CR) pulse on VNS.
assign CR = CR_IN;                      //LOC = P103; Charge Reset (CR) pulse on VNS.
assign PWRTGDRW_MAX618 = !power_MAX618; //подача питания на драйверы MAX618 pin190

// при накоплении заряда устанавливаем 8 вольт, а при переносе 11 вольт.
assign V_DRIVE11 = integration ;        //8V - накопление заряда, 11V - вертикальный перенос pin164
assign TD_WTHLVL = integration ;//|| SSC; //переключатель напр.11/8 вольт на EL7156.  pin102
assign  PWRTGDRW =   transport ;        //подача питания на драйверы гориз.переноса pin189
 
//====================== CCD DALSA FTF5066C ===================================================
always @ (posedge clock)
 begin
//================== ВЕРТИКАЛЬНЫЙ ПЕРЕНОС 50 кГц ==============================================
   TGZ <= TG_A1;                                     //LOC = P100;Image Clock Transfer Gate(Phase 1)
   TGY <= TG_A1;                                     //LOC = P96;
   TGX <= TG_A1;                                     //LOC = P80;   
   TGW <= TG_A1;                                     //LOC = P76;   
//TOP
   A1T <= TG_A1;                                     //LOC = P99; Image Clock (Phase 1)
   A2T <= A2;                                        //LOC = P93; Image Clock (Phase 2)
   A3T <= A3;                                        //LOC = P94; Image Clock (Phase 3)
   A4T <= A4;                                        //LOC = P97; Image Clock (Phase 4)
//BOT
   A1B <= TG_A1;                                     //LOC = P77; Image Clock (Phase 1)
   A2B <= A2;                                        //LOC = P90; Image Clock (Phase 2)
   A3B <= A3;                                        //LOC = P89; Image Clock (Phase 3)
   A4B <= A4;                                        //LOC = P78; Image Clock (Phase 4)

///================== ГОРИЗОНТАЛЬНЫЙ ПЕРЕНОС 25МГц  ============================================
    RG <= buffer ==  0 && SSC_CCD;                   //LOC = P75; Reset Gate
    SG <= buffer  < 24 && SSC_CCD;                   //LOC = P74; Summing Gate
  //LEFT (SINGLE OUTPUT Left C1 C2 C3) //RIGHT (SINGLE OUTPUT Right C2 C1 C3)
   C1W <=  !((buffer < 16 || buffer > 39) && SSC_CCD);//LOC = P62; Register Clock (Phase 1)
   C2W <= !(!(buffer <  8 || buffer > 31) && SSC_CCD);//LOC = P63; Register Clock (Phase 2)   
   C3W <=     buffer < 24 && SSC_CCD;                 //LOC = P64; Register Clock (Phase 3)
 
   C1X <=  !((buffer < 16 || buffer > 39) && SSC_CCD);//LOC = P68; Register Clock (Phase 1)
   C2X <= !(!(buffer <  8 || buffer > 31) && SSC_CCD);//LOC = P69; Register Clock (Phase 2)   
   C3X <=     buffer < 24 && SSC_CCD;                 //LOC = P65; Register Clock (Phase 3)

///===============================================================================================
             frame <= SSC; //SSC
header_clock <= buffer == 0 && pix >= 91 && pix <= 100;
            header <= pix >= 91  && pix <= 100; //8 бит заголовка строки
///===============================================================================================      
  case (pix)
            91: header_data <= 8'h01;                    //01 заголовок маркера
            92: header_data <= 8'h02;                    //02 заголовок маркера
         93: header_data <= row[15:8];                //ст.байт номер строки
         94: header_data <= row[7:0];                 //мл.байт номер строки
         95: header_data <= data_msb[7:0];            //ст.байт Т.Пельтье
            96: header_data <= data_lsb[7:0];            //мл.байт Т.Пельтье
            97: header_data <= data_gain[5:0];           //усиление АЦП
            98: header_data <= data_offset[7:0];         //смещение АЦП
    default: header_data <= 8'h00;
 endcase
///===== тактирование ацп. HB,LB 16 bit ============================================
   case (buffer)    16:
                     CDSCLK1 <= SSC_ADC; //==> импульс фиксации
               default: CDSCLK1 <= 1'b0;
   endcase
   case (buffer) 39,40:
                     CDSCLK2 <= SSC_ADC; //==> импульс выборки
               default: CDSCLK2 <= 1'b0;
   endcase
   case (buffer) 40,41,42,43,44,45,46,47,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15://меандр
            ADCCLK <= SSC_ADC; //==>  тактирование ацп
               default: ADCCLK <= 1'b0;
   endcase
///=================================================================================
end

always @ (negedge clock) // по спаду тактового импульса
 begin
   case (buffer) 22,46:  //удвоенная частота  //==> такт записи данных в FX2
      REGWR <= SSC_ADC;           
      default: REGWR <= 1'b0;
     endcase  
end
///=================================================================================

initial
       begin
           buffer = 47;
              pix = 5149;//
              row = 6703;
//cr_ = 0;
   end

endmodule

Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #511 : 13 Дек 2015 [19:13:07] »
По симуляции - первый импульс на строчных фазах (после начала фрейма) укорочен - это плохо, возможно "разбрызгивание зарядов". Если на одну из фаз пришел укороченный импульс (хотя бы один за всю строку) - заряды не успевают полностью перетечь в следующую стадию конвейера и частично выдавливаются в подложку, частично перетекают назад отн. движения конвейера, смешиваясь с зарядами соседних пикселей (одновременно во всей строке). Поэтому фазные импульсы должны быть достаточной длительности, с определенным, заданным в ДШ наклоном фронтов. Даже одна "иголка", проскочившая на строчной фазе приводит к порче всей строки.

P/S. Еще увидел, просто ПЦ какой-то...
Строчные фазы должны после вертикального сдвига "входить в ритм" строго последовательно, одна за другой. У Вас фронты на соседних строчных фазах меняются одновременно! Так ни в коем случае нельзя делать.
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #512 : 13 Дек 2015 [19:18:18] »
щас попробую поправить это После многочисленных попыток нифига не удалось. Смог только отодвинуть на один шаг назад. но при этом впереди образуется ещё один обрезанный импульс. Как его выпилить - не представляю даже.
На живой картинке это , правда, никак не отразилось - рисует и рисует, не лучше и не хуже. Если у кого есть идеи - делитесь. вот код:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Description: Time generator 8 MHz for DALSA CCD FTF5066C
//reg1[1] byte=0x02;//подача питания на MAX618
//reg1[2] byte=0x04;//управление накоплением заряда
//reg1[3] byte=0x08;//управление экспозицией
//////////////////////////////////////////////////////////////////////////////////
module FTF5066C_8 /*#(parameter BASE = 0)*/(
  // Clock
  input wire clock,
  input wire f2hReady,
  input wire [5:0]data_gain,//<=====
  input wire [7:0]data_offset,//<=====
  input wire [7:0]data_msb, 
  input wire [7:0]data_lsb,

  // Config
  input wire CR_IN,//<== перед открытием затвора и началом накопления заряда разряжаем матрицу импульсом CR
  input wire power_MAX618,//<== подача питания на MAX618(reg1[1]) 
  input wire integration, //<== накопление пикселей(reg1[2])
  input wire transport,   //<== перенос заряда в хост(reg1[3])
  // CCD
  output wire PWRTGDRW_MAX618,//LOC = P190;//УПРАВЛЕНИЕ ПИТАНИЕМ MAX618
  output wire V_DRIVE11,      //LOC = P164;//УПРАВЛЕНИЕ ПИТАНИЕМ 1 включить 11 вольт
  output wire PWRTGDRW,       //LOC = P189;//УПРАВЛЕНИЕ ПИТАНИЕМ 2 SN74LVC1T45
  output wire TD_WTHLVL,      //LOC = P102;//ИМПУЛЬСЫ УПРАВЛЕНИЯ EL7156 off-11V, on-8V

//======================CCD DALSA FTF5066C
  output wire CR,     //LOC = P103;
 
  output reg TGZ, //LOC = P100; 
  output reg TGY, //LOC = P96; 
  output reg TGX, //LOC = P80;
  output reg TGW, //LOC = P76; 
 
  output reg A1T, //LOC = P99;
  output reg A2T, //LOC = P93;
  output reg A3T, //LOC = P94;
  output reg A4T, //LOC = P97;

  output reg A1B, //LOC = P77;
  output reg A2B, //LOC = P90;
  output reg A3B, //LOC = P89;
  output reg A4B, //LOC = P78;
 
  output reg C1X, //LOC = P68; 
  output reg C2X, //LOC = P69;
  output reg C3X, //LOC = P65;
 
  output reg C1W, //LOC = P62; 
  output reg C2W, //LOC = P63; 
  output reg C3W, //LOC = P64;
 
  output reg SG,  //LOC = P74;   
  output reg RG,  //LOC = P75;

  // ADC
  output reg CDSCLK1,//фиксация уровня
  output reg CDSCLK2,//выборка
  output reg ADCCLK, //тактирование
  output reg REGWR,
  // out
  output reg frame,
  output reg header,
  output reg [7:0]header_data,
  output reg header_clock
);

reg  [7:0] buffer;
reg [12:0] pix;// кол-во пикселей в строке
reg [15:0] row;// кол-во строк в кадре

//============================================5
always @ (posedge clock)
begin if ( f2hReady )
  begin
    if (buffer == 5)
    begin
      // new tick
if (pix == 5149)// кол-во пикселей в строке 100+9+20+4+4992+4+20 = 5149
      begin
        if (row == 6703) // кол-во строк в кадре 6703
        begin
          // wait
          if (transport == 1'b1)
        begin
            row <= 0;
          end 
        end else begin
          // new line
          pix <= 0;
          row <= row + 1;
          buffer <= 0;
        end
      end else begin
        // new pixel
        pix <= pix + 1;
        buffer <= 0; 
      end
    end else begin
      buffer <= buffer + 1;
    end
  end
end

wire     SSC = !((pix > 0) && (pix <= 100)); // 0,100
wire SSC_ADC = !((pix > 0) && (pix <= 96));  // 0,96 пропускаем 4 такта ацп
wire SSC_CCD = !((pix > 0) && (pix <= 100)); // 0,100

//импульсы вертикального переноса заряда 1552 Гц
//при накоплении выставляем 8 вольт, а при переносе пульсируем  - с ампл. 11 вольт
wire TG_A1 = integration ? 1'b0 : transport ?   (pix >= 30) && (pix <= 80) : 1'b0 ;  //188,501
wire    A2 = integration ? 1'b1 : transport ? !((pix >= 20) && (pix <= 50)): 1'b0 ;  //125,313
wire    A3 = integration ? 1'b1 : transport ? !((pix >= 40) && (pix <= 70)): 1'b0 ;  //250,438
wire    A4 = integration ? 1'b1 : transport ? !((pix >= 60) && (pix <= 90)): 1'b0 ;  //375,563

// CR <= !(cr_ >= 0 && cr_ <= 687);     //LOC = P103; Charge Reset (CR) pulse on VNS.
assign CR = CR_IN;                      //LOC = P103; Charge Reset (CR) pulse on VNS.
assign PWRTGDRW_MAX618 = !power_MAX618; //подача питания на драйверы MAX618 pin190

// при накоплении заряда устанавливаем 8 вольт, а при переносе 11 вольт.
assign V_DRIVE11 = integration ;        //8V - накопление заряда, 11V - вертикальный перенос pin164
assign TD_WTHLVL = integration ;//|| SSC; //переключатель напр.11/8 вольт на EL7156.  pin102
assign  PWRTGDRW =   transport ;        //подача питания на драйверы гориз.переноса pin189
 
//====================== CCD DALSA FTF5066C ===================================================
always @ (posedge clock) 
 begin
//================== ВЕРТИКАЛЬНЫЙ ПЕРЕНОС 1552 Гц ==============================================
   TGZ <= TG_A1;                                    //LOC = P100;Image Clock Transfer Gate(Phase 1)
   TGY <= TG_A1;                                    //LOC = P96;
   TGX <= TG_A1;                                    //LOC = P80;   
   TGW <= TG_A1;                                    //LOC = P76;   
//TOP
   A1T <= TG_A1;                                    //LOC = P99; Image Clock (Phase 1)
   A2T <= A2;                                       //LOC = P93; Image Clock (Phase 2)
   A3T <= A3;                                       //LOC = P94; Image Clock (Phase 3)
   A4T <= A4;                                       //LOC = P97; Image Clock (Phase 4)
//BOT
   A1B <= TG_A1;                                    //LOC = P77; Image Clock (Phase 1)
   A2B <= A2;                                       //LOC = P90; Image Clock (Phase 2)
   A3B <= A3;                                       //LOC = P89; Image Clock (Phase 3)
   A4B <= A4;                                       //LOC = P78; Image Clock (Phase 4)

///================== ГОРИЗОНТАЛЬНЫЙ ПЕРЕНОС 8 МГц  ============================================
    RG <= (buffer == 0) && SSC_CCD;     //LOC = P75; Reset Gate

case(buffer) 0,1,2: SG <= SSC_CCD;  //LOC = P74; Summing Gate
            default: SG <= 1'b0;endcase

  //LEFT (SINGLE OUTPUT Left C1 C2 C3) //RIGHT (SINGLE OUTPUT Right C2 C1 C3)
   case(buffer) 0,1,5: C1W <= !SSC_CCD && pix<=99;//LOC = P62; Register Clock (Phase 1)
           default: C1W <= 1'b1;
endcase

case(buffer) 1,2,3: C2W <= !SSC_CCD;//LOC = P63; Register Clock (Phase 2)
           default: C2W <= 1'b1;
endcase
     
case(buffer) 0,1,2: C3W <= SSC_CCD; //LOC = P64; Register Clock (Phase 3)
           default: C3W <= 1'b0;
endcase

case(buffer) 0,1,5: C1X <= !SSC_CCD && pix<=99;//LOC = P68; Register Clock (Phase 1)
           default: C1X <= 1'b1;
endcase

case(buffer) 1,2,3: C2X <= !SSC_CCD; //LOC = P69; Register Clock (Phase 2)
           default: C2X <= 1'b1;
endcase
             
case(buffer) 0,1,2: C3X <= SSC_CCD;//LOC = P65; Register Clock (Phase 3)
           default: C3X <= 1'b0;
endcase
///===============================================================================================
             frame <= SSC; //SSC
header_clock <= buffer == 0 && pix >= 91 && pix <= 100;
            header <= pix >= 91  && pix <= 100; //8 бит заголовка строки
///===============================================================================================      
  case (pix)
            91: header_data <= 8'h01;                    //01 заголовок маркера
            92: header_data <= 8'h02;                    //02 заголовок маркера
         93: header_data <= row[15:8];                //ст.байт номер строки
         94: header_data <= row[7:0];                 //мл.байт номер строки
         95: header_data <= data_msb[7:0];            //ст.байт Т.Пельтье
            96: header_data <= data_lsb[7:0];            //мл.байт Т.Пельтье
            97: header_data <= data_gain[5:0];           //усиление АЦП
            98: header_data <= data_offset[7:0];         //смещение АЦП
     default: header_data <= 8'h00;
  endcase
///===== тактирование ацп. HB,LB 16 bit ==============================================
      case (buffer)     1:
                     CDSCLK1 <= SSC_ADC;    //==> импульс фиксации
                  default: CDSCLK1 <= 1'b0;
      endcase
      case (buffer)   3,4:
                     CDSCLK2 <= SSC_ADC;  //==> импульс выборки
                  default: CDSCLK2 <= 1'b0;
      endcase
      case (buffer) 4,5,0:
                     ADCCLK <= SSC_ADC; //==> меандр такт ацп
                  default: ADCCLK <= 1'b0;
      endcase

  end
 ///================================================================================= 
always @ (negedge clock) // по спаду тактового импульса
 begin
 
      case (buffer)  2,5: //удвоенная частота  //==> такт записи данных в FX2
        REGWR <= SSC_ADC;           
        default: REGWR <= 1'b0;
     endcase  
end
///=================================================================================
 
initial
       begin
           buffer = 5;
              pix = 5149;//
              row = 6703;  
   end

endmodule
« Последнее редактирование: 13 Дек 2015 [23:06:11] от Andreichk »

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #513 : 14 Дек 2015 [01:12:57] »
вот ещё вариант с такой строкой     
C1W <=   !((buffer < 2 || buffer > 4 ) && SSC_CCD) && pix != 100 ;//LOC = P62; Register Clock (Phase 1)

результат тот же, что и с предыдущей


Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #514 : 14 Дек 2015 [11:09:59] »
Пропустить через симулятор смогу вечером, на домашнем компе.
Пока интересуют такие моменты:
Сигналы frame/header - зачем нужны?
Если сигнал frame является разрешающим для передачи пиксельного потока в трансмиттер и дальше, то его фронт надо подвинуть влево на полпериода клока, чтобы он совпадал с пассивным фронтом клока. Иначе возникает неоднозначность - если фрейм сработал чуть раньше клока - 1й байт передается, если чуть позже - не передается. А фронты могут дрожать, из за чего будет то так, то сяк. Этот перескок потянет прицепом и чередование байт - старший/младший.
« Последнее редактирование: 14 Дек 2015 [11:21:08] от Дмитрий Бучинский »
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

andreichk

  • Гость
Re: 33 мегапикселя на ладони
« Ответ #515 : 14 Дек 2015 [11:27:47] »
Сигналы frame/header - зачем нужны?
frame как раз и служит границей для  импульсов гор. сдвига, но сдвинуть его на пол-периода ну никак не получаается, только на целый можно.хотя есть идея формировать его не по фронту клока, а по спаду. дома проверю.

header- для заголовка строки, он никак не влияет на положение импульсов гор. сдвига

придётся наверное выкладывать всю числовую последовательность попиксельно в диапазоне от 0 до 5149. это капец как коряво будет выглядеть :(

Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #516 : 14 Дек 2015 [11:57:05] »
frame как раз и служит границей для  импульсов гор. сдвига, но сдвинуть его на пол-периода ну никак не получаается, только на целый можно.хотя есть идея формировать его не по фронту клока, а по спаду. дома проверю.
Насколько я понимаю, _все_ разрешающие сигналы в синхронных схемах должны переключаться по пассивному фронту клока, чтобы к моменту активного фронта клока, разрешающий сигнал уже успел "открыть нужные двери".
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

Оффлайн Василий Вершинин

  • *****
  • Сообщений: 3 713
  • Благодарностей: 122
  • Per anus ad astra
    • Skype - vasiliy_vershinin
    • Сообщения от Василий Вершинин
Re: 33 мегапикселя на ладони
« Ответ #517 : 14 Дек 2015 [12:24:27] »
Сигнал сдвигать на полфазы нужно в том случае, если он выходит из плисы и по нему внешнее устройство захватывает данные. Для внутренних сигналов, если не используются всякие механизмы типа DDR оно нафиг не нужно. Синтезатор сам подберет оптимальные задержки для того чтобы все в нужный момент защелкнулось.

Оффлайн Дмитрий Бучинский

  • *****
  • Сообщений: 603
  • Благодарностей: 25
  • ex. damian_1
    • Сообщения от Дмитрий Бучинский
Re: 33 мегапикселя на ладони
« Ответ #518 : 14 Дек 2015 [13:08:11] »
Я бы не стал столь безоглядно доверять синтезатору. Одно дело, когда построение схемы не допускает никаких неоднозначностей в сигналах, и другое - когда в схеме явно возможны гонки фронтов, и синтезатор "должен" это все правильно понять и разрулить...
SW2001, самодельный USB мотофокус, MPCC, колесо DS 2", EOS 350Da, QHY8L @ NEQ6ST eqmod. Гид - кинопроекционник КО-140М ( 140/1.8 ) + DSI-Pro.
Доп: разные телевики + самодельное колесо фильтров с USB + QHY6.
Darkbox - термометр/термостат + пельтье холодильник для съемки правильных дарков.

Оффлайн Василий Вершинин

  • *****
  • Сообщений: 3 713
  • Благодарностей: 122
  • Per anus ad astra
    • Skype - vasiliy_vershinin
    • Сообщения от Василий Вершинин
Re: 33 мегапикселя на ладони
« Ответ #519 : 14 Дек 2015 [13:15:42] »
Если во время моделирования схема ведет себя как полагается, то при вменяемых частотах (а тут даже сотней мегагерц не пахнет) при правильно настроенных временных ограничениях проблем не должно возникать. Несоответствие моделированию может наблюдаться, только если имеем кривые входные сигналы, либо они асинхронные. А то что внутри плисы могут наблюдаться гонки фронтов на таких частотах, говорит только о криво написанном коде. В любом случае, ничего не мешает законстрейнить окно для входных сигналов.
« Последнее редактирование: 14 Дек 2015 [13:20:45] от Василий Вершинин »