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

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.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация