ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
1094754 Топик полностью
Mahagam (21.04.2021 23:09, просмотров: 502) ответил Evgeny_CD на Вот тут ты не прав. FPGA Efinix, Gowin дешевые и качественные (для расматриваемых задач), при сотенном тираже можно в $3 влезть. Еще Lattice есть, немного дороже будет. МК для задачи целый один есть на планете. Завтра снимут и ага.
и что самое смешное - переходить между FPGA проще чем между МК!! вендор- и чип-специфичные буквально пара блоков: 100% это PLL, часто скоростное I/O (типа DDR и всякие там сериалайзеры с хитрыми задержками). ну и что-нить редкое типа ADC, DNA, Flash. остальное можно смело описывать простым поведенческим верилогом не заморачиваясь!! 

оно, конечно, и на МК такое есть, ну типа расчёт CRC32 с малыми правками соберётся и на атмеге, и на толстом STM, и на писишке. а вот всякие там буферизированные uart + fifo + прерывания - это туши свет. у каждого вендора свои адреса, свои регистры, свои наборы прерываний, свои расчёты частоты (насколько помню, вроде MSP430 умеет тактируясь от часового кварца уартить на 9600).

а уж как я на OMAP-L138 делал кольцевой uart с закольцованным самоперезапускаемым DMA - это вообще кошмар. я через месяц не мог понять как он там работает!!


а на плисине - если есть умножитель, то совсем не обязательно втыкать этот модуль вида

// DSP48A1: 48-bit Multi-Functional Arithmetic Block
   //          Spartan-6
   // Xilinx HDL Language Template, version 14.7

   DSP48A1 #(
      .A0REG(0),              // First stage A input pipeline register (0/1)
      .A1REG(1),              // Second stage A input pipeline register (0/1)
      .B0REG(0),              // First stage B input pipeline register (0/1)
      .B1REG(1),              // Second stage B input pipeline register (0/1)
      .CARRYINREG(1),         // CARRYIN input pipeline register (0/1)
      .CARRYINSEL("OPMODE5"), // Specify carry-in source, "CARRYIN" or "OPMODE5"
      .CARRYOUTREG(1),        // CARRYOUT output pipeline register (0/1)
      .CREG(1),               // C input pipeline register (0/1)
      .DREG(1),               // D pre-adder input pipeline register (0/1)
      .MREG(1),               // M pipeline register (0/1)
      .OPMODEREG(1),          // Enable=1/disable=0 OPMODE input pipeline registers
      .PREG(1),               // P output pipeline register (0/1)
      .RSTTYPE("SYNC")        // Specify reset type, "SYNC" or "ASYNC"
   )
   DSP48A1_inst (
      // Cascade Ports: 18-bit (each) output: Ports to cascade from one DSP48 to another
      .BCOUT(BCOUT),           // 18-bit output: B port cascade output
      .PCOUT(PCOUT),           // 48-bit output: P cascade output (if used, connect to PCIN of another DSP48A1)
      // Data Ports: 1-bit (each) output: Data input and output ports
      .CARRYOUT(CARRYOUT),     // 1-bit output: carry output (if used, connect to CARRYIN pin of another
                               // DSP48A1)

      .CARRYOUTF(CARRYOUTF),   // 1-bit output: fabric carry output
      .M(M),                   // 36-bit output: fabric multiplier data output
      .P(P),                   // 48-bit output: data output
      // Cascade Ports: 48-bit (each) input: Ports to cascade from one DSP48 to another
      .PCIN(PCIN),             // 48-bit input: P cascade input (if used, connect to PCOUT of another DSP48A1)
      // Control Input Ports: 1-bit (each) input: Clocking and operation mode
      .CLK(CLK),               // 1-bit input: clock input
      .OPMODE(OPMODE),         // 8-bit input: operation mode input
      // Data Ports: 18-bit (each) input: Data input and output ports
      .A(A),                   // 18-bit input: A data input
      .B(B),                   // 18-bit input: B data input (connected to fabric or BCOUT of adjacent DSP48A1)
      .C(C),                   // 48-bit input: C data input
      .CARRYIN(CARRYIN),       // 1-bit input: carry input signal (if used, connect to CARRYOUT pin of another
                               // DSP48A1)

      .D(D),                   // 18-bit input: B pre-adder data input
      // Reset/Clock Enable Input Ports: 1-bit (each) input: Reset and enable input ports
      .CEA(CEA),               // 1-bit input: active high clock enable input for A registers
      .CEB(CEB),               // 1-bit input: active high clock enable input for B registers
      .CEC(CEC),               // 1-bit input: active high clock enable input for C registers
      .CECARRYIN(CECARRYIN),   // 1-bit input: active high clock enable input for CARRYIN registers
      .CED(CED),               // 1-bit input: active high clock enable input for D registers
      .CEM(CEM),               // 1-bit input: active high clock enable input for multiplier registers
      .CEOPMODE(CEOPMODE),     // 1-bit input: active high clock enable input for OPMODE registers
      .CEP(CEP),               // 1-bit input: active high clock enable input for P registers
      .RSTA(RSTA),             // 1-bit input: reset input for A pipeline registers
      .RSTB(RSTB),             // 1-bit input: reset input for B pipeline registers
      .RSTC(RSTC),             // 1-bit input: reset input for C pipeline registers
      .RSTCARRYIN(RSTCARRYIN), // 1-bit input: reset input for CARRYIN pipeline registers
      .RSTD(RSTD),             // 1-bit input: reset input for D pipeline registers
      .RSTM(RSTM),             // 1-bit input: reset input for M pipeline registers
      .RSTOPMODE(RSTOPMODE),   // 1-bit input: reset input for OPMODE pipeline registers
      .RSTP(RSTP)              // 1-bit input: reset input for P pipeline registers
   );

почти всегда достаточно просто написать

a <= b * c;

и модуль будет подоткнут сам. и там пофик как этот умножитель пишется у альтеры, и пофик, что у спартана-6 и артикса-7 разные умножители: a <= b * c; и ниипёт.