Jump to content
    

Снова про метастабильность, цепочки триггеров и т.д.

Это уже синхронное изменение от синхронно изменяемых сигналов... как тут может влезть мета стаибльность?

 

Для ответа на этот вопрос надо видеть, что приходит на ВХОДЫ reg_wr и reg_adr, а не то, на что влияют их выходы.

Share this post


Link to post
Share on other sites

Так... Вот о чем я подумал...

 

допустим есть какой-то внешний сигнал DataFromOut и сигнал что он изменился DataFromOutChange, меняется он по какому-то левому клоку.

 

 

есть ли разница с точки зрения защиты от мета стабильности в 2 описаниях

 

 

1.

reg in1 = 0;
reg in2 = 0;
reg [10:0] Data = 0;
always @(posedge clk)
begin
    in2 <= in1;
    in1 <= DataFromOutChange;

    if(in2 == 0)
      Data <= DataFromOut;
end

 

и

 

2.

reg in1 = 0;
reg in2 = 0;
reg [10:0] Data1 = 0;
reg [10:0] Data2 = 0;
reg [10:0] Data = 0;
always @(posedge clk)
begin
    in2 <= in1;
    in1 <= DataFromOutChange;

    Data2 <= Data1;
    Data1 <= DataFromOut;

    if(in2 == 0)
      Data <= Data2;
end

 

у меня сделано по первому варианту. По приходу данных у меня появляется флаг что они пришли, это флаг асинхронен моему клоку. Я его протаскиваю через 2 триггера, тем временем пришедшие данные так и лежат в сдвиговом регистре куда они собирались. И когда прошедший через 2 триггера сигнал показывает что данные есть, я защелкиваю данные во входной регистр, который выведен на всю схему. Достаточно ли этого или что-то тут может быть? Надо ли данные тоже тащить через цепочку триггеров?

Share this post


Link to post
Share on other sites

Данные не надо тащить через цепочку триггеров, так как, как я понял, пока сигнал готовности проходит по цепочке, они измениться уже не могут. Если это не так, то надо вообще в принципе все по-другому делать.

 

А почему "if (in2 == 0)" ? Признак, что данные готовы, это нулевой уровень? Вот тут большое подозрение есть, что какой-то косяк имеется, так как никакой гарантии, что это будет длиться 1 такт, нету.

Share this post


Link to post
Share on other sites

косяк в приведенном месте, я опечатался когда пример в форум писал....

 

В целом сработала китайская (ну или чья он там) мудрость. Трудно найти черную кошку в темной комнате, особенно если ее там нет.

 

Я нашел косяк, и как всегда если что-то происходит крайне странное, то сделано что-то крайне тупое... Когда-то я хотел проверить не будет ли схема быстрее если один модуль будет работать не на 100 МГц, а на 50, для этой проверки сделал тупо

 

reg half_clk;

always @(posedge clk)

half_clk <= ~ half_clk;

 

и подал на модуль этот half_clk.

 

не знаю, что было потом, может меня отвлекли или еще что-то. Но почему-то оно так и осталось. В итоге этот модуль весь работал не от основного клока, а от этой кривухи, которая конечно же дико сдвинута от обычного клока, а разводясь еще по огромному модулю все усугубляется...

 

Блин сколько же я людей напряг.... простите мне очень стыдно... Я автор мета стабильности которая меня мучала :))), какой я молодец...

 

однако у меня остался еще один вопрос

 

у меня есть констраин

NET "clk_pin" TNM_NET = clk_pin;

TIMESPEC TS_clk_pin = PERIOD "clk_pin" 20 ns HIGH 50%;

 

это входной клок 50 МГц. Он идет на PLL, где становится 100 МГц, и среда сама сделал констраин

 

TS_DCM_CLK_Inst_clk2x = PERIOD TIMEGRP "DCM_CLK_Inst_clk2x" TS_clk_pin / 2 HIGH 50%;

 

в ходе разводки для этого констраина пишется Minimum period is 9.553ns.

 

я добавил свой констраин

NET "glb_clk" TNM_NET = glb_clk;

TIMESPEC TS_glb_clk = PERIOD "glb_clk" 10 ns HIGH 50%;

 

это как раз тот клок что выходит с PLL, и для него получилось

Minimum period is 3.124ns.

 

вот я чего-то не понимаю, или меня где-то кидают? Что я не так написал в констраинах?

 

 

 

 

Share this post


Link to post
Share on other sites

reg half_clk;

always @(posedge clk)

half_clk <= ~ half_clk;

 

и подал на модуль этот half_clk.

 

Кстати, такое конечно совсем не айс, но и к проблемам не должно приводить. Чтобы оно корректно работало, надо, чтобы было включено по полной программе "automatic hold time correction" - в разных средах опции называются немного по-разному и имеют разные варианты установок, но суть одна, чтобы выдерживала холды на переходах с основного клока не генерированный клок. И следить за рапортом STA в части холдов. Хотя, именно в xilinx, я не уверен, что это есть, там как помнится проблемы с холдами.

 

вот я чего-то не понимаю, или меня где-то кидают? Что я не так написал в констраинах?

Скорее что-то меняется в разводке из-за каких то там чего-то там. Например меняется клоковая цепь - разводится глобальной или локальными/региональными. Это надо уже конкретно смотреть отчет STA в обоих случаях по critical path, там и видно будет, кто и где "кидает".

Share this post


Link to post
Share on other sites

но и к проблемам не должно приводить.

не должно, а приводит:) Думаю что с некоторыми дополнительными телодвижениями оно бы и срослось, но я то их не делал. Ну и опять же частота работы блока в 2 раза меньше стала, тоже могло интересно получится, я то планировал на ту же частоту...

 

скорее что-то меняется в разводке из-за каких то там чего-то там

оба констраина одновременно существуют, вот....

 

в репорте напротив автоматом созданого setup и hold стоит, а напротив моего period. Может в этом отличие... разные параметры оценены...

Share this post


Link to post
Share on other sites

Ну и опять же частота работы блока в 2 раза меньше стала, тоже могло интересно получится, я то планировал на ту же частоту...

Ну да, это обычно фатально.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...