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

Digi

Свой
  • Постов

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

  • Посещение

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


  1. Что бы не плодить сообщения, продолжу в этой теме. Продолжаю безуспешную войну с uOS. Сейчас вычищаю баги в проекте. Ситуация такая: Использую аппаратный UART в Multicore. Всё работает, но если поток данных по UART идёт сплошняком, есть предположения, что прерывание приходит чаще, чем проц успевает его обработать, то он уходит в функцию void mutex_activate (mutex_t *m, void *message) и остаётся там навсегда (крутится внутри while() ). Кто с этим сталкивался ? Как побороть и куда ещё посмотреть ? Ниже привожу инициализацию порта /* * Receive interrupt task. */ void uart422_receiver (void *arg) { uartpkt_t *u = arg; // Enable receiver & transmitter mutex_lock_irq (&u->receiver, RECEIVE_IRQ(u->port), 0, 0); enable_receiver (u->port); enable_receive_interrupt (u->port); debug_printf("Uart422 started.\n"); for (;;) { mutex_wait (&u->receiver); // Ожидаем событие по приему или по принудительному пинку для передачи #ifdef clear_receive_errors clear_receive_errors (u->port); #else if (test_frame_error (u->port)) { //debug_printf ("FRAME ERROR\n"); clear_frame_error (u->port); } if (test_parity_error (u->port)) { //debug_printf ("PARITY ERROR\n"); clear_parity_error (u->port); } if (test_overrun_error (u->port)) { //debug_printf ("RECEIVE OVERRUN\n"); clear_overrun_error (u->port); } if (test_break_error (u->port)) { // debug_printf ("BREAK DETECTED\n"); clear_break_error (u->port); } #endif uart422_rtx_proc(u); // Вызываем функцию обработчика события с USART // task_yield(); } } void uart422_init (uartpkt_t *u, small_uint_t port, int prio, unsigned int khz, unsigned long baud) { u->khz = khz; u->port = (port) ? (volatile unsigned*)(0xb82f3800) : (volatile unsigned*)(0xb82f3000); mutex_init(&u->receiver); /* Setup baud rate generator. */ setup_baud_rate (u->port, u->khz, baud); /* Create uart receive task. */ uart422_task_s = task_create (uart422_receiver, u, "uart422", prio, u->rstack, sizeof (u->rstack)); } Функция работы с портом static bool_t uart422_rtx_proc (uartpkt_t *u) { unsigned char tx_char=0; unsigned char c=0; if (test_get_receive_data(u->port, &c)) { mutex_lock(&u->receiver); switch (c) { case 0xff: break; ...... default: if (u->rx_packet.data_in_process==1) { if (u->rx_packet.addcode!=0) { c = c + 0xfd; // дополняем принятое значение u->rx_packet.addcode= 0; } u->rx_packet.pkt_buffer.p_buffer[u->rx_packet.ptr] = c; u->rx_packet.ptr = (u->rx_packet.ptr < MAX_CTL_SIZE) ? (u->rx_packet.ptr + 1) : u->rx_packet.ptr; // На всякий случай ограничим прием при переполнении u->rx_packet.crc= (u->rx_packet.crc + c) & 0xff; } break; } mutex_unlock(&u->receiver); } // ------------ Transmit section ------------------ // Check that transmitter buffer is busy. if (! test_transmitter_empty (u->port)) { return 1; } if (u->tx_packet.data_in_process==2) { // Функция для завершения передачи и перевода трансивера на приём // delay(25); // !!! возможно будет отжирать системное время по завершини передачи // RS485_SetRxMode(); u->tx_packet.data_in_process=0; disable_transmit_interrupt (u->port); u->tx_packet.total_packets++; mutex_unlock(&u->transmitter); // Снимаем блокировку return 0; } ...... } } return 1; } И сама функция в которой проц застревает (из uOS/main.c) (пробовал ставить UOS_SIGNAL_SMART =0, результат такой же) void mutex_activate (mutex_t *m, void *message) { task_t *t; mutex_slot_t *s; assert (m != 0); if (! m->item.next) mutex_init (m); while (! list_is_empty (&m->waiters)) { t = (task_t*) list_first (&m->waiters); assert2 (t->wait == m , "assert task %s(0x%x) wait %x activate from %x($%x)\n" , t->name, (unsigned)t , t->wait, m, (unsigned)message );//uos_assert_task_name_msg t->wait = 0; t->message = message; #if UOS_SIGNAL_SMART > 0 //получили сигнал, и жду захвата мутеха, потому пермещу нитку из ожидания сигнала в // захватчик мутеха if (t->MUTEX_WANT != 0) if (mutex_wanted_task(t)) continue; #endif task_activate (t); } ........
  2. Не буду плодить тему, просто оживлю "покойничка" )) Рисую в Altium многостраничную схему по ГОСТ. Дошло дело до расстановки NetLabel c одного листа на другом листе. В настройках проекта все цепи глобальные, у шин названия не проставлял. Но при установке NetLabel на втором листе Altium не видит его имя с первого, видит только цепи со второго. Например на первом листе цепь называется ADC1_D1, хочу поставить NetLabel на втором листе, выбрав его из списка. Но его там нет. Тем не менее если имя прописать руками, то в списке соединений всё корректно подключается. Вопрос: как сделать так, чтобы все цепи проекта были видны в списке выбора цепи, или нужно искоренить у себя такую привычку использовать такой выбор ?
  3. Хочу запитать антенный усилитель по кабелю. Какие есть минусы, если на стороне усилителя я не буду разделять питание и сигнал , а сразу подключу кабель к выходу усилителя, так как на второй схеме ? Рабочая частота 900 МГц, сигнал узкополосный. Длина кабеля 20 метров.
  4. У меня uOS а не uCOS, они немного разные как мне кажется. В uOS за обработку прерываний отвечают функции: mutex_lock_irq () Захват прерывания mutex_unlock_irq () Освобождение прерывания mutex_wait () Ожидание прерывания
  5. С этим разобрался. Заработало. Спасибо всем ответившим. Отдельное спасибо vatilin за подробные объяснения. По поводу задержки, я ее ставил просто как задержку. В реальной программе так не пишу. Ну и посмотрел я реализацию udelay в uOS, оказалось что она просто тупо ждет, и к сожалению она не аналог Sleep в RTOS. Теперь разбираюсь с прерываниями.... вроде как работают, но пока еще не привычно для меня.
  6. Пытаюсь запустить несколько различных задач на uOS которая поставляется совместно с пакетом MCStudio, но работает не так как ожидалось. Собственно никакой многозадачности не наблюдаю. Работает только та задача у которой наивысший приоритет. (В данном случае task ). Что я хотел получить: должны мигать три светодиода, и по приходу данных с UART должен заходить в обработчик uart_intr_hdl. Вроде как такая конструкция на RTOS STM32 работает корректно, но тут, на uOS никак не желает. Что я делаю не так ??? bool_t uart_intr_hdl(void *arg) { ch = get_received_byte(1); LedTgl(1); return 1; } void task1 (void *arg) { for(;;) { LedTgl(8); udelay(30000); } } void task2 (void *arg) { for(;;) { LedTgl(4); udelay(40000); } } void task (void *arg) { setup_baud_rate (1, KHZ, 115200); mutex_lock_irq (&receiver, RECEIVE_IRQ (1), &uart_intr_hdl, 0); enable_receiver (1); enable_receive_interrupt (1); transmit_byte(1, '*'); for (;;) { udelay(50000); LedTgl(2); } // for(;;) } void uos_init (void) { SYS_REG.CLK_EN.data = 0xFFFFFFFF; // включение тактовой частоты _init_ включает только минимум частот LedInit(); MFBSP2.DIR.data = 0x3ff; // переключаем LDAT2[7:4] в режим выхода task_create (task1, 0, "task1", 1, task1_space, sizeof (task1_space)); task_create (task2, 0, "task2", 2, task2_space, sizeof (task2_space)); task_create (task, "task", "task", 3, task_space, sizeof (task_space)); }
  7. Если делать на диодах, то для его открытия необходимо напряжения выше, чем пиковый размах на выходе передатчика. +30дбм 7В - эфф , 20В Vpp - пиковое, то есть нужно обеспечить напряжение +20 В для открытия (хотя там будет 0,7В) и на другой части, приемной, -20 В для запирания. Что то как то не укладывается в голове.
  8. Просвятите, про коммутацию на p-i-n диодах. Принцип понимаю, теоретическую схемотехнику - тоже, а вот практическую реализацию , применительно к такой частоте затрудняюсь реализовать. Хотелось бы попробовать. Ссылку на фрагмент схемы не подбросите ?
  9. Реле не подходят. Передатчик включается несколько раз в секунду. А вот ключи от GSM мобилки думаю вполне...
  10. Возникла задача сделать быстро макет усилителя мощности. Частота 900 МГц, мощность 1-2 Вт. Усилитель подключается в разрыв между антенной и трансивером. Необходимо по входу усилка и по выходу поставить нечто вроде SPDT ключа. В режиме приема антенна скоммутирована на вход трансивера, в режиме передачи аннтенна подключена к выходу усилителя, а вход усилителя к выходу трансивера. Время переключения менее 1 мс. Посоветуйте схемотехническое решение, как такое реализовать ?
  11. Подскажите, как в Signal Tap задать инверсный тактовый сигнал. К примеру мне нужно смотреть данные, которые защелкиваются в проекте по заднему фронту CLK. Но инверсного сигнала CLK в явном виде у меня нет. Поэтому приходится в проекте брать CLK инвертировать и выводить на несиспользуемый пин. А уж потом этот пин указывать как тактовый дла Signal Tap. Чувствую, что лажа. Но как правильно ?
  12. Обнадёжили, как получу железку обратно, буду разбираться.
  13. Уровень был около 40дб от шума. Когда отлаживались, то смотрели так: Пробрасывали данные с выхода DDC мимо модуля FFT и по этим данным считали FFT c плавающей точкой - постоянки нет. Фото прикрепил. На фото сигнал не подавался. На верхнем графике выход с FFT
  14. Использую FFT на Virtex-6 , размер FFT 16384. На вход FFT подаю квадратуры. На выходе FFT наблюдаю подаваемый сигнал и постоянку в нулевом ± бине. Смотрел квадратуры отдельно, DC в них нет. В корке FFT стоит округление convergent_rounding. Как убрать постоянную составляющую на выходе FFT. Вот параметры корки. # BEGIN Parameters CSET aclken=false CSET aresetn=true CSET butterfly_type=use_xtremedsp_slices CSET channels=1 CSET complex_mult_type=use_mults_performance CSET component_name=xfft_16384 CSET cyclic_prefix_insertion=false CSET data_format=fixed_point CSET implementation_options=radix_4_burst_io CSET input_width=16 CSET memory_options_data=block_ram CSET memory_options_hybrid=false CSET memory_options_phase_factors=block_ram CSET memory_options_reorder=block_ram CSET number_of_stages_using_block_ram_for_data_and_phase_factors=0 CSET output_ordering=natural_order CSET ovflo=false CSET phase_factor_width=16 CSET rounding_modes=convergent_rounding CSET run_time_configurable_transform_length=false CSET scaling_options=block_floating_point CSET target_clock_frequency=200 CSET target_data_throughput=50 CSET throttle_scheme=nonrealtime CSET transform_length=16384 CSET xk_index=false # END Parameters
  15. Испытываю некоторое неудобство при работе с SVN. Когда я получаю файлы, то у них датой является дата получения из хранилища, а не фактическая дата изменения. Как можно атрибутам полученных файлов присвоить именно реальную дату изменения ?
  16. Вот и началась куча вопросов у Интела. И из-за того, что у меня некоторые условия не выполняются , доступа соответственно, я не получил.
  17. У меня нет доступа в приватный раздел интела, кто может помочь с IBIS моделью от проца E38xx ?
  18. Добавил вот такую конструкцию. Из нее видно, что машина находится в состоянии PLL_DATA, но в самой машине в секции PLL_DATA ничего не выполняется. Пошел разбираться с временным анализом. always @ (negedge Tx_clock_2 ) begin case (state_Tx) RESET: begin tx_debug[3:0] = 1; end UDP: begin tx_debug[3:0] = 2; end ARP: begin tx_debug[3:0] = 3; end PING1: begin tx_debug[3:0] = 4; end PING2: begin tx_debug[3:0] = 5; end CRC: begin tx_debug[3:0] = 6; end PLL_DATA: begin tx_debug[3:0] = 7; end default: begin tx_debug[3:0] = 8; end endcase end Проблема скрывалась в многочисленных проверках sp_data_count в состоянии PLL_DATA. Изменил конструкцию и все заработало.
  19. К своему стыду, признаюсь, в данном проекте с констрейнами у меня полный ступор. Я и до этого с ними не дружил, в силу неполного понимания процесса их описания. Может направите меня в более менее доступное разъяснение, как с ними работать. По поводу кривизны проекта: за основу был взят опенсорсный проект, я его модифицировал до нужного мне функционала. Torpeda, из CLOCK*_50 - используется только CLOCK_50, остальные я ухитрился автоматом прописать. PHY_RX_CLOCK и PHY_TX_CLOCK - в принципе друг с другом синхронны, но сдвинуты по фазе, так как берутся с разных источников (выходов PHY). bogaev_roman, time quest ничего разумного не скажет, потому что констрейны прописаны криво. alexadmin, сброс в процессе работы не приходит. Но почему машина состояний вываливается и не отрабатывается default ?
  20. Вообщем возникла такая проблема и уже не пойму в какую сторону копать: Ниже код передатчика от MAC. Запускаю, некоторое время все работает, но по непонятным причинам, через несколько сотен посылок, код перестает работать. Конкретно проблема возникает в том что машина состояний state_Tx уходит в неопределенное состояние, то есть становится равной НУЛЮ (смотрел в Signal Tap). А в нормальном режиме он хоть чему нибудь должна быть равна. Еще добавил default в case , при заходе в который state_Tx должна стать равной RESET, но не помогло. Так же когда state_Tx становиться равным нулю, начинают увеличиваться rdaddress , он доходит до 0x3F и начинает с нуля. И data_count, считает до 0x3ff. Также обновляется temp_CRC32. До этого при некоторых вариантах компиляции проекта все работало отлично. Стоит чего либо поменять, начинает работать нестабильно. Уже не знаю что может вызывать такой эффект. Может кто свежим взглядом посмотрит и направит на путь истинный. Кстати с констрейнами я плохо дружу. Попытался прописать клоки, но результат вроде как стал хуже. Теперь при различных компиляциях вообще не работает нормально (при подключеном stp и без него). Основная проблема в том что я не могу понять, почему state_Tx становиться равным НУЛЮ ? Подскажите, в какую сторону дальше грести. ------ SDC файл ---- create_clock -name {altera_reserved_tck} -period 100.000 -waveform { 0.000 50.000 } [get_ports {altera_reserved_tck}] create_clock -name {CLOCK_50} -period 20.000 -waveform { 0.000 10.000 } [get_ports {CLOCK_50}] create_clock -name {CLOCK2_50} -period 20.000 -waveform { 0.000 10.000 } [get_ports {CLOCK2_50}] create_clock -name {CLOCK3_50} -period 20.000 -waveform { 0.000 10.000 } [get_ports {CLOCK3_50}] create_clock -name {PHY_RX_CLOCK} -period 8.000 -waveform { 0.000 4.000 } [get_ports { ENET0_RX_CLK }] create_clock -name {PHY_TX_CLOCK} -period 8.000 -waveform { 0.000 4.000 } [get_ports { ENET0_TX_CLK }] - это пин с PHY контроллера #************************************************************** # Create Generated Clock #************************************************************** create_generated_clock -name {PHY_TX_CLOCK_2} -source [get_ports {ENET0_TX_CLK}] -duty_cycle 50.000 -multiply_by 1 -divide_by 2 -master_clock {PHY_TX_CLOCK} [get_nets {gen_tx_clock_2}] Кусок из верхнего уровня, который генерит PHY_TX_CLOCK_2 GLOBAL tx_clk_inst1 (.in( !ENET0_TX_CLK ), .out(PHY_TX_CLOCK)); // Делает линию PHY_TX_CLOCK глобальной тактовой // generate PHY_TX_CLOCK/2 for 100T wire PHY_TX_CLOCK_2; reg gen_tx_clock_2; always @ (posedge PHY_TX_CLOCK) gen_tx_clock_2 <= ~gen_tx_clock_2; GLOBAL tx_clk_inst2 (.in( gen_tx_clock_2 ), .out(PHY_TX_CLOCK_2)); // Глобальная линия для TX_CLK/2 module Tx_MAC ( Tx_clock, Tx_clock_2, IF_rst, Send_ARP,ping_reply, PHY_Tx_data, PHY_Tx_rdused, ping_data, LED, Tx_fifo_rdreq, Tx_CTL, ARP_sent, ping_sent, TD, DHCP_discover, DHCP_discover_sent, This_MAC,SIADDR, DHCP_request, DHCP_request_sent, METIS_discovery, PC_IP, PC_MAC, Port, This_IP, METIS_discover_sent, ARP_PC_MAC, ARP_PC_IP, Ping_PC_MAC, Ping_PC_IP, Length, speed_100T, Tx_reset, run, wide_spectrum, IP_valid, printf, IP_lease, DHCP_IP, DHCP_MAC, DHCP_request_renew, DHCP_request_renew_sent, erase_done, erase_done_ACK, send_more, send_more_ACK, Hermes_serialno, sp_fifo_rddata, sp_fifo_rdreq, sp_fifo_rdempty, sp_fifo_rdused, have_sp_data, AssignIP, pll_data, send_pll_data, send_pll_data_ACK ); input Tx_clock; // 25MHz for 100T input Tx_clock_2; // clock/2 input IF_rst; // reset signal input Send_ARP; // high to send ARP response input ping_reply; // high to send ping response input [7:0]PHY_Tx_data; // data to send to PHY input [10:0]PHY_Tx_rdused; // data available in Tx fifo input [7:0]ping_data[0:59]; // data to send back input DHCP_discover; // high when requested input [47:0]This_MAC; // MAC address of this Metis board input [31:0]SIADDR; // IP address of server that provided IP address input DHCP_request; // high when request required input METIS_discovery; // high when reply required input [31:0]PC_IP; // IP address of the PC we are connecting to input [47:0]PC_MAC; // MAC address of the PC we are connecting to input [15:0]Port; // Port on the PC we are sending to input [31:0]This_IP; // IP address provided by PC or DHCP at start up input [47:0]ARP_PC_MAC; // MAC address of PC requesting ARP input [31:0]ARP_PC_IP; // IP address of PC requesting ARP input [47:0]Ping_PC_MAC; // MAC address of PC requesting ping input [31:0]Ping_PC_IP; // IP address of PC requesting ping input [15:0]Length; // Lenght of packet - used by ping input speed_100T; // high for 100T,low for 1000T ************ check input Tx_reset; // high to prevent I&Q data being sent input run; // high to enable data to be sent input wide_spectrum; // high to enable wide spectrum data to be sent input IP_valid; // high when we have a valid IP address input printf; // high when we want to send debug data input [31:0]IP_lease; // *** test data - IP lease time in seconds input [31:0]DHCP_IP; // IP address of DHCP server input [47:0]DHCP_MAC; // MAC address of DHCP server input DHCP_request_renew; // set when renew required input erase_done; // set when we what to tell the PC we have completed the EPCS16 erase input send_more; // set when we want the next block of 256 bytes for the EPCS16 input [7:0]Hermes_serialno; // Hermes code version input [7:0]sp_fifo_rddata; // raw ACD data from Mercury for wide bandscope input sp_fifo_rdempty; // SP_fifo read empty input [12:0]sp_fifo_rdused; // SP_fifo contents input have_sp_data; // high when sp_fifo is full. input [31:0]AssignIP; // IP address read from EEPROM input [7:0] pll_data [0:32]; // Массив регистров pll input send_pll_data; output send_pll_data_ACK; output LED; // show MAC is doing something! output Tx_fifo_rdreq; // high to indicate read from Tx fifo required output Tx_CTL; // high to enable write to PHY output ARP_sent; // high indicates ARP has been sent output ping_sent; // high indicates ping reply has been sent output [3:0]TD; // nibble to send to PHY output DHCP_discover_sent; // high when has been sent output DHCP_request_sent; // high when has been sent output METIS_discover_sent; // high when has been sent ** pulse output DHCP_request_renew_sent; // high when has been sent output erase_done_ACK; // set when we have sent erase of EPCS16 complete to PC output send_more_ACK; // set when we confirm we have requested more EPCS data from PC output sp_fifo_rdreq; // SP_fifo read require signal // HPSDR specific parameter HPSDR_frame = 8'h01; // HPSDR Frame type parameter HPSDR_IP_frame = 8'h03; // Read IP Frame type // parameter end_point = 8'h06; // HPSDR end point - 6 to indicate fifo write parameter Type_1 = 8'hEF; // Ethernet Frame type parameter Type_2 = 8'hFE; localparam TxPort = 16'd1024; // Metis 'from' port //localparam IP_MAC = 48'h00_22_33_44_55_66; // MAC address used for setting and reading IP address localparam RESET = 1, UDP = 2, // METIS_DISCOVERY = 4, ARP = 8, PING1 = 16, PING2 = 32, // DHCP_DISCOVER = 64, // DHCP_REQUEST = 128, // DHCP_REQUEST_RENEW = 256, // PRINTF = 512, // SPECTRUM = 1024, // SENDIP = 11, CRC = 2048, // TEST_PACKET = 4096, PLL_DATA = 8192; wire [7:0]ping_data[0:59]; // data to send back wire [31:0] CRC32; // holds 802.3 CRC result reg [31:0] temp_CRC32 = 0; reg [31:0] sequence_number = 0; reg [31:0] spec_seq_number = 0; reg sp_fifo_rdreq; reg DHCP_request_sent; reg Tx_fifo_rdreq; reg METIS_discover_sent; reg DHCP_discover_sent; reg [15:0] state_Tx; // state for FX2 reg [10:0] data_count; reg [10:0] sp_data_count; reg reset_CRC; reg [7:0] Tx_data; reg [4:0] gap_count; reg ARP_sent; // true when we have replied to an ARP request reg LED; // Test LED reg erase_done_ACK; // set when we have sent erase of EPCS16 complete to PC reg send_more_ACK; // set when we confirm we have requested more EPCS data from PC reg [31:0]Discovery_IP; // IP address of PC doing Discovery reg [47:0]Discovery_MAC; // MAC address of PC doing Discovery reg [15:0]Discovery_Port; // Port Address of PC doing Discovery reg [7:0]end_point; // USB end point equivalent 8'h06 for IQ data and 8'h04 for Spectrum reg [4:0]IP_count; // holds shift count when sending IP to PHY TX fifo wire [15:0]DHCP_length; wire [15:0]UDP_DHCP_length; wire [15:0]DHCP_req_length; wire [15:0]UDP_DHCP_req_length; wire [15:0]DHCP_req_renew_length; wire [15:0]UDP_DHCP_req_renew_length; reg [9:0] rdaddress; reg [7:0] pkt_data; reg [7:0] ck_count; reg [31:0]ping_check_temp; reg [15:0]ping_check_sum; reg ping_sent; reg [8:0] zero_count; reg [3:0]interframe; reg xprintf; reg DHCP_request_renew_sent; reg Metis_discover_sent; reg [7:0] frame; // HPSDR frame type; 0x02 for Discovery reply, // 0x03 for EPCS16 erase complete and // 0x04 for send next 256 bytes for EPCS16 program reg [31:0]temp_IP; // holds IP address from EEPROM whilst we are shifting reg [4:0]PHY_state; reg sync_Tx_CTL; reg [3:0] sync_TD; assign Reset = IF_rst; // Set reset signal to IF_rst // calculate the IP checksum, big-endian style // The 0xC935 is fixed and made up of the 16 bit add of the header data. *** this will need changing if we change payload size **** // i.e. 0x4500 + 0x0424 + 0x8011 = 0xC935 // then add the IPsource and IPDesitination in 16 bits using 1's complement and then complement // calculate the UDP/IP checksum wire [31:0]IPchecksum1; wire [31:0]IPchecksum2; wire [15:0]IPchecksum3; assign IPchecksum1 = 32'h0000C935 + This_IP[31:16] + This_IP[15:0] + PC_IP[31:16] + PC_IP[15:0]; assign IPchecksum2 = ((IPchecksum1 & 32'h0000FFFF) + (IPchecksum1 >> 16)); // 1's complement add, shift the higher order bits and add assign IPchecksum3 = ~((IPchecksum2 & 32'h0000FFFF) + (IPchecksum2 >> 16)); // again, then complement // calculate the UDP/IP checksum for Metis discovery wire [31:0]DISchecksum1; wire [31:0]DISchecksum2; wire [15:0]DISchecksum3; assign DISchecksum1 = 32'h00004500 + 32'h00000058 + 32'h00008011 + This_IP[31:16] + This_IP[15:0] + Discovery_IP[31:16] + Discovery_IP[15:0]; assign DISchecksum2 = ((DISchecksum1 & 32'h0000FFFF) + (DISchecksum1 >> 16)); // 1's complement add, shift the higher order bits and add assign DISchecksum3 = ~((DISchecksum2 & 32'h0000FFFF) + (DISchecksum2 >> 16)); // again, then complement // calculate the IP checksum for ICMP (ping) wire [31:0]ICMPchecksum1; wire [31:0]ICMPchecksum2; wire [15:0]ICMPchecksum3; assign ICMPchecksum1 = 32'h00004500 + Length + 32'h00008001 + This_IP[31:16] + This_IP[15:0] + Ping_PC_IP[31:16] + Ping_PC_IP[15:0]; assign ICMPchecksum2 = ((ICMPchecksum1 & 32'h0000FFFF) + (ICMPchecksum1 >> 16)); // 1's complement add, shift the higher order bits and add assign ICMPchecksum3 = ~((ICMPchecksum2 & 32'h0000FFFF) + (ICMPchecksum2 >> 16)); // again, then complement // calculate the IP checksum for DHCP discovery wire [31:0]DHCPchecksum1; wire [31:0]DHCPchecksum2; wire [15:0]DHCPchecksum3; assign DHCPchecksum1 = 32'h00004500 + UDP_DHCP_length + 32'h00008011 + 32'h0000FFFF + 32'h0000FFFF; assign DHCPchecksum2 = ((DHCPchecksum1 & 32'h0000FFFF) + (DHCPchecksum1 >> 16)); // 1's complement add, shift the higher order bits and add assign DHCPchecksum3 = ~((DHCPchecksum2 & 32'h0000FFFF) + (DHCPchecksum2 >> 16)); // again, then complement // calculate IP checksum for DHCP request wire [31:0]DHCP_req_checksum1; wire [31:0]DHCP_req_checksum2; wire [15:0]DHCP_req_checksum3; assign DHCP_req_checksum1 = 32'h00004500 + UDP_DHCP_req_length + 32'h00008011 + 32'h0000FFFF + 32'h0000FFFF; assign DHCP_req_checksum2 = ((DHCP_req_checksum1 & 32'h0000FFFF) + (DHCP_req_checksum1 >> 16)); // 1's complement add, shift the higher order bits and add assign DHCP_req_checksum3 = ~((DHCP_req_checksum2 & 32'h0000FFFF) + (DHCP_req_checksum2 >> 16)); // again, then complement // calculate IP checksum for DHCP request renew wire [31:0]DHCP_req_renew_checksum1; wire [31:0]DHCP_req_renew_checksum2; wire [15:0]DHCP_req_renew_checksum3; assign DHCP_req_renew_checksum1 = 32'h00004500 + UDP_DHCP_req_renew_length + 32'h00008011 + This_IP[31:16] + This_IP[15:0] + DHCP_IP[31:16] + DHCP_IP[15:0]; assign DHCP_req_renew_checksum2 = ((DHCP_req_renew_checksum1 & 32'h0000FFFF) + (DHCP_req_renew_checksum1 >> 16)); // 1's complement add, shift the higher order bits and add assign DHCP_req_renew_checksum3 = ~((DHCP_req_renew_checksum2 & 32'h0000FFFF) + (DHCP_req_renew_checksum2 >> 16)); // again, then complement always @ * case(rdaddress) //---------- UDP/IP packet -------- // Ethernet preamble 0 : pkt_data <= 8'h55; 1 : pkt_data <= 8'h55; 2 : pkt_data <= 8'h55; 3 : pkt_data <= 8'h55; 4 : pkt_data <= 8'h55; 5 : pkt_data <= 8'h55; 6 : pkt_data <= 8'h55; 7 : pkt_data <= 8'hD5; // Ethernet header 8 : pkt_data <= PC_MAC[47:40]; 9 : pkt_data <= PC_MAC[39:32]; 10: pkt_data <= PC_MAC[31:24]; 11: pkt_data <= PC_MAC[23:16]; 12: pkt_data <= PC_MAC[15:8]; 13: pkt_data <= PC_MAC[7:0]; 14: pkt_data <= This_MAC[47:40]; 15: pkt_data <= This_MAC[39:32]; 16: pkt_data <= This_MAC[31:24]; 17: pkt_data <= This_MAC[23:16]; 18: pkt_data <= This_MAC[15:8]; 19: pkt_data <= This_MAC[7:0]; 20: pkt_data <= 8'h08; 21: pkt_data <= 8'h00; // IP header 22: pkt_data <= 8'h45; // Version 23: pkt_data <= 8'h00; // Type of service 24: pkt_data <= 8'h04; // length ***** CHANGE CHECKSUM IF LENGTH CHANGES ***** вырезал кусок .... 858: pkt_data <= 8'h00; 859: pkt_data <= 8'h00; default: pkt_data <= 0; endcase // to calculate length; 8 + (end - DHCP_start + 1) + nulls + 202 assign DHCP_length = 16'd8 + (16'd367 - 16'd350 + 16'd1) + 16'd24 + 16'd202; // 8 + 244 assign UDP_DHCP_length = DHCP_length + 16'd20; assign DHCP_req_length = 16'd8 + (16'd479 - 16'd450 + 16'd1) + 16'd24 + 16'd202; // 8 + 256 assign UDP_DHCP_req_length = DHCP_req_length + 16'd20; assign DHCP_req_renew_length = 16'd8 + (16'd779 - 16'd750 + 16'd1) + 16'd12 + 16'd202; // 8 + 244 assign UDP_DHCP_req_renew_length = DHCP_req_renew_length + 16'd20; always @ (negedge Tx_clock_2 or posedge Reset) // clock at half speed since we read bytes but write nibbles begin if (Reset) begin state_Tx <= RESET; end else begin case(state_Tx) RESET: begin LED <= 1'b0; sync_Tx_CTL <= 1'b0; data_count <= 0; reset_CRC <= 0; rdaddress <= 0; ARP_sent <= 0; ping_sent <= 0; ping_check_temp <= 0; // reset ping check sum calculation ck_count <= 0; zero_count <= 0; DHCP_discover_sent <= 0; DHCP_request_sent <= 0; METIS_discover_sent <= 0; DHCP_request_renew_sent <= 0; interframe <= 0; erase_done_ACK <= 0; send_more_ACK <= 0; IP_count <= 0; if (IF_rst) state_Tx <= RESET; else begin if (run == 1'b0) begin sequence_number <= 0; // reset sequence numbers when not running. spec_seq_number <= 0; end //-------- if (Send_ARP) begin // Pending ARP request rdaddress <= 100; // point to start of ARP table state_Tx <= ARP; end else if (ping_reply)begin rdaddress <= 200; // point to ping checksum code state_Tx <= PING1; end else if (send_pll_data) begin rdaddress <= 0; state_Tx <= PLL_DATA; end else state_Tx <= RESET; end end // start sending UDP/IP data UDP: begin end_point <= 8'h06; // USB I&Q equivalent end point - EP6 if (rdaddress != 58) // keep sending until we reach the end of the fixed data begin Tx_data <= pkt_data; sync_Tx_CTL <= 1'b1; // enable write to PHY rdaddress <= rdaddress + 1'd1; state_Tx <= UDP; end else // read the Tx fifo data begin if (data_count < 1024) begin Tx_data <= PHY_Tx_data; data_count <= data_count + 1'd1; // increment loop counter state_Tx <= UDP; end else begin temp_CRC32 <= CRC32; // grab the CRC data since it will change next clock pulse Tx_data <= CRC32[7:0]; // send CRC32 to PHY rdaddress <= 58; // point to end of CRC table sequence_number <= sequence_number + 1'b1; // increment sequence number state_Tx <= CRC; end end // done, so now add the remainder of the CRC32 if (rdaddress == 57) Tx_fifo_rdreq <= 1'b1; // enable read from Tx_fifo on next clock if (data_count == 1023) Tx_fifo_rdreq <= 1'b0; // stop reading from Tx_fifo if (rdaddress == 7) reset_CRC <= 1'b1; // start CRC32 generation else reset_CRC <= 1'b0; end // respond to pending ARP request, just read straight through the table ARP: begin if (rdaddress != 150) begin sync_Tx_CTL <= 1'b1; // enable write to PHY Tx_data <= pkt_data; rdaddress <= rdaddress + 1'd1; state_Tx <= ARP; end else if (zero_count < 18)begin // send 18 x 0x00s Tx_data <= 8'h00; zero_count <= zero_count + 1'b1; state_Tx <= ARP; end else begin ARP_sent <= 1'b1; // set APR sent flag temp_CRC32 <= CRC32; // grab the CRC data since it will change next clock pulse Tx_data <= CRC32[7:0]; // send CRC32 to PHY rdaddress <= 58; // point to end of CRC table state_Tx <= CRC; end if (rdaddress == 107) reset_CRC <= 1'b1; // start CRC32 generation else reset_CRC <= 1'b0; end // Calculate ping checksum. Ping data is in bytes, convert to 16 bits then // sum, apply one's complement then complement PING1: begin if (ck_count != (Length - 24)) begin // add all the ping data as 16 bits, ping_check_temp <= ping_check_temp + {16'b0,ping_data[ck_count], ping_data[ck_count + 1]}; ck_count <= ck_count + 8'd2; // get next two bytes state_Tx <= PING1; end else if (ping_check_temp >> 16 != 0) begin // do one's complement ping_check_temp <= ((ping_check_temp & 32'h0000FFFF) + (ping_check_temp >> 16)); state_Tx <= PING1; end else begin // complement and move to next state ping_check_sum <= ~ping_check_temp[15:0]; state_Tx <= PING2; end end // respond to ping PING2: begin if (rdaddress != 246) // keep sending until we reach the end of the fixed data begin Tx_data <= pkt_data; sync_Tx_CTL <= 1'b1; // enable write to PHY rdaddress <= rdaddress + 1'b1; state_Tx <= PING2; end else if (data_count < (Length - 24)) begin // send contents of ping_data in bytes Tx_data <= ping_data[data_count]; data_count <= data_count + 1'd1; // increment loop counter state_Tx <= PING2; end else begin ping_sent <= 1'b1; // set ping sent flag temp_CRC32 <= CRC32; // grab the CRC data since it will change next clock pulse Tx_data <= CRC32[7:0]; // send CRC32 to PHY rdaddress <= 58; // point to end of CRC table state_Tx <= CRC; end if (rdaddress == 207) reset_CRC <= 1'b1; // start CRC32 generation else reset_CRC <= 1'b0; end // send raw data PLL_DATA: begin if (rdaddress != 58) // keep sending until we reach the end of the fixed data begin // but skip sequence number Tx_data <= pkt_data; sync_Tx_CTL <= 1'b1; // enable write to PHY rdaddress <= rdaddress + 1'd1; state_Tx <= PLL_DATA; end else // read the Tx fifo data begin if (sp_data_count == 0) begin // Первым должны передать код команды Tx_data <= 8'h80; // Код 0x80 - пакет состояния PLL sp_data_count <= sp_data_count + 1'b1; // increment loop counter state_Tx <= PLL_DATA; end else if (sp_data_count <=33) begin // отправляем массив данных Tx_data <= pll_data[sp_data_count-1]; sp_data_count <= sp_data_count + 1'b1; // increment loop counter state_Tx <= PLL_DATA; end else if (sp_data_count != 1024) begin // заполняем оставшееся место Tx_data <= 8'h55; sp_data_count <= sp_data_count + 1'b1; // increment loop counter state_Tx <= PLL_DATA; end else begin sp_data_count <= 0; // reset data counter for next time temp_CRC32 <= CRC32; // grab the CRC data since it will change next clock pulse Tx_data <= CRC32[7:0]; // send CRC32 to PHY rdaddress <= 58; // point to end of CRC table sequence_number <= sequence_number + 1'b1; // increment sequence number state_Tx <= CRC; end end // done, so now add the remainder of the CRC32 if (rdaddress == 7) reset_CRC <= 1'b1; // start CRC32 generation else reset_CRC <= 1'b0; end // add remainder of CRC32 CRC: begin if (rdaddress != 61) begin Tx_data <= pkt_data; rdaddress <= rdaddress + 1'b1; state_Tx <= CRC; end else begin sync_Tx_CTL <= 1'b0; // disable PHY write if (interframe == 10) begin // delay between frames should be 960/96nS min state_Tx <= RESET; // send complete, loop back to start end else interframe <= interframe + 1'b1; end end default: state_Tx <= RESET; endcase end end //------------------------------ // 802.3 CRC32 Calculation //------------------------------- CRC32 CRC32_inst(.rst(reset_CRC),.clk(Tx_clock_2), .data(Tx_data), .crc(CRC32)); //----------------------------------------------------------- // Send data to PHY //----------------------------------------------------------- // Data to send is in Tx_data in bytes. // For 100T, when sync_Tx_CTL is true we alternate sending low and high nibbles always @ (negedge Tx_clock or posedge Reset) begin if (Reset) PHY_state <=0; else case (PHY_state) // send low nibble 0: begin if (sync_Tx_CTL) begin sync_TD <= Tx_data[3:0]; PHY_state <= 1'b1; end else PHY_state <= 0; end // now send high nibble 1: begin sync_TD <= Tx_data[7:4]; PHY_state <= 0; end endcase end // sync data to PHY on Tx clock, clock PHY on ~Tx_clock so we clock in middle of data always @ (posedge Tx_clock) begin TD <= sync_TD; Tx_CTL <= sync_Tx_CTL; end reg [3:0]TD; reg Tx_CTL; endmodule
  21. Тогда никак не пойму, почему у меня через день, два статус компиляции слетает.
  22. В Xilinx ISE я новичок. Есть проект сделаный в ISE и XPS . Там есть Microblaze. Код для проца собираю в SDK. Для того чтобы получился рабочий bit файл мне нужно перекомпилить весь проект в ISE - это очень долго. Как можно быстро обновить bit файл новым кодом из elf ? И еще попутно спрошу. Почему если я проект открою, например, через пару дней, то вместо желтых треугольников или чего либо, напротив процессов сборки, становятся оранжевые вопросы (как будто проект не скомпилирован) и требует обязательной перекомпиляции ? Хотя в проекте ничего не менялось. Как это отключить ?
  23. Спасибо, коллега, а вот про китайский я и не подумал. А типовые схемы в инете не попадались ? А то что то мои поиски не увенчались успехом.
  24. Подскажите, а как раньше делали логарифмические детекторы до того момента пока появились готовые микросхемы типа AD8307 итд. Хочу ради эксперимента сделать логирифмический детектор с ДД около 40-50 Дб, диапазон частот 1-40 МГц. Насколько это сложно и не оправдано ? Киньте ссылками на подобные схемы.
×
×
  • Создать...