|
|
  |
generate внутри case |
|
|
|
Jun 28 2018, 14:44
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 10-06-13
Пользователь №: 77 128

|
Добрый день! Скажите, пожалуйста, можно ли использовать 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 - Jun 28 2018, 14:47
|
|
|
|
|
Jun 28 2018, 15:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Faton_11 @ Jun 28 2018, 17:44)  Добрый день! Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально. Заранее спасибо за ответ! Использовать generate внутри конструкции case нельзя! Так же как и внутри always блока. Вот наоборот (always внутри generate) можно. Внутри always блока нужно использовать простой for (int ii=0; ...) Удачи! Rob.
|
|
|
|
|
Jun 29 2018, 09:16
|
Знающий
   
Группа: Свой
Сообщений: 572
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965

|
Цитата(Faton_11 @ Jun 28 2018, 17:44)  Добрый день! Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально. В данном случае можно просто закомментировать generate, endgenerate, а k объявить просто переменной целого типа. И получится обычный цикл for.
|
|
|
|
|
Jun 29 2018, 10:08
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 10-06-13
Пользователь №: 77 128

|
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 - Jun 29 2018, 10:09
|
|
|
|
|
Jun 29 2018, 10:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Faton_11 @ Jun 29 2018, 13:08)  .. Если использовать цикл 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
|
|
|
|
|
Jul 6 2018, 09:42
|
Группа: Участник
Сообщений: 9
Регистрация: 29-05-12
Пользователь №: 72 069

|
Для того, чтобы операции выполнялись в одном такте, внутри 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 - Jul 6 2018, 09:43
|
|
|
|
|
Jul 6 2018, 11:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Mikhail_S @ Jul 6 2018, 12:42)  Для того, чтобы операции выполнялись в одном такте, внутри always блока, обязательно использование неблокирующих присвоений (<=) будьте внимательны. ... Необязательно! Правила использование блокирующих/неблокирущих присваиваний это из другой оперы. Для приведенного кода результат синтеза будет одинков. Удачи! Rob.
|
|
|
|
|
Jul 6 2018, 12:22
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 10-06-13
Пользователь №: 77 128

|
Прошу прощения за долгий ответ. В итоге пришлось сделать в лоб, т.к. в цикле 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 - Jul 6 2018, 12:24
|
|
|
|
|
Jul 6 2018, 13:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Faton_11 @ Jul 6 2018, 15:22)  ... Но было бы очень интересно знать на будущее, как это обойти Ох ... что за ... чудо редактор у Вас  Найдите отличия  Код ... 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|