
Подкинули мне сегодня интересную задачку. Она вроде бы не сложная, но я запутался.
Имеем входной сигнал 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;
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
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] не вектор или массив. Почему??
Спасибо!