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

    

RobFPGA

Свой
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

1 Подписчик

Информация о RobFPGA

  • Звание
    Профессионал

Посетители профиля

9 899 просмотров профиля
  1. Приветствую! Странно - мне наоборот это кажется достоинством - сразу видно к чему структура относится. Думаете так будет понятнее? const struct { struct { step_speed_t rpm_1 ; step_speed_t rpm_10 ; step_speed_t rpm_100; } speed; u32_t ddd; } ic_step = '{speed:'{rpm_1:5, rpm_10:6, rpm_100:7}, ddd:8}; Это объявление не константы а типа структуры коей будет соответствовать константа (или еще что). А тут как раз объявляется и заодно инитится константа ic_usb. Поэтому в нормальных редакторах проблем не будет куда прыгать - так как тип переменной и сама переменная это разные сущности. Опять же имея отдельно тип а отдельно котлеты переменные можно легко добавить "этажности" в иерархию const st_STEP_SPEED_t c_spped_a = '{rpm_1:5, rpm_10:6, rpm_100:7}; const st_STEP_SPEED_t c_spped_b = '{rpm_1:8, rpm_10:9, rpm_100:10}; const st_IC_STEP_t ic_step_a = '{speed:c_spped_a, ccc:8}; const st_IC_STEP_t ic_step_b = '{speed:c_spped_b, ccc:12}; Да и как без типа например передать такую структуру в функцию? А если тип задан то проблем нет. Удачи! Rob.
  2. Приветствую! Иерархия определяется не языком а головой (выражающейся на этом языке) И если в голове "шумит" то можно такого наворотить Успехов! Rob.
  3. Если данные константны и ни как не меняются во времени то зачем нужны эти регистры? Не проще ли сразу назначить нужные уровни на ножки (подумал Qu). Успехов! Rob.
  4. Приветствую! Это конечно должно было все радикально поменять но увы - а как быть с этим ? reg [11:0] DAC = 12'b0; Удачи! Rob.
  5. Почему не будет - посчитает с точностью до гейта . Ну а то что логика вашего дизайна укладывается в 0 гейтов Qu не виноват Удачи! Rob.
  6. Приветствую! И что у вас на ножки выходить должно было? А что реально подключено в исходнике? Qu молодец - с оптимизировал вам ваши хотелки Удачи! Rob.
  7. Приветствую! Так вам еще и для синтеза это нужно? Увы при синтезе доступ через иерархию модулей не поддерживается. Иерархию возможно использовать только в пределах одного модуля. Ну а для упорядочивания можно использовать структуры и package. Удачи! Rob.
  8. Приветствую! Не совсем понятно зачем такое нужно? Какова задача? Откуда и куда будут эти обращения? Удачи! Rob.
  9. Приветствую! Не совсем - сначала написать обертку а потом уж внутри ее уже делать разные реализации c одной и той же функциональностью . Заодно внутри враппера можно сделать некоторый сервис с блекджеком и шлю.. по проверке допустимости комбинаций параметров, логирования актуальной конфигурации, отлов нехороших ситуаций при симуляции, ... Например: // simple dual-port module sdp_ram_wrp #(parameter MODE = "ALTERA_CORE", // "RTL", "ALTERA_RTL", "ALTERA_CORE", "XILINX_RTL", "XILINX_CORE", ... WR_DATA_WH = 8 , // Write port data width WR_BE_WH = 8 , // Write port byte enable width RD_DATA_WH = 8 , // Read port data width DEPTH = 64 , // Number of words (for the wider port) RD_PIPE = 2 // Read pipeline (only 1 or 2) ) ( wr_clk , // write clock wr_addr , // address of write port wr_din , // data of write port wr_ben , // write byte enable wr_wen , // write enable // rd_clk , // Read clock rd_en_i , // Read enable for memory (1st pipeline stage) rd_en_ii , // Read enable for output register (2st pipeline stage) rd_clr_i , // Sync. clear mem register (1st pipeline stage) rd_clr_ii , // Sync. clear output register (2st pipeline stage) rd_addr , // Read address rd_dou // Read data output ); ... generate if (MODE == "RTL") begin : g_rtl ... end else if (MODE == "ALTERA_CORE") begin : g_alt_core ... end else .... ... endgenerate Успехов! Rob.
  10. Приветствую! Нужно просто помнить что в отличии от SW в зависимости от написанного кода RTL будет синтезирован либо в параллельное железо либо в последовательное операции. Запихивать по 8 байт в память не проблема. Смотрите в темплейтах разные варианты Mixed-width RAM. Ну и надо помнить что иногда синтез памяти с несколькими портами и разной шириной не всегда возможен из напрямую из RTL - всегда есть случаи когда выгоднее вручную использовать примитивы памяти конкретного семейства. Поэтому проще сделать для себя модули-врапперы с параметрами, реализующие основные паттерны памяти (single port, simple dual-port, true dual-port, mixed-width, ...) И все извраты по оптимизации делать внутри врапперов. Заодно это не позволит вам в основном коде "случайно" лазить в память "куда ни попадя". Удачи! Rob.
  11. Приветствую! Для того чтобы корректно синтезировалась память нужно чтобы в дизайне были соответствующие паттерны ее использования. Вот вы пишете reg [7:0] current_data_recv[0:41]; предполагая что память будет 42 слова по 8 бит. А используете ее как? current_data_recv[1] <= xgmii_data_rx[63:56]; ... current_data_recv[8] <= xgmii_data_rx[7:0]; как кучу независимых регистров по 8 бит! Если вам нужно делать памяти с разной разрядностью на чтение/запись то надо понимать что физически одновременно доступ можно иметь только к порту с большей шириной. Тесть вам надо определять память как reg [8*8-1:0] current_data_recv[0 : 5]; и разгуливать запись в отдельные байты одного слова через byte_enable. Ну и естественно нельзя использовать reset для инициализации памяти. В Qu/Vivado есть свои темплейты для памяти. На первых порах старайтесь их придерживаться. Удачи! Rob.
  12. Приветствую! Настройка ADC идет статически через уровни на пинах: -тип интерфейса - CMOS/LVDS и режим вывода- SDR/DDR. Как зададите уровни так и будет ADC работать - в даташите это все указанно. LVDS тут задает только тип сигналов - в FPGA нужно работать как с обычным SPI. Успехов! Rob
  13. Приветствую! Удвоить частоту можно и без PLL - задержка на LUT или триггерах и xor. Но это не изменит все принципиально. Удачи! Rob.
  14. Приветствую! Фактически вам нужно сделать в FPGA генератор генерирующий сигнал с максимальными периодом (максимальное время) и синхронизируемый фронтами внешнего сигнала. При чем после синхронизация с фронтом запускается таймер блокировки (минимальное время) синхронизации для следующего фронта. Удачи! Rob.
  15. Приветствую! Начните кушать слона по кусочкам - для начала - измеряемый сигнал синхронен с тактовой или нет? Подозреваю что нет раз у вас фронт детектор глючит . Значит первым делом перевести его в тактовый домен через 2-3 триггера. Увы тут задержки не избежать. Ну а потом все просто - так как счетчик у вас считает монотонно - то для экономии времени сравнивать его с константами можно в процессе счета и по фронту защелкивать результат сравнения. Будет вам экономия 2-ры тактов Удачи! Rob.