Периодически возникают те или иные вопросы, ответ на которые хочется найти тут, у спецов.
Первый вопрос:
Представим 8-разрядный счетчик, считающий по клоку. По достижению им числа 100 нужно переключиться в режим 1, по достижению 200 - в режим 2 и остаться в нем до сброса.
Раньше, в ПЛИС (в связи с избыточностью ячеек), я бы сделал так:
Код
reg [7:0]cnt;
always @(posedge clk, negedge nrst)
begin
if (~nrst) cnt <= 0;
else begin
if(cnt<200) cnt <=cnt + 1'b1;
end
end
always @*
begin
if(cnt<100) mode <= 0;
else if(cnt <200) mode <= 1;
else mode <= 2;
end
always @(posedge clk, negedge nrst)
begin
if (~nrst) cnt <= 0;
else begin
if(cnt<200) cnt <=cnt + 1'b1;
end
end
always @*
begin
if(cnt<100) mode <= 0;
else if(cnt <200) mode <= 1;
else mode <= 2;
end
Теперь, представляю, во что выльется этот код: синтезатор реализует 3 компаратора (причем для определения диапазона) из простых элементов для декодирования значения счетчика. Думаю, как упростить схему. Рождается код:
Код
reg [7:0]cnt;
always @(posedge clk, negedge nrst)
begin
if (~nrst) begin
cnt <= 0;
mode <= 0;
end
else begin
cnt <= cnt+1;
if(cnt==100 || cnt==200) mode <= mode+1;
end
end
always @(posedge clk, negedge nrst)
begin
if (~nrst) begin
cnt <= 0;
mode <= 0;
end
else begin
cnt <= cnt+1;
if(cnt==100 || cnt==200) mode <= mode+1;
end
end
Тут уже компарирование не диапазона, а конкретных значений, зато логика mode становится синхронной.
Проверил в DC - действительно, экономия по площади и кол-ву ячеек - почти в 2 раза.
Не имеет ли второй вариант каких-то подводных камней?