есть две терасиковские борды с EP4CE22F17C6, на каждой из которых работает идентичный дизайн на частоте 450МГц. Сам дизайн прост, поэтому удалось выйти на такую частоту, на ней же хочется оставаться. В дизайне есть основной клок (450МГц) и счетчик по этому клоку. Счетчик двухступенчатый, первая ступень - 2-х битная, а по переполнению счетчик клочит второй счетчик (44Бит) на 450/4МГц частоте. На платах есть свои 50МГц осцилляторы, использовать внешние осцилляторы не хочу. Мне необходимо синхронизировать оба счетчика с обеих плат (пусть с какой-то фиксированной фазой) и удерживать такую синхронизацию бесконечно долго (счетчик переполняется за 40 часов, вот это для меня означает бесконечно долго).
Физически для такой синхронизации я могу задействовать не более 10 ног каждой плисины через JP3 (2x13) коннектор. Длина провода, если постараться, будет не более 10см, но ни о каких лвдсах, к сожалению, мечтать не приходится. Дополнительно хотел бы сказать, что вокруг не сильно благоприятные электромагнитные условия, то есть этот проводок между плисками, хоть я и заэкранирую, может случайно что-то словить из окружающей среды.
Реально никогда с таким не сталкивался, и прошу совета, как правильно поступить. Железо поменять не смогу - не реально.
Вижу одно из решений:
первая плисина
Код
input CLOCK_50;
inout [12:0] GPIO_2;
my_pll1 my_pll1_module(.inclk0(CLOCK_50) /*50МГц от кварца*/, .inclk1(GPIO_2[2]) /* вход 450МГц от соседней плиски*/,
.c0(GPIO_2[0]) /* 450МГц на соседнюю плиску*/, .c1(GPIO_2[1]) /* еще один выход с 450МГц клоком на соседнюю плиску*/);
wire [1:0] FastCounter;
wire MyClk;
assign FastCounter=GPIO_2[3:4];
assign MyClk=GPIO_2[0];
always @(posedge MyClk) FastCounter<=FastCounter+1;
inout [12:0] GPIO_2;
my_pll1 my_pll1_module(.inclk0(CLOCK_50) /*50МГц от кварца*/, .inclk1(GPIO_2[2]) /* вход 450МГц от соседней плиски*/,
.c0(GPIO_2[0]) /* 450МГц на соседнюю плиску*/, .c1(GPIO_2[1]) /* еще один выход с 450МГц клоком на соседнюю плиску*/);
wire [1:0] FastCounter;
wire MyClk;
assign FastCounter=GPIO_2[3:4];
assign MyClk=GPIO_2[0];
always @(posedge MyClk) FastCounter<=FastCounter+1;
вторая плисина
Код
inout [12:0] GPIO_2;
my_pll2 my_pll2_module(.inclk0(GPIO_2[0]) /*первый 450МГц вход от соседний плиски*/, .inclk1(GPIO_2[1]) /*второй 450МГц вход от соседний плиски*/,
.c0(GPIO_2[2]) /* 450МГц на соседнюю плиску*/);
wire [1:0] FastCounter;
wire MyClk;
assign FastCounter=GPIO_2[3:4];
assign MyClk=GPIO_2[2];
my_pll2 my_pll2_module(.inclk0(GPIO_2[0]) /*первый 450МГц вход от соседний плиски*/, .inclk1(GPIO_2[1]) /*второй 450МГц вход от соседний плиски*/,
.c0(GPIO_2[2]) /* 450МГц на соседнюю плиску*/);
wire [1:0] FastCounter;
wire MyClk;
assign FastCounter=GPIO_2[3:4];
assign MyClk=GPIO_2[2];
Еще в железе не проверял, но вопрошаю, пожалуйста, посоветуйте, можно ли так, и что можно еще улучшить!
Спасибо!
ИИВ