реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Интересная задачка с generate, Вроде все просто
-=Vitaly=-
сообщение Apr 26 2007, 12:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Здравствуйте Уважаемые любители нового и интересного 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] не вектор или массив. Почему??
Спасибо!
Go to the top of the page
 
+Quote Post
Kopart
сообщение Apr 26 2007, 13:08
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(-=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"


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение Apr 26 2007, 15:33
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Цитата(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

Сообщение отредактировал -=Vitaly=- - Apr 26 2007, 16:00
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 18:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01362 секунд с 7
ELECTRONIX ©2004-2016