Оптимизация кода для CPLD

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
R2R
Сообщения: 200
Откуда: Калуга

Сообщение R2R » 04 апр 2017, 21:19

Собственно, пишу код для XC9572XL. Сначала тренировался на XC6SLX9 - все работало и занимало меньше макроячеек, чем есть в упомянутом CPLD. В процессе переноса выяснилось, что ресурсов все-таки не хватает. Путем сокращения функционала удалось разместить код, однако любой шаг в сторону приводит к невозможности синтеза схемы.
Сейчас задействовано 32/72 макроячеек, 251/360 product terms (кстати, как это называется по-русски?) и 27/72 регистров. Если увеличить разрядность регистра cnt с 15 до 17 бит, будет задействовано на 2 регистра больше и на 6 термов меньше, а если поднять до 19 бит, то для синтеза внезапно не будет хватать 234 термов! Где здесь логичная и понятная закономерность? Подобное происходит при минимальном изменении условия в конструкции if или замене цепочки if на case (вроде как и то, и то другое в последовательность мультиплексоров должно синтезироваться, но не прокатывает). В общем, я запутался и не знаю, как тут оптимизировать.

 Код

Код: Выделить всё

module ETCC
   (
   input wire clk,
   input wire fb,
   input wire mode,      
   input wire ocd,      
     output wire [3:0] out_sgn
    );

localparam      DT = 5,
            T = 128,
            PW = 400;

reg [14:0]   cnt = 0;         
reg [8:0]   cnt_int = 0;
reg [4:0]   cnt_dt = 0;
reg [3:0]   sharm = 4'b1111;
reg [0:0]   fb_pre = 0,
      cnt_dt_inc_en = 0,
      inter_fb = 0,
      inter_gen = 0,
      fb_cx = 0,
      phase = 0,
      start = 0,
      ocd_s = 1;
         
always @ (posedge clk)
begin

cnt = cnt + 1;

if ((cnt_dt == 1)&&(fb_pre == 0)) cnt_int = cnt_int + 1;
if ((cnt >= (0-1))&&(cnt < T)) start = 1;
else start = 0;

if (cnt_int == PW) inter_fb = inter_fb ^ 1;
if (cnt == 1000) inter_gen = inter_gen ^ 1;

if (mode == 1) fb_cx = ((phase ^ fb) || cnt[6]) && inter_gen && ocd_s;
else fb_cx = cnt[6] && inter_gen && ocd_s;

if (fb_cx != fb_pre) cnt_dt_inc_en = 1;
if (cnt_dt_inc_en == 1) cnt_dt = cnt_dt + 1;

if (fb_cx > fb_pre)
   begin
   if ((cnt_dt >= 0)&&(cnt_dt < 5))
      begin
      if (start == 0) sharm = 4'b1110;
      else sharm = 4'b1111;
      end
   if ((cnt_dt >= 5)&&(cnt_dt < 15)) sharm = 4'b1111;
   if ((cnt_dt >= 15)&&(cnt_dt < 20)) sharm = 4'b1011;
   if ((cnt_dt >= 20)&&(cnt_dt < 32))
      begin
      sharm = 4'b0011;
      cnt_dt_inc_en = 0;
      cnt_dt = 0;
      fb_pre = fb_cx;
      end
   end
if (fb_cx < fb_pre)
   begin
   if ((cnt_dt >= 0)&&(cnt_dt < 5)) sharm = 4'b1011;
   if ((cnt_dt >= 5)&&(cnt_dt < 15))
      begin
      sharm = 4'b1111;
      if ((start == 1)||(inter_gen == 0))
         begin
         cnt_dt_inc_en = 0;
         cnt_dt = 0;
         fb_pre = fb_cx;
         end
      end
   if ((cnt_dt >= 15)&&(cnt_dt < 20)) sharm = 4'b1110;
   if ((cnt_dt >= 20)&&(cnt_dt < 32))
      begin
      sharm = 4'b1100;
      cnt_dt_inc_en = 0;
      cnt_dt = 0;
      fb_pre = fb_cx;
      end
      
   end 

end

assign out_sgn = sharm;

endmodule

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 1290
Откуда: Киев

Сообщение iEugene0x7CA » 05 апр 2017, 15:56

Хм, не подскажу насчет термов — Xilinx'ы не прогал ни разу, но насчет XC9572 — это мега-крохотная и супер-древняя(1998-й год :)) микрушка, я бы не использовал их для новых дизайнов или даже обучения.
Мы сейчас на EPM240 перешли, даже есть мысли поставить её в SimpleDriver, в одной из следующих версий.

R2R
Сообщения: 200
Откуда: Калуга

Сообщение R2R » 05 апр 2017, 19:57

Хм, XC9572 действительно старая, но проектов на ней в сети мало. Видать, их только как замену нескольким корпусам комбинаторной логики юзать можно. Ну ладно, попробую домучить хильку, а в следующий раз буду делать контроллер для теслы на EPM240, благо уже затарился ими :) .

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 1290
Откуда: Киев

Сообщение iEugene0x7CA » 08 апр 2017, 00:04

R2R писал(а):только как замену нескольким корпусам комбинаторной логики

Вроде, CPLD и не претендуют ни на что большее. :)
Это не замена микроконтроллеру, как многим иногда кажется, её цели — экономия пространства на платке(помещение логики в один чип) и обработка быстрых процессов, с которыми простой микроконтроллер не справится.
В жирные FPGA да, можно залить софткорный процессор, но на практике большие FPGA дороги и всегда дешевле поставить мелкую CPLD в связке с железным MCU. Менее гемморней, тоже.

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя