ВНИМАНИЕ! На форуме начался конкурс - астрофотография месяца - АВГУСТ!
0 Пользователей и 1 Гость просматривают эту тему.
`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. reg [25:0]pix_; ////=======================================11always @ (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 endendwire 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,501wire A2 = integration ? 1'b1 : transport ? !((pix >= 20) && (pix <= 50)): 1'b0 ; //125,313wire A3 = integration ? 1'b1 : transport ? !((pix >= 40) && (pix <= 70)): 1'b0 ; //250,438wire 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 - вертикальный перенос pin164assign TD_WTHLVL = integration || SSC; //переключатель напр.11/8 вольт на EL7156. pin102assign 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 >= 40 && pix <= 51; header <= pix >= 40 && pix <= 51; //8 byte 380-391 ///=============================================================================================== case (pix) 40: header_data <= 8'h01; //01 заголовок маркера 41: header_data <= 8'h02; //02 заголовок маркера 42: header_data <= row[15:8]; //ст.байт номер строки 43: header_data <= row[7:0]; //мл.байт номер строки 44: header_data <= data_msb[7:0]; //ст.байт Т.Пельтье 45: header_data <= data_lsb[7:0]; //мл.байт Т.Пельтье 46: header_data <= data_gain[5:0]; //усиление АЦП 47: 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 endalways @ (negedge clock) // по спаду тактового импульса begin case (buffer) 4,10: //удвоенная частота //==> такт записи данных в FX2 REGWR <= SSC_ADC; default: REGWR <= 1'b0; endcase end///=================================================================================initial begin buffer = 11; pix = 5149;// row = 6703; //cr_ = 0; endendmodule
data_gain - подаю произвольное числоdata_offset - ^^^data_msb - что сюда?data_lsb - и сюда?
А куда подавать пиксельные данные с АЦП?
------------------------------------------------------------------------------------ Company: -- Engineer: -- -- Design Name: -- Module Name: one_wire - Behavioral -- http://we.easyelectronics.ru/plis/1-wire-na-vhdl.html----------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all; entity one_wire is port ( reset : in std_logic; read_byte : in std_logic; write_byte : in std_logic; wire_out : out std_logic; wire_in : in std_logic; presense : out std_logic; busy : out std_logic; in_byte : in std_logic_vector (7 downto 0); out_byte : out std_logic_vector (7 downto 0); clk : in std_logic );end one_wire;architecture a of one_wire issignal count : std_logic;signal counter : integer range 0 to 127;beginprocess (clk)type finit_state is (start, delay_reset, wire_read_presense, wire_0, wire_write, wire_read, delay );variable state : finit_state := start; variable n_bit : integer range 0 to 7;variable f : std_logic;beginif (clk'event and clk = '1') thencase (state) is when start => wire_out <= '1'; -- здесь программа посто висит и ждет команд busy <= '0'; count <= '0'; if (reset = '1') then -- пришла команда сбросить шину busy <= '1'; presense <= '0'; state := delay_reset; -- переходим туда, где эта шина сбрасывается elsif (write_byte = '1') then f := '0'; busy <= '1'; state := wire_0; elsif (read_byte = '1') then f := '1'; busy <= '1'; state := wire_0; end if; when delay_reset => wire_out <= '0'; -- сбрасываем шину, т. е. выставляем 0 и ждем 480 мкс count <= '1'; if (counter = 78) then state := wire_read_presense; count <= '0'; end if; when wire_read_presense => wire_out <= '1'; count <= '1'; if (counter = 11) then -- проверяем ответ от устройства presense <= not wire_in; end if; if (counter = 78) then state := start; count <= '0'; end if; when wire_0 => wire_out <= '0'; -- инициируем передачу или прием бита if (f = '0') then state := wire_write; else state := wire_read; end if; when wire_write => if (in_byte(n_bit) = '1') then -- по-очереди передаем байт wire_out <= '1'; end if; state := delay; when wire_read => wire_out <= '1'; count <= '1'; if (counter = 1) then out_byte(n_bit) <= wire_in; -- считываем бит count <= '0'; state := delay; end if; when delay => count <= '1'; if (counter = 8) then -- задержка перед приемом или передачей следующего бита count <= '0'; wire_out <= '1'; if (n_bit = 7) then -- если все биты приняты/переданы возвращаемся на начало n_bit := 0; state := start; else n_bit := n_bit + 1; state := wire_0; end if; end if; end case;end if;end process;-- счетчик, тикает с периодом 6 мкс, нужен для выдерживания временных интерваловprocess (clk)beginif (count = '0') then counter <= 0;elsif (clk'event and clk = '1') then counter <= counter + 1;end if;end process;end architecture;
Могу сделать скриншот - но снимать все сигналы будет мелко и неудобно смотреть. Если надо - напишите что оставить, я уберу все лишнее и выложу картинку.
Проект, который Вы использовали как основу, мне не нравится своей функциональной избыточностью (из за универсальности).
Загрузки прошивок в FX и ПЛИС из ПК не будет, поставлю еепромы с прошивками в камеру.
Цитата...а в чём его избыточность, я чёт невкурил?
...
ЦитатаЗагрузки прошивок в FX и ПЛИС из ПК не будет в FX ничего заливать не надо.
Загрузки прошивок в FX и ПЛИС из ПК не будет
Автор проекта связки напихал в свое творение много разных интересных фич. Несколько виртуальных каналов, выбор разных конечных точек... Зачем это в камере?
FX2й "romless", на борту камня только "масочный" загрузчик. При включении питания, загрузчик ищет прошивку в конфигурационном EEPROM, и если ЕЕР не подключен или не содержит тело программы, он ждет загрузку через USB по специальному протоколу. Загрузкой фирмвари в этом случае заведует драйвер.
Как успехи? Разобрались с симуляцией?
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////// Широтно-импульсная модуляция для ПЕЛЬТЬЕ и ПРОТИВОРОСНИКА// Принимаем 2 байта из хоста и делаем из них 16 битное число//////////////////////////////////////////////////////////////module PWM( input clk, input [7:0] PWM_in1, input [7:0] PWM_in2, output PWM_out);reg [15:0] cnt;reg cnt_dir; // 0 to count up, 1 to count downwire [15:0] cnt_next = cnt_dir ? cnt-1'b1 : cnt+1'b1;wire cnt_end = cnt_dir ? cnt==16'b0000000000000000 : cnt==16'b1111111111111111;always @(posedge clk) cnt <= cnt_end ? ( PWM_in1 << 8 | PWM_in2 ) : cnt_next;always @(posedge clk) cnt_dir <= cnt_dir ^ cnt_end;assign PWM_out = cnt_dir;endmodule
Цитата: Дмитрий Бучинский от 13 Дек 2015 [12:56:21]Как успехи? Разобрались с симуляцией?неа, хилинкс не переваривает альтеровские файлы.
КМК, начинается полемика "о вкусе и цвете", т.е. ни о чем.Вы поднимаете свой, сложный проект; я вам в меру способностей помогаю. Споры о не относящихся к конкретной проблеме вещах отнимают время и не приносят пользы делу.ЦитатаЦитата: Дмитрий Бучинский от 13 Дек 2015 [12:56:21]Как успехи? Разобрались с симуляцией?неа, хилинкс не переваривает альтеровские файлы. Тогда, если не хотите ставить квартус, можете отправить мне куски проекта, и пожелания по интересующим моментам в симуляции. Я у себя прогоню на симуляторе, и выложу фрагменты. Целиком симуляцию выложить не получится.Как работает камера на данный момент, есть ли какие проблемы? P/S В квартусе есть экспорт отчета симуляции в форматах .vwf .cvwf .vcd .tbl - может какой-то из этих форматов получится загрузить у Вас и просмотреть...
Дмитрий, сегодня же воскресенье, можно и ни о чём поболтать. Я же не навязываю свою точку зрения, просто высказываюсь.
ну и напихал, это что ли мешает чему-то?
опять не пойму, в чём тут проблема. один раз при подключении перепрописал что-то там в кипресе и всё, при следующих подключениях оно само уже всё там организуется*. мы вообще об Cypress CY7C68013A-56 говорим или о чём-то другом?
Мне проще поставить толстый eeprom, чем разбираться как пишется чудо-драйвер загрузчик.