Faton_11 0 28 июня, 2018 Опубликовано 28 июня, 2018 (изменено) · Жалоба Добрый день! Скажите, пожалуйста, можно ли использовать 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 Заранее спасибо за ответ! Изменено 28 июня, 2018 пользователем Faton_11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 28 июня, 2018 Опубликовано 28 июня, 2018 · Жалоба Приветствую! Добрый день! Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально. Заранее спасибо за ответ! Использовать generate внутри конструкции case нельзя! Так же как и внутри always блока. Вот наоборот (always внутри generate) можно. Внутри always блока нужно использовать простой for (int ii=0; ...) Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба Добрый день! Скажите, пожалуйста, можно ли использовать generate внутри конструкции case? Квартус ругается, говорит, что end-а нет, но если закомментировать код от "generate" до "endgenerate" включительно, все нормально. В данном случае можно просто закомментировать generate, endgenerate, а k объявить просто переменной целого типа. И получится обычный цикл for. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Faton_11 0 29 июня, 2018 Опубликовано 29 июня, 2018 (изменено) · Жалоба 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, то это не будет выполнять в одном такте Изменено 29 июня, 2018 пользователем Faton_11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба Приветствую! .. Если использовать цикл 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kovrov4anin 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Для того, чтобы операции выполнялись в одном такте, внутри 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 Изменено 6 июля, 2018 пользователем Mikhail_S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Приветствую! Для того, чтобы операции выполнялись в одном такте, внутри always блока, обязательно использование неблокирующих присвоений (<=) будьте внимательны. ... Необязательно! Правила использование блокирующих/неблокирущих присваиваний это из другой оперы. Для приведенного кода результат синтеза будет одинков. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Faton_11 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Прошу прощения за долгий ответ. В итоге пришлось сделать в лоб, т.к. в цикле 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 Но было бы очень интересно знать на будущее, как это обойти Изменено 6 июля, 2018 пользователем Faton_11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Приветствую! ... Но было бы очень интересно знать на будущее, как это обойти Ох ... что за ... чудо редактор у Вас :( Найдите отличия ;) ... 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Faton_11 0 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Спасибо, Rob! :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться