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

generate внутри case

Добрый день!

Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально.

Ниже приведен пример куска подобного кода.

gnrt2[k].add_dataa, gnrt2[k].add_datab - входы сумматоров (использовалась мегафункция сумматора); gnrt[k].mult_res- выходы умножителей (использовалась мегафункция умножителя)

    
   parameter SUM_step0=0;
   genvar k;
   reg [2:0]st;      
                                
                                 always@(posedge clk)
                                      if (rst)
                                          st=SUM_step0;
                                        else 
                                             case(st)
                                              SUM_step0: 
                                                 begin
                                                            generate
                                                                for(k=0; k<(ORDER/2); k=k+1)
                                                                    begin:gnrt3
                                                                                gnrt2[k].add_dataa=gnrt[2*k].mult_res;
                                                                                gnrt2[k].add_datab=gnrt[2*k+1].mult_res;
                                                                     end
                                                            endgenerate
                                                            st=SUM_step0;
                                                    end
                                                      default: st=SUM_step0; 
                                             endcase

 

Заранее спасибо за ответ!

Изменено пользователем Faton_11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Добрый день!

Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально.

Заранее спасибо за ответ!

Использовать generate внутри конструкции case нельзя! Так же как и внутри always блока. Вот наоборот (always внутри generate) можно.

Внутри always блока нужно использовать простой for (int ii=0; ...)

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально.

 

В данном случае можно просто закомментировать generate, endgenerate, а k объявить просто переменной целого типа. И получится обычный цикл for.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

RobFPGA и alexadmin, спасибо большое за ответы! Тогда подскажите, пожалуйста, какую штуку надо использовать, чтобы не прописывать "в лоб", как показано ниже

 

 always@(posedge clk)
                  if (rst)
                      st=SUM_step0;
                         else 
                             case(st)
                                 SUM_step0: 
                                   begin
                                                                          gnrt2[0].add_dataa=gnrt[0].mult_res;
                                                                          gnrt2[0].add_datab=gnrt[1].mult_res;

                                                                          gnrt2[1].add_dataa=gnrt[2].mult_res;
                                                                          gnrt2[1].add_datab=gnrt[3].mult_res;

                                                                          gnrt2[2].add_dataa=gnrt[4].mult_res;
                                                                          gnrt2[2].add_datab=gnrt[5].mult_res;
                                                                        default: st=SUM_step0; 
                                                                      end
                              endcase

 

, а через некую k, что-то типа такого:

gnrt2[k].add_dataa=gnrt[2*k].mult_res;
gnrt2[k].add_datab=gnrt[2*k+1].mult_res;

 

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

Изменено пользователем Faton_11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

..

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

С чего это Вы взяли что не будет?

Если for сидит внутри always то весь цикл будет проходить полностью за одно событие запускающее этот always.

Поэтому так и пишите как обычно ...

...
  SUM_step0: begin
    for (int k=0;k<MAX_K; ++k) begin 
      gnrt2[k].add_dataa=gnrt[2*k].mult_res;
      gnrt2[k].add_datab=gnrt[2*k+1].mult_res;
    end
  end

 

Удачи! Rob

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для того, чтобы операции выполнялись в одном такте, внутри always блока, обязательно использование неблокирующих присвоений (<=) будьте внимательны.

 

for(k=0; k<(ORDER/2); k=k+1) begin

gnrt2[k].add_dataa <= gnrt[2*k].mult_res;

gnrt2[k].add_datab <= gnrt[2*k+1].mult_res;

end

Изменено пользователем Mikhail_S

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Для того, чтобы операции выполнялись в одном такте, внутри always блока, обязательно использование неблокирующих присвоений (<=) будьте внимательны. ...
Необязательно! Правила использование блокирующих/неблокирущих присваиваний это из другой оперы.

Для приведенного кода результат синтеза будет одинков.

 

Удачи! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения за долгий ответ. В итоге пришлось сделать в лоб, т.к. в цикле for к экземплярам модулей, созданных в generate, нельзя обращаться через переменную, объявленную как integer.

    genvar j;
                 generate
                     for( j=0; j<(ORDER/2+1); j=j+1)
                       begin:gnrt2    
                                      reg  [39:0] add_dataa;
                                          reg  [39:0] add_datab;
                                      wire [39:0] add_res;
                                         
                                         Adder addr (add_dataa,add_datab,add_res);
                             end
                      endgenerate
//________________________________________________________________________________

genvar j;
                 generate
                     for( j=0; j<(ORDER+1); j=j+1)
                       begin:gnrt2    
                                      reg  [10:0] mult_dataa;
                                          reg  [10:0] mult_datab;
                                      wire [39:0] mult_res;
                                         
                                         Mult mlt ( mult_dataa, mult_datab, mult_res);
                             end
                      endgenerate
//________________________________________________________________________________


integer k;

always@(posedge clk)
                                      
                        case(st)
                                SUM_step0: 
                                         begin
                                            for(k=0; k<26; k=k+1)
                                                                                                                                             
                                                                                                  begin
                                                     gnrt2[k].add_dataa=gnrt[2*k].mult_res;
                                                     gnrt2[k].add_datab=gnrt[2*k+1].mult_res;
                                                                                                                                             
                                                                                                   end
                                                            
                                            st=SUM_step0;
                                        end
                                    default: st=SUM_step0; 
                                endcase

 

Но было бы очень интересно знать на будущее, как это обойти

Изменено пользователем Faton_11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

...

Но было бы очень интересно знать на будущее, как это обойти

Ох ... что за ... чудо редактор у Вас :( Найдите отличия ;)

...
localparam ADD_STG_N = ORDER/2+1;
localparam MUL_STG_N = ORDER+1;

reg  [ADD_STG_N-1:0][39:0] add_dataa;
reg  [ADD_STG_N-1:0][39:0] add_datab;
wire [ADD_STG_N-1:0][39:0] add_res;

reg  [MUL_STG_N-1:0][10:0] mult_dataa;
reg  [MUL_STG_N-1:0][10:0] mult_datab;
wire [MUL_STG_N-1:0][39:0] mult_res;

genvar gi;
generate
  for (gi=0; gi<ADD_STG_N; gi=gi+1) begin : g_add
    Adder i_add (add_dataa[gi], add_datab[gi], add_res[gi]);
  end
  for (gi=0; gi<MUL_STG_N; gi=gi+1) begin : g_mult
    Mult i_mult (mult_dataa[gi], mult_datab[gi], mult_res[gi]);
  end
endgenerate

always @(posedge clk) begin
...
  for(k=0; k<ADD_STG_N; k=k+1) begin
    add_dataa[k]=mult_res[2*k];
    add_datab[k]=mult_res[2*k+1];
  end
...
end

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...