Можно я попробую парой строк кода проиллюстрировать тезисы AlexG про распределение клоков?
Было годно для симуляции, но катастрофически и непредсказуемо рушится при синтезе, как только дизайн становится сложнее :
Код:
reg [3:0] clock_div;
always @(posedge mclk) clock_div <= clock_div + 1;
wire evil_derived_clock_div16 = clock_div[3];
wire evil_derived_clock_div8 = clock_div[2];
..
always @(posedge evil_derived_clock_div16) begin
// то, что будет тактировано этим клоком разойдется по фазе с mclk и с evil_derived_clock_div8
end
always @(posedge evil_derived_clock_div8) begin
// то, что будет тактировано этим клоком разойдется по фазе с mclk и с evil_derived_clock_div16
end
Стало хорошо, годно для синтеза и устойчиво к попаданию мюонов потому, что теперь все регистры тактируется одним клоком. При синтезе достаточно только убедиться, что сигналы clock enable стабилизируются к приходу очередного фронта mclk. Это и человеку просто сделать, и Квартусу понятно, что надо оптимизировать.
Код:
reg [3:0] clock_div;
always @(posedge mclk) clock_div <= clock_div + 1;
wire clock_enable_div16 = ~|clock_div; // держится один такт пока все разряды == 0
wire clock_enable_div8 = ~|clock_div[2:0]; // держится один такт, пока 0000 или 1000
...
always @(posedge mclk)
if (clock_enable_div16) begin
// все записи во все регистры тактируются одним клоком mclk, но разрешены только раз за 16 тактов
end
always @(posedge mclk)
if (clock_enable_div8) begin
// все записи во все регистры татируются одним клоком mclk, но разрешены только раз за 8 тактов
end