ВНИМАНИЕ! На форуме начался конкурс - астрофотография месяца ИЮЛЬ-АВГУСТ!
0 Пользователей и 2 Гостей просматривают эту тему.
Полоски еще появляются?Можно ли сдвинуть битую строку _в файле_ на 1 байт вправо или влево?
Проект на гуглодиске актуальный?Какой файл верилога является корневым? Я хочу загнать в квартус весь PLC проект, но для этого его придется пересоздать под альтеру с использованием имеющихся файлов.
`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.//============================================5always @ (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 endendreg SSC;// = !((pix > 0) && (pix <= 100)); // 0,100 reg SSC_ADC;// = !((pix > 0) && (pix <= 96)); // 0,96 пропускаем 4 такта ацпreg SSC_CCD;// = ((pix > 0) && (pix <= 100)); // 0,100 always @ (posedge clock)begin SSC = !((pix > 0) && (pix <= 100)); // 0,100 endalways @ (negedge clock)begin SSC_ADC = !((pix > 0) && (pix <= 96)); // 0,96 пропускаем 4 такта ацп SSC_CCD = ((pix > 0) && (pix <= 100)); // 0,100 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,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//================== ВЕРТИКАЛЬНЫЙ ПЕРЕНОС 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) 3,4,5: SG <= 1'b0; //LOC = P74; Summing Gate default: SG <= !SSC_CCD;endcase //LEFT (SINGLE OUTPUT Left C1 C2 C3) //RIGHT (SINGLE OUTPUT Right C2 C1 C3) //C1W <= (SSC_CCD); C1W <= !((buffer < 2 || buffer > 4 ) && !SSC_CCD) && pix != 100;//LOC = P62; Register Clock (Phase 1) //case(buffer) 0,1,5: C1W <= !SSC_CCD && pix < 100;//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) 3,4,5: C3W <= 1'b0; //LOC = P64; Register Clock (Phase 3) default: C3W <= !SSC_CCD; endcase C1X <= !((buffer < 2 || buffer > 4 ) && !SSC_CCD) && pix != 100 ;//LOC = P62; Register Clock (Phase 1) //case(buffer) 0,1,5: C1X <= SSC_CCD && pix < 100;//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) 3,4,5: C3X <= 1'b0;//LOC = P65; Register Clock (Phase 3) default: C3X <= !SSC_CCD; endcase///=============================================================================================== frame <= SSC; //SSC header_clock <= buffer == 0 && pix >= 91 && pix <= 100; header <= pix >= 91 && pix <= 100; //8 бит заголовка строки ///=============================================================================================== case (pix) 91: header_data <= 8'h02; //01 заголовок маркера 92: header_data <= 8'h01; //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) 3,0: //удвоенная частота //==> такт записи данных в FX2 REGWR <= SSC_ADC; default: REGWR <= 1'b0; endcase end///================================================================================= initial begin buffer = 5; pix = 5149;// row = 6703; //cr_ = 0; end endmodule
Цитата: Andreichk от 14 Дек 2015 [19:46:39]Цитата: Василий Вершинин от 14 Дек 2015 [13:28:27]К сожалению, я сам на VHDL веду разработку, поэтому с кодом помочь не могу. можешь Василий, ещё как можешь. на стр. 25 в ответе #487 для тебя задание.... Вход датчика двунаправленный. Так как внутри плисы сигналы inout это моветон, если оно вообще синтезируется, то на верхнем уровне пишется конструкция вида:bus<=myoutdata when RD='1' else (others=>'Z');myindata<=bus; А модуль на ВХДЛ подключается в верилоговский верхний уровень точно также как и обычные верилоговские блоки. Набор сигналов копируется и все.З.Ы. Синтезируется, вспомнил что Chipscope Control inout.
Цитата: Василий Вершинин от 14 Дек 2015 [13:28:27]К сожалению, я сам на VHDL веду разработку, поэтому с кодом помочь не могу. можешь Василий, ещё как можешь. на стр. 25 в ответе #487 для тебя задание....
К сожалению, я сам на VHDL веду разработку, поэтому с кодом помочь не могу.
//Термосенсор DALLAS DS18B20/* Как этим пользоваться На вход clk подаются тактовые импульсы с периодом 6 мкс. Входы reset, read_byte, write_byte нужны для запуска соответствующей функции. На них выставляется 1, после появления 1 на busy их нужно сбросить в 0 (что-то на подобии регистров в МК, записал 1 - пошла работа, только сбрасывать ручками надо), если этого не сделать, то по завершению текущих действий они снова повторятся, причем наивысший приоритет у reset, наименьший у read_byte. Busy выставляется в 1 когда модуль что-то делает, если busy переходит с 1 в 0 можно считывать данные или запускать новый процесс. Здесь реализована только аппаратная часть, всю логику должен делать другой модуль или внешний контроллер (тогда сюда надо будет еще прикрутить SPI). Если все делать в ПЛИС то для нормальной работы нужна еще память где будут храниться адреса устройств. */
reg [7:0] in_byte;//reg [7:0] out_byte_DS18B20; wire w0;BUF BUF_wire ( .O(T_SENSOR),//двунаправленный порт .I(w0) //<-------------------------------------|); // |one_wire DALLAS_DS18B20 ( // | .reset(reg1[4]), //<==сброс термосенсора byte=0x10; | .read_byte(reg1[5]), //<== | .write_byte(reg1[6]), //<== | .wire_out(w0), //------------------------------------->| .wire_in(T_SENSOR), //LOC = P161 DALLAS DS18B20 THERMOSENSOR .presense(presense), .busy(busy), .in_byte(in_byte), .out_byte(out_byte_DS18B20[7:0]), //данные температуры .clk(c48) );
а на 1 МГц надо аж 45 сек ждать, нафик надо ваще так долго ждать
Цитата: Василий Вершинин от 14 Дек 2015 [20:37:33]Цитата: Andreichk от 14 Дек 2015 [19:46:39]Цитата: Василий Вершинин от 14 Дек 2015 [13:28:27]К сожалению, я сам на VHDL веду разработку, поэтому с кодом помочь не могу. можешь Василий, ещё как можешь. на стр. 25 в ответе #487 для тебя задание.... Вход датчика двунаправленный. Так как внутри плисы сигналы inout это моветон, если оно вообще синтезируется, то на верхнем уровне пишется конструкция вида:bus<=myoutdata when RD='1' else (others=>'Z');myindata<=bus; А модуль на ВХДЛ подключается в верилоговский верхний уровень точно также как и обычные верилоговские блоки. Набор сигналов копируется и все.З.Ы. Синтезируется, вспомнил что Chipscope Control inout.я пока вот так написал, не уверен, что верноещё этот камент от автора непонятный какой-тоЦитата//Термосенсор DALLAS DS18B20/* Как этим пользоваться На вход clk подаются тактовые импульсы с периодом 6 мкс. Входы reset, read_byte, write_byte нужны для запуска соответствующей функции. На них выставляется 1, после появления 1 на busy их нужно сбросить в 0 (что-то на подобии регистров в МК, записал 1 - пошла работа, только сбрасывать ручками надо), если этого не сделать, то по завершению текущих действий они снова повторятся, причем наивысший приоритет у reset, наименьший у read_byte. Busy выставляется в 1 когда модуль что-то делает, если busy переходит с 1 в 0 можно считывать данные или запускать новый процесс. Здесь реализована только аппаратная часть, всю логику должен делать другой модуль или внешний контроллер (тогда сюда надо будет еще прикрутить SPI). Если все делать в ПЛИС то для нормальной работы нужна еще память где будут храниться адреса устройств. */ Код: [Выделить]reg [7:0] in_byte;//reg [7:0] out_byte_DS18B20; wire w0;BUF BUF_wire ( .O(T_SENSOR),//двунаправленный порт .I(w0) //<-------------------------------------|); // |one_wire DALLAS_DS18B20 ( // | .reset(reg1[4]), //<==сброс термосенсора byte=0x10; | .read_byte(reg1[5]), //<== | .write_byte(reg1[6]), //<== | .wire_out(w0), //------------------------------------->| .wire_in(T_SENSOR), //LOC = P161 DALLAS DS18B20 THERMOSENSOR .presense(presense), .busy(busy), .in_byte(in_byte), .out_byte(out_byte_DS18B20[7:0]), //данные температуры .clk(c48) );
Цитата: Andreichk от 15 Дек 2015 [02:52:22]а на 1 МГц надо аж 45 сек ждать, нафик надо ваще так долго ждатьЧтобы меньше портить шумом кадр, снятый с получасовой выдержкой.
//=====================================================================================//============= КОМАНДЫ УПРАВЛЕНИЯ ТЕРМОДАТЧИКОМ ======================================//=====================================================================================void commands( unsigned char reg, unsigned char comm ){unsigned char byte = 0x00; status = flWriteChannel(handle, 1000, reg, 1, &comm, &error);//гоним байт команды в ФПГА flSleep(100); status = flWriteChannel(handle, 1000, reg, 1, &byte, &error);//обнуляем}void data_dallas( unsigned char reg, unsigned char bytes ){ status = flWriteChannel(handle, 1000, reg, 1, &bytes, &error);//гоним байт данных в ФПГА //flSleep(100);}void reset_dallas(void){ commands( 0x01, 0x10 );//сброс термосенсора}void read_dallas(void){ commands( 0x01, 0x20 );//команда чтения}void write_dallas(void){ commands( 0x01, 0x40 );//команда записи}void write_data(unsigned char data ){ data_dallas( 0x0C, data );//данные на запись write_dallas(); //команда записи}//===================================================================================//========== ЧТЕНИЕ ТЕРМОДАТЧИКА DALLAS DS18B20 =====================================//===================================================================================void dallas_read( void ){ int i=0;// ===== команды управления чтением данных с термодатчика DALLAS DS18B20 =========== reset_dallas(); //сброс термосенсора write_data(0xCC);//послать команду пропустить ROM write_data(0x44);//послать команду температурного преобразования flSleep(1000); reset_dallas(); //сброс термосенсора write_data(0xCC);//послать команду пропустить ROM write_data(0xBE);//считать последовательно 9 байт оперативной памяти for ( i = 0; i < 9; i++) { read_dallas();//команда ЧТЕНИЕ ПАМЯТИ }}
Может вывод на приём не переключается?
Цитата: Василий Вершинин от 17 Дек 2015 [10:23:24]Может вывод на приём не переключается? Наверное, это можно проверить, воткнув в шину сопр и посмотреть, дергается ли что-то со стороны DS
кусок кода верхнего уровня в студию
Цитата: Mixa от 17 Дек 2015 [12:16:17]Цитата: Василий Вершинин от 17 Дек 2015 [10:23:24]Может вывод на приём не переключается? Наверное, это можно проверить, воткнув в шину сопр и посмотреть, дергается ли что-то со стороны DSсопротивление на землю ?
Я там не нашел явного перевода выхода в HiZ по условию начала приема данных от датчика
bus<=myoutdata when RD='1' else (others=>'Z');myindata<=bus;