Перейти к содержанию
    

rolin

Участник
  • Постов

    36
  • Зарегистрирован

  • Посещение

Весь контент rolin


  1. Тут я с вами пожалуй не соглашусь. Зачем мне в рабочей прошивке Remote_Update, если я не планирую переконфигурироваться из нее ? Еще в загрузчике я отключаю WDT чтоб не мешал, а после переконфигурации так и вовсе режим Remote не представлен. Есть рабочий проект, с которого я черпаю вдохновение, правда он под циклон 3, а у меня 4. Так там рабочие прошивки самые обычные, Active serial - Standart. Вот код инициализации в загрузчике // Remote Update State Machine always @ (posedge clock) begin if (reset) ConfigState <= 0; case (ConfigState) // Reset State 0: begin ResetRU <= 'b1; if (Busy) ConfigState <= 0; else ConfigState <= ConfigState + 1'b1; end //Setup Defaults 1: begin ResetRU <= 'b0; CRC_error <= 1'b0; done <= 1'b0; ReconfigLine <= 1'b0; WriteParam <= 1'b0; ReadSource <= 2'b0; Reason <= 5'b01011; loop <= 0; ConfigState <= ConfigState + 1'b1; end //Turn on CONFG_DONE early 2: begin DataIn <= 1'b1; Param <= 3'b001; ConfigState <= ConfigState + 1'b1; end 3: begin WriteParam <= 1'b1; ConfigState <= ConfigState + 1'b1; end 4: begin WriteParam <= 1'b0; ConfigState <= ConfigState + 1'b1; end 5: begin if (Busy) ConfigState <= 5; else ConfigState <= ConfigState + 1'b1; end //Turn on OSC_INT 6: begin DataIn <= 1'd1; Param <= 3'b110; ConfigState <= ConfigState + 1'b1; end 7: begin WriteParam <= 1'b1; ConfigState <= ConfigState + 1'b1; end 8: begin WriteParam <= 1'b0; ConfigState <= ConfigState + 1'b1; end 9: begin if (Busy) ConfigState <= 9; else ConfigState <= ConfigState + 1'b1; end //Set Application Boot_Address 10: begin DataIn <= (BootAddress >> 2); // Set the Boot Address of the Application Image, Only the 22 MSB bits are written Param <= 3'b100; ConfigState <= ConfigState + 1'b1; end 11: begin WriteParam <= 1'b1; ConfigState <= ConfigState + 1'b1; end 12: begin WriteParam <= 1'b0; ConfigState <= ConfigState + 1'b1; end 13: begin if (Busy) ConfigState <= 13; else ConfigState <= ConfigState + 1'b1; end //Disable the WATCHDOG_EN 14: begin DataIn <= 1'd0; // set DataIn to 0 to disable Param <= 3'b011; ConfigState <= ConfigState + 1'b1; end 15: begin WriteParam <= 1'b1; ConfigState <= ConfigState + 1'b1; end 16: begin WriteParam <= 1'b0; ConfigState <= ConfigState + 1'b1; end 17: begin if (Busy) ConfigState <= 17; else ConfigState <= ConfigState + 1'b1; end // READ REASON for last Config 18: begin Param <= 3'b111; ConfigState <= ConfigState + 1'b1; end 19: begin ReadParam <= 1'b1; ConfigState <= ConfigState + 1'b1; end 20: begin ReadParam <= 1'b0; ConfigState <= ConfigState + 1'b1; end 21: begin if (Busy) begin ConfigState <= 21; end else ConfigState <= ConfigState + 1'b1; end 22: begin Reason <= DataOut[4:0]; // Read the Reason for Last ReConfig ConfigState <= ConfigState + 1'b1; end 23: begin ConfigState <= ConfigState + 1'b1; end // Check if we need to Reconfig 24: begin if (Reason[3]) begin // If we are here due to CRC Error, skip reconfig & CRC_error <= 1'b1; // set CRC error flag ConfigState <= 24; end else ConfigState <= ConfigState + 1'b1; end 25: begin if (control == 1) begin ReconfigLine <= 1'b1; ConfigState <= ConfigState + 1'b1; end end 26: begin // Hold ReconfigLine high for > 250nS as per handbook if (loop == delay) ConfigState <= ConfigState + 1'b1; else loop <= loop + 1'b1; end // End State 27: begin done <= 1'b1; // Indicate the State Machine is Finished ConfigState <= 27; // Loop here end default: ConfigState <= 0; endcase end remote Remoteinst( .clock(clock), .data_in(DataIn), .param(Param), .read_param(ReadParam), .read_source(ReadSource), .reconfig(ReconfigLine), .reset(ResetRU), .busy(Busy), .data_out(DataOut), .write_param(WriteParam) );
  2. Точно! Сразу после запуска нужно конфигурировать ALT_REMOTE и отключать WDT, а у меня таймер на секунду стоял по глобальному сбросу. Теперь загрузчик работает, но появилась вторая проблема - после попытки загрузить рабочую конфигурацию, плисина тут же перезагружается опять в загрузчик. Рабочий код не содержит ALT_REMOTE, то есть это уже не проблема WDT.
  3. Специально подготавливал фйл прошивки бутлоадера чтобы с нулевого адреса начинался - не работает. Компилю бутлоадер без Remote - работает. Установка Active serial - Remote требует применения IP Remote в проекте, они связаны между собой. По идее должно с нулевого адреса грузиться в любом случае, но что мешает - ума не приложу. Посмотрел осциллографом - плисина пытается читать память в цикле. На выходе флешки вижу данные, равно как и клок и синхро и данные к ней. А ПЛИС не грузится, хотя попытки делает.
  4. Решил вот обзавестись загрузчиком в проекте. Для переконфигурации FPGA с разных адресов памяти использую Remoute Update. Но вот проблема - при использовании этого IP, компилятор требует установки в свойствах проекта вместо Active Serial - Standart, Active Serial - Remoute, и как только я выставляю этот параметр, плисина перестает грузиться. Что я не так делаю ? Cyclone 4 E. EPCS16 подключена к ногам как обычно.
  5. Так они ж одинаково отрицательные, мне главное чтобы данные выровненные были , а клок я могу из АЦП двигать с шагом 45 град. Но в общем опять не работает оно, рано обрадовался. Писать по примеру я не могу, так как квартус тоже как бы хочет писать в cds и в итоге фигня получается. Выдал мне 150 ошибок по каким-то внутренним несоответствиям, причем сам написал мне строки в файле а потом по ним же и слаки выдал. Короче снес я cds и разницы не заметил. Проблема сейчас такова, решил включить паттерны на АЦП, чтобы убедиться что все хорошо, а оно не хорошо. Согласно паттерну, АЦП выдает поочередно 1111_1111_1111_000 и 0000_0000_0000_0000 Крутил фазу клока из АЦП от 0 до 275 град, зафиксировал следующие данные 1010_1010_1010_0000 1111_1111_1111_0000 Но самое главное, что данные не чередуются, всегда FFF0 или AAA0, что-то с DDR неправильно у меня. adc_ddr_reg ddr_reg1 (adc1_data, clock, adc1_data_buffer_h, adc1_data_buffer_l); assign reg_adc1_data[0] = adc1_data_buffer_l[0]; assign reg_adc1_data[2] = adc1_data_buffer_l[1]; assign reg_adc1_data[4] = adc1_data_buffer_l[2]; assign reg_adc1_data[6] = adc1_data_buffer_l[3]; assign reg_adc1_data[8] = adc1_data_buffer_l[4]; assign reg_adc1_data[10] = adc1_data_buffer_l[5]; assign reg_adc1_data[12] = adc1_data_buffer_l[6]; assign reg_adc1_data[14] = adc1_data_buffer_l[7]; // assign reg_adc1_data[1] = adc1_data_buffer_h[0]; assign reg_adc1_data[3] = adc1_data_buffer_h[1]; assign reg_adc1_data[5] = adc1_data_buffer_h[2]; assign reg_adc1_data[7] = adc1_data_buffer_h[3]; assign reg_adc1_data[9] = adc1_data_buffer_h[4]; assign reg_adc1_data[11] = adc1_data_buffer_h[5]; assign reg_adc1_data[13] = adc1_data_buffer_h[6]; assign reg_adc1_data[15] = adc1_data_buffer_h[7]; Данные для обработки захватываю из регистров со сдвигом 45 град относительно клока АЦП, но это похоже ни к чему. На выходе АЦП на шине меандр 61.44 МГц, а значит при клоке 128.88 можно в зависимости от фазы получить следующие данные: AAA0, 5550, FFF0, 0000 (АЦП 14 бит) но эти данные должны чередоваться
  6. После выравнивания задержек благодаря применения ALTDDIO_IN устройство работает хорошо. Больше ничего не делал, подобрал фазу клока из АЦП и все. Плату на глаз дорожки волнами рисовал, похоже угадал. Спасибо.
  7. разобрался, для альтеры это IP ALTDDIO получилось так wire [7:0] adc1_data_buffer_h, adc1_data_buffer_l; wire [7:0] adc2_data_buffer_h, adc2_data_buffer_l; adc_ddr_reg ddr_reg1 (adc1_data, clock, adc1_data_buffer_h, adc1_data_buffer_l); adc2_ddr_reg ddr_reg2 (adc2_data, clock, adc2_data_buffer_h, adc2_data_buffer_l); adc_of_ddr_reg ddr_of (adc_OF, clock, adc2_of, adc1_of); Теперь задержки выровнялись осталось скомпенсировать общую задержку > 5 нс
  8. TimeQuest мне сообщает, что максимальная используемая частота в данном случае 176МГц, это циклон 3, а так как у меня 122 и double rate, то тайминги эквивалентны 256 МГц. Но не суть, может я неправильно понимаю. Приведенный вами код похож на описание некоего примитива, тут у меня знаний нет к сожалению. Требования по таймингам прописал как set_input_delay -add_delay -max -clock [get_clocks {adc_clock}] 7.138 [get_ports {adc_d1[0]}] set_input_delay -add_delay -min -clock [get_clocks {adc_clock}] 1.000 [get_ports {adc_d1[0]}] set_max_delay -from [get_ports {adc_d1[0]}] 1.000 set_min_delay -from [get_ports {adc_d1[0]}] 0.500 когда задаю задержку для клока, то ничего не меняется set_clock_latency -source 5.000 [get_clocks {adc_clock}]
  9. Приветствую. Впервые столкнулся с необходимостью приема данных от АЦП на частоте 122.8 (период 8.138 нс) да еще и Double Rate, то есть требования к задержкам возросли вдвое. Естественно - не работает как надо, данные идут с ошибками. Реализация защелки и разделения данных простейшая: always @(negedge adc_clock) begin reg_adc1_data[0] <= adc1_data[0]; reg_adc1_data[2] <= adc1_data[1]; reg_adc1_data[4] <= adc1_data[2]; reg_adc1_data[6] <= adc1_data[3]; reg_adc1_data[8] <= adc1_data[4]; reg_adc1_data[10] <= adc1_data[5]; reg_adc1_data[12] <= adc1_data[6]; reg_adc1_data[14] <= adc1_data[7]; // reg_adc2_data[0] <= adc2_data[0]; reg_adc2_data[2] <= adc2_data[1]; reg_adc2_data[4] <= adc2_data[2]; reg_adc2_data[6] <= adc2_data[3]; reg_adc2_data[8] <= adc2_data[4]; reg_adc2_data[10] <= adc2_data[5]; reg_adc2_data[12] <= adc2_data[6]; reg_adc2_data[14] <= adc2_data[7]; adc1_of <= adc_OF; end always @(posedge adc_clock) begin reg_adc1_data[1] <= adc1_data[0]; reg_adc1_data[3] <= adc1_data[1]; reg_adc1_data[5] <= adc1_data[2]; reg_adc1_data[7] <= adc1_data[3]; reg_adc1_data[9] <= adc1_data[4]; reg_adc1_data[11] <= adc1_data[5]; reg_adc1_data[13] <= adc1_data[6]; reg_adc1_data[15] <= adc1_data[7]; // reg_adc2_data[1] <= adc2_data[0]; reg_adc2_data[3] <= adc2_data[1]; reg_adc2_data[5] <= adc2_data[2]; reg_adc2_data[7] <= adc2_data[3]; reg_adc2_data[9] <= adc2_data[4]; reg_adc2_data[11] <= adc2_data[5]; reg_adc2_data[13] <= adc2_data[6]; reg_adc2_data[15] <= adc2_data[7]; adc2_of <= adc_OF; end Кое-как отфазировал клок из АЦП, работает но с ошибками. TimeQuest показывает сильную разницу между заржками к двум буферам. Проблема в том, что вход один, а регистров два. Один квартус сделал как Fast Input а второй где придется. Один из входных пинов не может использовать FastInput и регистры используются одинаковые, в результате разница в задержках мизерная. Я думаю, что если как-то запретить квартусу использовать FastInput, то можно получить неравномерность в пределах 1 нс, чего будет достаточно. Я в TimeQuest только первые шаги делаю и не совсем понятно, как задержать входной клок на 5 нс, чтобы все эти данные вовремя под фронты попадали а еще вероятно нужно будет менять задержки для каждой линии из-за неоптимальной разводки на плате. Не знаю, как это и возможно ли вообще. Прошу помощи. И еще, нет ли какой готовой реализации подобного интерфейса в IP, может это решит все проблемы ?
  10. Я удивляюсь, ведь есть много аппаратных LAN PHY но нет ни одного WIFI.... Все быстрые WIFI имеют входной интерфейс Ethernet или USB.. .
  11. Люди, ау.... Вопрос так и не решен.... Нужно заменить в проекте LAN PHY на WIFI и скорость нужна 100-150Мбит. Все что гуглится - какие-то недомерки с UART. Почему нигде нету нормального параллельного интерфейса ? Есть в продаже модули для ноутов PCI-E но мне кажется раскурить все мануалы и интерфейсы нереально. Что делать ?
×
×
  • Создать...