Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интересная задачка с generate
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
-=Vitaly=-
Здравствуйте Уважаемые любители нового и интересного smile.gif

Подкинули мне сегодня интересную задачку. Она вроде бы не сложная, но я запутался.

Имеем входной сигнал ADC_DATA_IN[7:0] , адрес ADR_CLUSTER, и сигнал резрешения записи AGC_MAX_WR_EN. Также имеется 32 MAX_DATA_REG регистра [7:0], которые адрсуются ADR_CLUSTER.
Задача взять значение MAX_DATA_REG[ADR_CLUSTER], сравнить его со входным ADC_DATA_IN и если
ADC_DATA_IN больше переписать по AGC_MAX_WR_EN значение MAX_DATA_REG[ADR_CLUSTER].

В принципе все довольно просто
Код
wire [7:0] MAX_REG_IN;
wire [7:0] MAX_DATA=MAX_DATA_REG[ADR_CLUSTER];

assign MAX_REG_IN=(ADC_DATA_IN>MAX_DATA) ? ADC_DATA_IN: MAX_DATA;

always@(posedge CLK)
if (AGC_MAX_WR_EN)
MAX_DATA_REG[ADR_CLUSTER]<=MAX_REG_IN;


А вот как сделать то же самое с generate используя "примитив". На сканирующую цепочку смотреть не нужно. D_FLIP обычный регистр с CLK_EN;

Код
genvar k;
wire  AGC_MAX_WR [0:32];
    
wire [7:0] MAX_REG_IN [0:32];

wire [7:0] MAX_DATA_REG [0:32];

wire [7:0] MAX_DATA=MAX_DATA_REG[ADR_CLUSTER];

assign AGC_MAX_WR[ADR_CLUSTER]=AGC_MAX_WR_EN;    
// формирую на каждый регистр свой enable????    
    

generate for(k=0;k<32;k=k+1)
    begin:FR_BLOCK    
    assign     MAX_REG_IN[k]=(ADC_DATA_IN>MAX_DATA) ? ADC_DATA_IN: MAX_DATA;    
    end
endgenerate    
// размножаю значение MAX_REG_IN, чтобы завести на все регистры одновременно

generate for(k=0;k<32;k=k+1) begin: max_reg_gen    
D_FLIP #(
    .N(8))
MAX_DATA_REG (.FREEZE(FREEZE),
    .SCAN_EN(SCAN_EN),
    .SCAN_IN(scan_chain[k]),
    .SCAN_OUT(scan_chain[k+1]),
    .nRESET(nRESET),
    .CLK(CLK),
    .CLK_EN(AGC_MAX_WR[k]),
    .D(MAX_REG_IN[k]),
    .Q(MAX_DATA_REG[k])
);    
end
endgenerate


Компилятор ругается и говорит, что MAX_DATA_REG[k] не вектор или массив. Почему??
Спасибо!
Kopart
Цитата(-=Vitaly=- @ Apr 26 2007, 13:11) *
Код
genvar k;
wire  AGC_MAX_WR [0:32];
    
wire [7:0] MAX_REG_IN [0:32];

wire [7:0] MAX_DATA_REG [0:32];

wire [7:0] MAX_DATA=MAX_DATA_REG[ADR_CLUSTER];

assign AGC_MAX_WR[ADR_CLUSTER]=AGC_MAX_WR_EN;    
// формирую на каждый регистр свой enable????    
    

generate for(k=0;k<32;k=k+1)
    begin:FR_BLOCK    
    assign     MAX_REG_IN[k]=(ADC_DATA_IN>MAX_DATA) ? ADC_DATA_IN: MAX_DATA;    
    end
endgenerate    
// размножаю значение MAX_REG_IN, чтобы завести на все регистры одновременно

generate for(k=0;k<32;k=k+1) begin: max_reg_gen    
D_FLIP #(
    .N(8))
MAX_DATA_REG (.FREEZE(FREEZE),
    .SCAN_EN(SCAN_EN),
    .SCAN_IN(scan_chain[k]),
    .SCAN_OUT(scan_chain[k+1]),
    .nRESET(nRESET),
    .CLK(CLK),
    .CLK_EN(AGC_MAX_WR[k]),
    .D(MAX_REG_IN[k]),
    .Q(MAX_DATA_REG[k])
);    
end
endgenerate


Компилятор ругается и говорит, что MAX_DATA_REG[k] не вектор или массив. Почему??
Спасибо!

Если это в одном файле то совпадает имя wire и примитива "MAX_DATA_REG"
-=Vitaly=-
Цитата(NiOS @ Apr 26 2007, 13:08) *
Если это в одном файле то совпадает имя wire и примитива "MAX_DATA_REG"

Спасибо, действительно, это первая проблема.

А еще оказалось неправильно сделано формирование CLK_EN для регистров

Исправил так:

Код
genvar k;
wire [7:0] MAX_REG_IN;

wire [7:0] MAX_DATA_REG [0:32];

wire [7:0] MAX_DATA=MAX_DATA_REG[ADR_CLUSTER];


generate for(k=0;k<32;k=k+1) begin: max_reg_gen    
D_FLIP #(
    .N(8))
MAX (.FREEZE(FREEZE),
    .SCAN_EN(SCAN_EN),
    .SCAN_IN(scan_chain[k]),
    .SCAN_OUT(scan_chain[k+1]),
    .nRESET(nRESET),
        .SYNHR_RESET(SYNHR_RESET),
    .CLK(CLK),
    .CLK_EN(ADR_CLUSTER==k && AGC_MAX_WR_EN),
    .D(MAX_REG_IN),
    .Q(MAX_DATA_REG[k])
);    
end
endgenerate


Вроде заработало, будем тестить дальше

Пришлось еще добавить 1 резет, для установки регистров в 0.
Усе пашет!
Спасибо всем, особенно NiOS
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.