Jump to content

    

Abo

Свой
  • Content Count

    102
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Abo

  • Rank
    Частый гость

Recent Profile Visitors

1199 profile views
  1. Кадый такт к счетчику прибавляете M и сравниваете резльтат с N. Если значение в счетчике больше или равно N, то формируете импульс на шаг и разность счетчика и N пишете в счетчик. Обнулять счетчик при смене N и M не нужно.
  2. Мне тоже потребовалось сделать кордик для расчета арктангенса. Воспользовался этим кодом. Благодарю автора. Со своей стороны прикладываю немного ускоренный вариант с хранением сдвинутого предыдущего значения в отдельном регистре. До изменения на 10M50 максимальная тактовая была не более 119МГц, после выросла до 137МГц. Мне нужно было чтобы при 120МГц работало. module cordic_core #( parameter SIG_W = 18, parameter ACC_W = 20 )( input rst, input clk, input req, input ccwr, input signed [SIG_W:0] x_i, input signed [SIG_W:0] y_i, input signed [ACC_W+1:0] a_i, output rdy, output busy, output reg signed [SIG_W:0] x_o, output reg signed [SIG_W:0] y_o, output reg signed [ACC_W+1:0] a_o ); `define ANG_SCALE(s) (ACC_W < 32) ? \ (ACC_W+2)'(unsigned'(``s`` >>> (32-ACC_W)) + unsigned'(1'(``s`` >> (32-ACC_W-1)))) : \ (ACC_W+2)'(``s``) localparam logic signed [ACC_W+1:0] ANG_TABLE[31] = '{ `ANG_SCALE(32'sd536870912), `ANG_SCALE(32'sd316933406), `ANG_SCALE(32'sd167458907), `ANG_SCALE(32'sd85004756), `ANG_SCALE(32'sd42667331), `ANG_SCALE(32'sd21354465), `ANG_SCALE(32'sd10679838), `ANG_SCALE(32'sd5340245), `ANG_SCALE(32'sd2670163), `ANG_SCALE(32'sd1335087), `ANG_SCALE(32'sd667544), `ANG_SCALE(32'sd333772), `ANG_SCALE(32'sd166886), `ANG_SCALE(32'sd83443), `ANG_SCALE(32'sd41722), `ANG_SCALE(32'sd20861), `ANG_SCALE(32'sd10430), `ANG_SCALE(32'sd5215), `ANG_SCALE(32'sd2608), `ANG_SCALE(32'sd1304), `ANG_SCALE(32'sd652), `ANG_SCALE(32'sd326), `ANG_SCALE(32'sd163), `ANG_SCALE(32'sd81), `ANG_SCALE(32'sd41), `ANG_SCALE(32'sd20), `ANG_SCALE(32'sd10), `ANG_SCALE(32'sd5), `ANG_SCALE(32'sd3), `ANG_SCALE(32'sd1), `ANG_SCALE(32'sd1) }; `undef ANG_SCALE localparam CNT_W = $clog2(ACC_W+1); localparam [CNT_W-1:0] LAST_CNT = (CNT_W)'(ACC_W) - 1'b1; logic busy_t1; logic [4:0] i; // Изначально разрядность была настраиваемой [CNT_W-1:0], изменил чтобы квартус не предупреждал. logic signed [SIG_W:0] x_s, y_s; assign busy = (i < LAST_CNT); assign rdy = (~busy & busy_t1); wire signed [SIG_W:0] next_x_o = (ccwr) ? (x_o - y_s) : (x_o + y_s); wire signed [SIG_W:0] next_y_o = (ccwr) ? (y_o + x_s) : (y_o - x_s); wire signed [SIG_W:0] next_x_s = signed'(next_x_o >>> (i+1'b1)); wire signed [SIG_W:0] next_y_s = signed'(next_y_o >>> (i+1'b1)); always_ff @(posedge clk, posedge rst) begin if(rst) begin busy_t1 <= 0; i <= '1; x_o <= 0; y_o <= 0; x_s <= 0; y_s <= 0; a_o <= 0; end else begin busy_t1 <= busy; if(req | busy) if(req) begin i <= 0; x_o <= x_i; y_o <= y_i; x_s <= x_i; y_s <= y_i; a_o <= a_i; end else begin i <= i + 1'b1; x_o <= next_x_o; //(ccwr) ? (x_o - y_s) : (x_o + y_s); y_o <= next_y_o; //(ccwr) ? (y_o + x_s) : (y_o - x_s); x_s <= next_x_s; y_s <= next_y_s; a_o <= a_o + (ccwr ? ANG_TABLE[i] : -ANG_TABLE[i]); //(ccwr) ? (a_o + ANG_TABLE[i]) : (a_o - ANG_TABLE[i]); end end end endmodule
  3. К сожалению не оно. При этом запускается еще одна копия отладочной DLL и контрольной панели. В ней можно установить адрес командой exec SetRTTAddr и подключиться вьюером. Но при начале отладки будет запущена новая копия отладочной Dll, которая адрес уже не знает, загрузка и отладка будет идти через нее и после кейл упадет.
  4. По прочтению статьи Дебаггинг в реальном времени через JTAG/SWJ-DP для микроконтроллеров на ядре ARM Cortex-M, решил попробовать рецепт на ядре M4 мк LPC4337. Столкнулся со следующей трудностью: сервер отладки, который запускается IDE в начале отладочного сеанса не находит автоматически адрес структуры _SEGGER_RTT в ОЗУ. Ввести адрес вручную на вкладке RTTerminal окна "Control panel" не получается - там какое-то странное поле ввода, которое само постоянно обновляется (у меня версия софта 5.00I). В мануале от сеггера предлагают заставить отладчик самостоятельно передать адрес: In some cases J-Link cannot locate the RTT buffer in the known RAM region. In this case the possible region or the exact address can be set manually via a J-Link exec command: Set ranges to be searched for RTT buffer: SetRTTSearchRanges <RangeStart [Hex]> <RangeSize >[, <Range1Start [Hex]> <Range1Size>, ...] (e.g. "SetRTTSearchRanges 0x10000000 0x1000, 0x2000000 0x1000") Set address of the RTT buffer: SetRTTAddr <RTTBufferAddress [Hex]> (e.g. "SetRTTAddr 0x20000000") Set address of the RTT buffer via J-Link Control Panel -> RTT J-Link exec commands can be executed in most applications, for example in J-Link Commander via "exec <Command>", in J-Link GDB Server via "monitor exec <Command>" or in IAR EW via "__jlinkExecCommand("<Command>");" from a macro file. вот только как это сделать в Кейле тут не указано. Кстати, Если попытаться с помощью JLinkRTTViewer открыть еще одну сессию (при запуске этой утилиты можно указать адрес структуры _SEGGER_RTT) то отладочный вывод идет, но после выхода из отладочного режима в кейле и закрытия JLinkRTTViewer, кейл падает. Если же запускать JLinkRTTViewer так, чтобы он подключалась к уже запущенному отладочному процессу и потом автоматически реконнектился к нему, то естественно вывода нет - поскольку адрес структуры не найден, и задать его во вьюере нельзя. Прошу указать способ, как в отладчике кейла послать команду JLink серверу?
  5. У nxp или ad поищите не тему видеоАЦП ( ADV7xxx - что-такое), в них как правило и коммутатор не несколько источников есть. Эти АЦП имеют на выходе синхронный параллельный (а может есть и с последовательным) интерфейс для содержания и сигналов синхронизации (кадры и строки). Таким образом -для приема с АЦП синхронный интерфейс с ПДП и ОЗУ на кадр. Но четкость с обычной видеокамеры наверняка будет не очень. Я бы предпочел построить систему на IP камерах и озаботиться лишь обеспечением канала связи (камеры должны частоту кадров под канал подстраивать) и ничего не придумывать - все уже придумали за нас, надо только правильно воспользоваться.
  6. Любая 32х разрядная винда (даже семерка) не требует цифровой подписи от драйвера и прекрасно его грузит. А вот 64х разрядные версии, начиная с Vista, грузят драйверы без подписи только в специальном - тестовом режиме (при этом в углах или сверу рабочего стола отображается надпись "Test Mode"). Переключиться в этот режим можно с помощью утилиты bcdedit.
  7. А нельзя ли заполучить от Вас эту новую версию документа, а то на ТИ до сих пор старая еще лежит.
  8. Я вот так половину тактовой частоты периферии подаю на вывод 46 // Настраиваем входные и выходные сигналы PINSEL0 = (PINSEL0 & ~(0)) | 0x0; // Вывод 46-P0.16 как MAT0.2 // Вывод 3-P0.21 как МАТ3.0 PINSEL1 = (PINSEL1 & ~((3<<0)|(3<<2)|(3<<4)|(3<<6)|(3<<8)|(3<<10))) | ((2<<0)|(2<<6)|(2<<8)|(2<<10)); // Настраиваем таймер 0 на выдачу сигнала SCK частотой 12,8 МГц - половина тактовой PCONP |= PCONP_PCTIM0; // Подаем питание на таймер T0TCR = 2; // Остановим и сбросим таймер T0CTCR = 0; // Работа в режиме таймера T0PR = 0; // Предделитель не используется - на таймер подается CCLK 25,6 МГц T0MR0 = 1; // Определяет период выходного сигнала T0MR2 = 1; // Определяет период выходного сигнала T0MCR = T0MCR_MR0R; // Сброс по совпадению с MR0 T0EMR = 0; T0CCR = 0; // Запретить режим захвата по всем входам PWM0CON = 1<<2; // Разрешим генерацию PWM на выходе MAT0.2
  9. резисторы нужны не для защиты от статики, а для снижения уровня излучаемых помех за счет завала крутых фронтов сигналов. Для этого кроме резисторов еще и кондюки на 27 пик ставят на землю на каждую линию данных. Правда это работает только для Low и Full Speed. На High Speed не знаю что ставить.
  10. На мой взгляд, экран USB разъема в устройстве не стоит соединять с минусом питания дросселем. Для этого рекомендуют использовать цепочку из параллельно включенных конденсатора 1000 пик на 250В и резистора 1МОм, через который этот конденсатор будет разряжаться при необходимости. Подобное включение предотвратит протекание по экрану USB кабеля уравнивающего тока промышленной частоты и в то же время обеспечит путь для стекания наносекундных импульсных помех. Без большой нужды не стал бы соединять минус источника питания с сетевым заземлением, правда если корпус самого устройства не железный. Ну а если есть такая необходимость - тогда придется USB интерфейс в устройстве гальванически изолировать от основного источника питания. В противном случае по экрану кабеля USB обязательно потечет уравнивающий ток, если заземляющий проводник в одной из розеток поврежден.
  11. Ну в общем получилось настроить. в /etc/udev/rules.d есть набор файлов с правилами, по которым демон udevd создает в каталоге /dev файлы устройств во время их подключения и убирает их в время отключения. в этом каталоге в файле 50-udev-default.rules есть такие строки: # libusb device nodes SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}", MODE="0644" именно в ней и говорится, что при создании файла устройства подходящего под SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device" необходимо файлу устанавливать права доступа MODE="0644". В простейшем случае, изменив MODE="0644" на MODE="0666" можно позволить всем использовать все подключаемые usb устройства. Но я решил поступить в соответствии с рекомендациями http://citkit.ru/articles/245/ http://citkit.ru/articles/245/ и создал в этом каталоге /etc/udev/rules.d файл 10-local.rules в который вписал одну строку: SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{product}=="ABOJTAG", NAME="/bus/usb/$env{BUSNUM}/$env{DEVNUM}", GROUP="usb", MODE="0664" где ABOJTAG = содержание строкового дескриптора ProductId из дескриптора устройства моей FT2232. Теперь при подключении устройства в каталоге /dev/bus/usb/001 создается файл с правами для группы usb на чтение и запись. Группу usb я создал и включил себя в нее. Теперь программа jtag и прочие примеры из поставки libftdi не ругаются если я из запускаю из под своей учетной записи, чего я собственно и добивался.
  12. Все правильно, /dev/ttyUSB0 и /dev/ttyUSB1 имеют группу "uucp" с правами на запись и чтение, только незадача, программы jtag и gdbproxy работают через библиотеку libftdi, которая в свою очередь работает через libusb, которая хочет открывать не виртуальные компорты /dev/tty*. а хочет открыть непосредственно файл устройства /dev/bus/usb/001/007, в полном имени файла последние числа это номер контролера USB и номеp устройства на шине этого контроллера. Права доступа к этому файлу и хочется поменять, а они: crw-r--r-- 1 root root 189, 6 Июл 29 14:49 007 . Насколько я понял из интернета - за создание и назначение прав отвечает пакет udev. Вот с ним и разбираюсь сейчас.
  13. Вот кусок из того что выдает dmesg при подключении ft2232 usb 1-1: new full speed USB device using uhci_hcd and address 8 usb 1-1: configuration #1 chosen from 1 choice ftdi_sio 1-1:1.0: FTDI USB Serial Device converter detected drivers/usb/serial/ftdi_sio.c: Detected FT2232C usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0 ftdi_sio 1-1:1.1: FTDI USB Serial Device converter detected drivers/usb/serial/ftdi_sio.c: Detected FT2232C usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB1 usb 1-1: New USB device found, idVendor=0403, idProduct=6001 usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-1: Product: ABOJTAG usb 1-1: Manufacturer: Abo usb 1-1: SerialNumber: 00000002 usb 1-2: new full speed USB device using uhci_hcd and address 9 usb 1-2: configuration #1 chosen from 1 choice hub 1-2:1.0: USB hub found