
Сообщение от
bigral
Это как например?
Классика это что-нибудь типа:
Код:
reg [3:0] div;
always @(posedge clk) div <= div + 1'b1;
wire clk16 = reg[3];
always @(posedge clk16)
something <= something + 1;
Все с этого начинают. Я тоже так делал и очень ворчал, почему это у меня простейший Понг не может скомпилироваться два раза подряд во что-нибудь одинаковое. Дело в том, что клоки clk и clk16 теперь фактически два разных клочных домена.
Ну и формально не запрещено взять любой сигнал и назвать его клоком:
Код:
wire weirdclk = clk1 | clk2;
always @(posedge weirdclk) somereg <= somereg + 1;
Но все поголовно учат так не делать. Если хочется, чтобы дизайн от сборки к сборке был повторим, не слишком непредсказуемо себя вел при каких-то изменениях, итд итд, надо делать все синхронно — один клок и разные clock enable:
Код:
reg [3:0] div;
always @(posedge clk) div <= div + 1'b1;
wire ce16 = ®[3:0]; // ==1 только один clk
always @(posedge clk)
if (ce16) something <= something + 1;
Код:
wire welrdce = ce1 | ce2; // ce по длительности не должны превышать период главного клока
always @(posedge clk) if (weirdce) somereg <= somereg + 1;
Клок же остается един для всех процессов.
Это с позиций FPGA. Наверное в мире CPLD, где часто приходится иметь дело с заковыристыми античными меандрами, дела обстоят иначе.